OpenID ConnectOIDC)是构建在 OAuth 2.0 之上的身份认证协议,它让客户端可以从身份提供者获得可验证的 ID Token,从而知道当前登录用户是谁。

核心问题

OAuth 2.0 主要解决“第三方应用能否代表用户访问资源”的授权问题,不直接定义“用户身份如何表达”。OIDC 在 OAuth 的授权码、重定向、客户端注册和 token 交换机制上增加身份层,让业务系统可以用标准方式接入 SSO(单点登录)

核心机制

OIDC 里常见对象如下:

对象含义
End User实际用户
Relying Party依赖 OIDC 登录的应用,也叫 OIDC client
OpenID ProviderOIDC IdP,负责认证并签发 ID Token
ID Token说明用户身份和登录上下文的签名 token
UserInfo Endpoint可选接口,用 access token 查询用户资料

授权码流程的骨架是:

  1. 客户端把浏览器重定向到 IdP,带上 client_idredirect_uriscope=openidstatenonce
  2. IdP 认证用户,并确认客户端请求。
  3. IdP 把浏览器带回 redirect_uri,附上一次性 code
  4. 客户端用 code 和客户端凭据向 token endpoint 换取 token。
  5. 客户端验证 ID Token 签名和声明。

scope=openid 是 OIDC 与普通 OAuth 授权请求的关键差异。没有它,授权服务器可能只返回访问令牌,不返回 ID Token。

工程用途

  • 给管理后台、SaaS、内部平台接入统一登录。
  • 在多个系统之间共享身份,不共享密码。
  • 把企业目录、MFA、账号生命周期和审计集中到 IdP。
  • 支持移动端、Web 端、CLI 和服务端应用的标准登录流程。

边界与常见坑

  • OIDC 是认证层,不是完整权限模型:业务权限仍要在应用内建模。
  • 必须验证 statenoncestate 防 CSRF,nonce 把 ID Token 绑定到当前登录请求。
  • 不能只解码 JWT:Base64 解码只能看到内容,必须做 验签 和声明检查。
  • 回调地址要精确匹配:通配过宽可能导致 code 被发到攻击者控制的地址。
  • 不要混淆 ID Token 和 access token:它们的接收方、用途和校验规则不同。

相关术语