| authorization_code grant 流程:client_id=app123, redirect_uri=https://example.com/callback, scope=openid profile | 流程图:用户浏览器 → 授权服务器(/authorize?response_type=code&client_id=app123&redirect_uri=...&scope=openid+profile)→ 用户登录并授权 → 授权服务器返回 code 至 redirect_uri → 客户端用 code 向 /token 换取 access_token(附带 client_secret)→ 返回 access_token + refresh_token(可选)。 | 常规:授权码模式是最常用、最安全的 grant,适合有后端的 Web 应用。此示例覆盖了标准参数和完整交互步骤。 |
| client_credentials grant 流程:client_id=service-bot, client_secret=secret456, scope=read write | 流程图:客户端直接向 /token 发送 POST 请求(grant_type=client_credentials, client_id=service-bot, client_secret=secret456, scope=read+write)→ 授权服务器验证客户端身份 → 返回 access_token(无 refresh_token)。 | 常规:客户端凭证模式用于机器对机器(M2M)通信,无需用户参与。注意 scope 通常由服务器预定义,客户端请求的 scope 可能被截断或忽略。 |
| implicit grant 流程:client_id=spa-app, redirect_uri=https://myapp.com/callback, response_type=token, scope=email | 流程图:用户浏览器 → 授权服务器(/authorize?response_type=token&client_id=spa-app&redirect_uri=...&scope=email)→ 用户登录并授权 → 授权服务器直接返回 access_token 在 URL 片段(#access_token=...&token_type=Bearer&expires_in=3600)→ 客户端从 URL 片段中提取 token。 | 边界:implicit grant 已不推荐使用(安全风险),但仍在一些旧版 SPA 中出现。注意 access_token 暴露在浏览器 URL 中,且无 refresh_token。 |
| resource owner password credentials grant 流程:username=user@example.com, password=myPass123!, client_id=legacy-app, scope=offline_access | 流程图:客户端向 /token 发送 POST 请求(grant_type=password, username=user@example.com, password=myPass123!, client_id=legacy-app, scope=offline_access)→ 授权服务器验证用户名密码和客户端身份 → 返回 access_token + refresh_token(若 scope 包含 offline_access)。 | 边界:密码模式仅适用于高度信任的客户端(如官方第一方应用),且要求用户直接提供密码。offline_access scope 会触发 refresh_token 发放,但需注意 token 存储安全。 |
| authorization_code grant 但 redirect_uri 与注册不匹配:client_id=app123, redirect_uri=https://evil.com/callback | 流程图:用户浏览器 → 授权服务器(/authorize?response_type=code&client_id=app123&redirect_uri=https://evil.com/callback)→ 授权服务器验证 redirect_uri → 发现与注册的 redirect_uri 不匹配 → 返回错误(invalid_request 或 redirect_uri_mismatch)。 | 易错:redirect_uri 必须与客户端注册时完全一致(包括协议、域名、路径),否则授权服务器会拒绝请求。这是防止授权码窃取的关键安全机制。 |
| authorization_code grant 但 code 已过期或重复使用:client_id=app123, code=expired_or_reused_code_xyz | 流程图:客户端向 /token 发送 POST 请求(grant_type=authorization_code, code=expired_or_reused_code_xyz, ...)→ 授权服务器验证 code → 发现 code 已过期或已被使用 → 返回错误(invalid_grant)。 | 易错:授权码是一次性且有时效的(通常几分钟)。重复使用或过期的 code 会导致 invalid_grant 错误。客户端应妥善处理此错误并提示用户重新授权。 |
| client_credentials grant 但 scope 包含用户级权限(如 openid):client_id=service-bot, scope=openid profile | 流程图:客户端向 /token 发送 POST 请求(grant_type=client_credentials, scope=openid+profile)→ 授权服务器检查 scope → openid 和 profile 通常需要用户上下文,客户端凭证模式不支持 → 服务器返回错误(invalid_scope)或静默忽略不支持的 scope。 | 易错:客户端凭证模式只能请求与客户端本身相关的 scope(如 API 访问),不能请求需要用户授权的 scope(如 openid, profile, email)。开发者常误配 scope 导致错误。 |