这两个词经常被混着说,但它们回答的是两个不同的问题。
一句话区分
- OAuth 2.0:授权框架。回答「这个应用能代表用户做什么」。
- OIDC:构建在 OAuth 2.0 之上的认证层。回答「这个人是谁」。
OIDC 在 OAuth 流程中额外引入了 id_token,一个包含身份声明的 JWT。有了它,客户端才能确认登录者身份;仅靠 access_token 是做不到的。
为什么不能拿 access_token 当身份证
访问令牌是给资源服务器用的,它的受众(audience)是 API,不是客户端。把令牌解析后当作用户信息使用,会带来两个问题:令牌可能是不透明字符串无法解析;即使可解析,受众校验也会失效。
判断方式:如果这个令牌是发给 API 的,客户端就不该拿它来证明用户身份。
该选哪种授权模式
| 场景 | 推荐模式 |
|---|---|
| 有后端的 Web 应用 | 授权码模式 |
| SPA / 移动端 | 授权码 + PKCE |
| 服务间调用 | 客户端凭据模式 |
| 设备无浏览器 | 设备授权模式 |
隐式模式(Implicit)已经不再推荐:令牌直接出现在 URL 片段里,泄露面太大。
落地检查清单
- 回调地址是否精确白名单,而非通配
- 是否校验
state与 PKCE 的code_verifier - 令牌有效期与刷新策略是否合理
- 作用域是否按最小权限授予