知识库

OAuth 2.0 和 OpenID Connect(OIDC)有什么区别

发布

一句话:OAuth 2.0 解决“授权第三方访问资源”,OpenID Connect 解决“告诉应用用户是谁”。OIDC 是建立在 OAuth 2.0 之上的。

OAuth 2.0 解决的是授权

设想一个打印照片的网站想读取您网盘里的照片。最糟糕的做法是让您把网盘密码告诉它。OAuth 2.0 的做法是:打印网站把您带到网盘的授权页,您登录网盘并同意“允许读取照片”,网盘发给打印网站一张访问令牌(Access Token),打印网站拿着令牌去读照片。打印网站自始至终不知道您的密码,而且令牌只能读照片、过一段时间就失效,您也可以随时撤销。

注意,这个过程里打印网站拿到的只是“读照片的权限”,OAuth 2.0 本身并没有规定怎么告诉打印网站“这个用户是谁”。

OIDC 在 OAuth 2.0 上加了身份

很多应用用 OAuth 2.0 做“第三方登录”:拿到 Access Token 后再去调用一个“获取用户信息”的接口。问题是每家的接口都不一样,而且 Access Token 本来不是给客户端看的,用它来证明身份并不安全。

OpenID Connect 把这件事标准化了:授权时多请求一个 openid 范围,认证服务器除了 Access Token 还会返回一个 ID Token。ID Token 是一个签了名的 JWT,里面写明了用户标识、签发方、受众、签发和过期时间,应用验签后就能确认用户身份。OIDC 还规定了标准的用户信息接口、发现文档(/.well-known/openid-configuration)和登出方式。

ID Token 和 Access Token 的区别

  • ID Token 是给客户端应用看的,用来确认“谁登录了”;不应该拿它去调用 API。
  • Access Token 是给资源服务器(API)看的,用来确认“这个请求有没有权限”;客户端不应该解析它的内容来判断用户身份。
  • Refresh Token 用来在 Access Token 过期后换新的,不需要用户重新登录。

该用哪种授权模式

  • Web 应用、单页应用、移动 App:授权码模式加 PKCE。这是目前推荐的默认选择,OAuth 2.1 也把它作为基础。
  • 服务之间调用、没有用户参与:客户端凭证模式。
  • 电视、命令行工具等不方便输入的设备:设备授权模式(RFC 8628)。
  • 隐式模式和密码模式:已经不推荐使用。

什么时候用 OAuth,什么时候用 OIDC

如果您的目的是“让用户登录我的应用”,用 OIDC。如果是“让我的应用代表用户调用另一个服务的 API”,用 OAuth 2.0 拿 Access Token。实际上大多数场景两者同时发生:用户通过 OIDC 登录,应用拿到的 Access Token 再用于调用后端 API。AI 智能体调用 MCP 服务时用的也是 OAuth 2.0 这一套,只是多了动态客户端注册、资源指示等扩展。

Casdoor 对 OAuth 2.0 和 OIDC 的支持

Casdoor 是完整的 OAuth 2.0 和 OpenID Connect 认证服务器,支持授权码模式加 PKCE、客户端凭证、刷新令牌、设备授权、Token Exchange、DPoP 和 JWT 客户端认证,提供标准的发现文档和 JWKS,主流框架用通用的 OIDC 客户端库就能对接,也可以用 Casdoor 的官方 SDK。

相关方案

延伸阅读