OpenID Connect(OIDC)是构建在 OAuth 2.0 之上的身份认证协议,它让客户端可以从身份提供者获得可验证的 ID Token,从而知道当前登录用户是谁。
核心问题
OAuth 2.0 主要解决“第三方应用能否代表用户访问资源”的授权问题,不直接定义“用户身份如何表达”。OIDC 在 OAuth 的授权码、重定向、客户端注册和 token 交换机制上增加身份层,让业务系统可以用标准方式接入 SSO(单点登录)。
核心机制
OIDC 里常见对象如下:
| 对象 | 含义 |
|---|---|
| End User | 实际用户 |
| Relying Party | 依赖 OIDC 登录的应用,也叫 OIDC client |
| OpenID Provider | OIDC IdP,负责认证并签发 ID Token |
| ID Token | 说明用户身份和登录上下文的签名 token |
| UserInfo Endpoint | 可选接口,用 access token 查询用户资料 |
授权码流程的骨架是:
- 客户端把浏览器重定向到 IdP,带上
client_id、redirect_uri、scope=openid、state、nonce。 - IdP 认证用户,并确认客户端请求。
- IdP 把浏览器带回
redirect_uri,附上一次性code。 - 客户端用
code和客户端凭据向 token endpoint 换取 token。 - 客户端验证 ID Token 签名和声明。
scope=openid 是 OIDC 与普通 OAuth 授权请求的关键差异。没有它,授权服务器可能只返回访问令牌,不返回 ID Token。
工程用途
- 给管理后台、SaaS、内部平台接入统一登录。
- 在多个系统之间共享身份,不共享密码。
- 把企业目录、MFA、账号生命周期和审计集中到 IdP。
- 支持移动端、Web 端、CLI 和服务端应用的标准登录流程。
边界与常见坑
- OIDC 是认证层,不是完整权限模型:业务权限仍要在应用内建模。
- 必须验证
state和nonce:state防 CSRF,nonce把 ID Token 绑定到当前登录请求。 - 不能只解码 JWT:Base64 解码只能看到内容,必须做 验签 和声明检查。
- 回调地址要精确匹配:通配过宽可能导致 code 被发到攻击者控制的地址。
- 不要混淆 ID Token 和 access token:它们的接收方、用途和校验规则不同。