OIDC身份认证

wen IT资讯 27

本文目录导读:

OIDC身份认证

  1. 核心定义
  2. 为什么需要 OIDC?
  3. 关键概念(术语表)
  4. 核心流程(最常用的授权码模式)
  5. ID Token(JWT)的典型内容
  6. OIDC 相对于传统方案的优势
  7. 常用实现库
  8. 一些坑点与注意事项

这是一份关于 OIDC(OpenID Connect,开放ID连接) 身份认证的全面解析,OIDC 是现代互联网和云原生应用中最主流的身份认证协议,广泛应用于 Google、GitHub、Microsoft 等第三方登录场景。

核心定义

OIDC 是基于 OAuth 2.0 协议之上的一个身份认证层。

  • OAuth 2.0:主要解决 授权 问题(“你能访问我的哪些数据?”)。
  • OIDC:在 OAuth 2.0 的基础上增加了 认证 功能(“你是谁?”)。

OIDC = OAuth 2.0 + 用户身份信息

为什么需要 OIDC?

在 OAuth 2.0 中,我们通常只获得一个 Access Token(访问令牌),用于调用 API 获取资源,但 Access Token 本身不告诉我们用户是谁,OIDC 引入了 ID Token(身份令牌),这是一种 JWT(JSON Web Token) 格式的令牌,里面直接包含了用户的身份信息(如 ID、姓名、邮箱等)。

关键概念(术语表)

术语 全称 解释
OP OpenID Provider 负责认证用户并颁发 ID Token 的服务器(如 Google、Azure AD、Auth0)。
RP Relying Party 依赖方,即使用 OP 进行用户登录的 Web 应用或移动应用。
ID Token 身份令牌 由 OP 签发的 JWT,包含用户身份信息(isssubaudexp 等)。
UserInfo Endpoint 用户信息端点 OP 提供的 API 接口,RP 可以用 Access Token 获取更详细的用户信息。
Claim 声明 ID Token 中的字段(键值对),如 nameemailsub 等。
Scope 范围 权限定义,OIDC 核心范围是 openid,其他如 profileemailaddress

核心流程(最常用的授权码模式)

这是 OIDC 最安全、最常用的流程(使用浏览器 + 后端服务器)。

  1. 用户点击“通过 XXX 登录”:用户在 RP(你的应用)点击按钮,浏览器被重定向到 OP(如 Google)。
  2. 请求认证:浏览器向 OP 发送请求,包含:
    • client_id:你的应用在 OP 注册时获得的 ID。
    • redirect_uri:认证成功后跳转回你应用的地址。
    • response_type=code:指定使用授权码模式。
    • scope=openid profile email:请求获取身份信息和用户资料。
  3. 用户登录并授权:用户在 OP 页面上输入账号密码,并同意授权(如果首次登录)。
  4. OP 返回 Authorization Code(授权码):OP 将浏览器重定向回 redirect_uri,并在 URL 参数中附带上一个临时的 code
  5. RP 用 Code 换取令牌:你的后端服务器拿着这个 code,加上 client_secret(你的应用密码),直接与 OP 的后端通信。
  6. OP 返回令牌
    • ID Token(JWT 格式):证明用户身份,解码后可以看到 sub(用户唯一标识)、nameemail 等。
    • Access Token:用于后续访问 UserInfo Endpoint 或 OP 的其他授权资源。
    • Refresh Token(可选):用于在 Access Token 过期后刷新。
  7. RP 验证 ID Token:你的后端验证 JWT 签名、iss(签发者)、aud(受众,是否为你自己)、exp(过期时间)。
  8. 获取用户信息(可选):如果需要更多信息,你可以用 Access Token 调用 OP 的 /userinfo 端点。
  9. 登录完成:你的后端建立自己的 Session(会话),返回给前端,用户成功登录。

ID Token(JWT)的典型内容

一个解码后的 ID Token 可能长这样:

{
  "iss": "https://accounts.google.com", // 签发者
  "sub": "1234567890",                   // 用户唯一ID (Subject)
  "aud": "your-client-id",              // 受众,必须是你的应用ID
  "exp": 1735689600,                    // 过期时间 (Unix时间戳)
  "iat": 1735686000,                    // 签发时间
  "auth_time": 1735686000,              // 用户认证时间
  "nonce": "随机字符串",                 // 抗重放攻击(可选)
  "name": "张三",
  "email": "zhangsan@example.com",
  "email_verified": true                // 邮箱是否验证
}

关键验证点:你的应用必须验证 JWT 签名(使用 OP 提供的 JWKS(JSON Web Key Set)公钥),确保它确实是 OP 签发的,aud 是你自己的 client_idexp 未过期。

OIDC 相对于传统方案的优势

  1. 标准统一:无需为每个第三方登录都自定义 OAuth 流程,作为一个行业标准,OIDC 被几乎所有主流平台支持。
  2. 安全可靠:基于 JWT 的数字签名保证了 ID Token 的防篡改,授权码模式确保 Token 只在后端传输,不暴露给前端。
  3. 单点登录:用户登录一次 OP(如 Google),即可访问所有注册了该 OP 的其他应用(RP),这就是 SSO(单点登录,Single Sign-On) 的核心原理。
  4. 减少开发工作量:无需自己实现密码哈希、重置、多因素认证等复杂功能,直接交给 OP 即可,你就可以专注于核心业务开发。

常用实现库

  • Node.jspassport + passport-azure-adopenid-client
  • Java:Spring Security OAuth2 / OIDC 支持
  • PythonAuthlibpython-jose
  • Gocoreos/go-oidc
  • .NET:Identity Server (作为 OP) 或 Microsoft.AspNetCore.Authentication.OpenIdConnect (作为 RP)

一些坑点与注意事项

  1. 始终在服务器端验证 ID Token:不要在客户端(前端)直接解码 JWT 并将其视为用户身份的唯一凭证,前端的代码很容易被篡改。
  2. 确保 nonce 的保护作用:在授权码模式中,虽然 nonce 不强制,但在 Implicit 模式(已不建议使用)中,nonce 对防止重放攻击非常重要,现在推荐使用 PKCE(Proof Key for Code Exchange,代码交换证明密钥) 增强授权码模式的安全性。
  3. 理解 Scope 的粒度:请求 profileemail 作用域前,确保用户确实需要授权这些信息。
  4. 注意 JWK 轮换:OP 有时会更换其签名密钥(JWKS),你的应用应有相应的缓存策略,并能处理“旧密钥签名失败”的情况,自动重新获取最新密钥。
  5. 用户状态同步:OIDC 解决了“认证”问题,但用户的角色、权限等通常需要你自行管理(可通过 Access Token 调用你自己的 API 或通过 JWT 的 custom claims 实现)。

OIDC 是现代互联网身份认证的工业标准,它通过 JWT 形式的 ID Token 提供了一种可验证、安全、标准化的身份信息传递方式。

如果你正在搭建一个需要“使用 Google/Microsoft/GitHub 登录”的应用,或者需要实现企业级单点登录(SSO),OIDC 绝对是最佳选择。

上一篇SameSite属性

下一篇OAuth2授权流

抱歉,评论功能暂时关闭!