avatar

OAuth 2.0 与 OIDC (OpenID Connect) 学习笔记

一、OAuth 2.0 授权码模式 vs. 实际登录场景

1、标准的 OAuth 2.0 授权码模式

  • 定义:OAuth 2.0 是一个授权框架,解决的是“委托授权”问题(即:应用 A 能否访问用户在应用 B 的数据)。
  • 核心产物Access Token(访问令牌)。
  • Token 生成者:必须由授权服务器(如微信、Google)生成。
    • 原因:资源服务器只信任授权服务器。如果由第三方(客户端)自己生成,资源服务器无法验证其真伪,安全体系将崩溃。
  • Token 持有者:第三方应用(客户端)。
  • Token 用途:第三方应用拿着 Token 去访问资源服务器的接口。

2、实际企业登录场景(混合模式)

  • 场景描述:公司新买的网站 P 接入公司统一登录平台。
    1. 网站 P 通过 OAuth 2.0 获取 code
    2. code 换取用户信息。
    3. 网站 P 自己生成 Token,建立本地会话。
  • 定性:这属于“基于 OAuth 2.0 的身份认证 + 本地会话管理”
    • 前半段是标准的 OAuth 2.0(解决“你是谁”)。
    • 后半段是业务逻辑(解决“在自家网站如何保持登录状态”)。
  • 为什么第三方要自己生成 Token?
    • 性能:避免每次请求都去统一登录平台验证。
    • 解耦:避免统一登录平台成为单点瓶颈。

二、OpenID Connect (OIDC) 协议详解

1、OIDC 是什么?

  • 定义:OIDC = OAuth 2.0 + 身份层
  • 目的:在 OAuth 2.0 的基础上,专门解决认证问题,确认用户身份。
  • 核心产物ID Token

2、OIDC 的核心:ID Token

  • 格式:通常为 JWT (JSON Web Token)
  • 作用:相当于一张“数字身份证”。
    • Access Token:像一把钥匙,用于开资源服务器的门(获取数据)。
    • ID Token:像一张身份证,给第三方应用(网站 P)看,证明“我是谁”。
  • 内容:包含用户身份信息(如 sub 用户ID, email, name 等)。

3、OIDC 登录流程

  1. 发起请求:网站 P 跳转至授权服务器,Scope 中必须包含 openid
  2. 用户授权:用户在授权服务器登录并同意。
  3. 发放令牌:网站 P 用 code 换取 Token。
    • 返回 access_token(用于访问数据)。
    • 返回 id_token(用于确认身份)。
  4. 验证身份
    • 网站 P 拿到 id_token
    • 验签:确认 Token 确实由授权服务器签发(防伪造)。
    • 解码:直接读取 JWT 中的用户信息(无需额外请求接口)。
  5. 建立会话:网站 P 确认身份后,生成自己的本地 Token 完成登录。

三、ID Token 的验证与公钥机制

1、为什么需要公钥?

  • ID Token 是 JWT 格式,包含签名。
  • 为了防止黑客伪造 Token,网站 P 必须验证签名。
  • 验证签名需要公钥

2、公钥的获取:JWKS 与 Discovery

  • 公钥存放:授权服务器提供一个公开的 URL,即 JWKS 端点(如 /.well-known/jwks.json)。
  • 获取流程(自动化)
    1. 网站 P 访问 /.well-known/openid-configuration (Discovery Document)。
    2. 获取配置文件,从中读取 jwks_uri
    3. 访问 jwks_uri 获取公钥集合(JWKS)。
    4. 本地缓存公钥,用于验证 Token。
  • 开发者配置:通常只需配置 issuer-uri,客户端库会自动处理上述流程。

3、公钥的安全性

  • 必须公开:任何人都可以访问 JWKS 端点,无需认证。
  • 原理:公钥用于验证,私钥用于签名。只要私钥不泄露,公钥公开无风险。
  • 防御中间人攻击
    • 通过 Issuer 校验:比对配置文件中的 issuer 与本地配置是否一致。
    • 强制使用 HTTPS:防止传输过程被篡改。

四、ID Token 的安全性问题

1、拦截 ID Token 的风险

  • 事实:ID Token 是 Base64 编码的,任何人(包括黑客)拿到后都可以解码看到里面的用户信息。
  • 结论:ID Token 不加密,只防篡改。

2、为什么不加密 ID Token?

  1. 性能:非对称解密消耗大,验签速度快。
  2. 内容非敏感:ID Token 里只放标识符(User ID),不放敏感信息(密码、手机号)。

3、如何防止拦截带来的危害?

  1. HTTPS (TLS/SSL)
    • 这是底线。HTTPS 保证传输过程加密,黑客拦截到的是乱码,拿不到原始 Token。
  2. 短期有效期
    • ID Token 有效期极短(如 5-10 分钟)。
    • 即使被截获,黑客利用的时间窗口极短。
  3. 不可伪造性
    • 黑客虽然能读取内容,但无法修改 Token(因为没有私钥签名)。
    • 无法将 User ID 改为管理员 ID。

4、补充:JWE (加密)

  • 如果业务确实要求 Token 内容不可见,可以使用 JWE (JSON Web Encryption) 对 Token 进行加密。
  • 代价:性能损耗大,实现复杂,一般场景不推荐。

总结

  • OAuth 2.0 是授权框架,负责发钥匙。
  • OIDC 是认证协议,在 OAuth 基础上发了张身份证 (ID Token)。
  • JWT 是身份证的格式,包含签名。
  • 公钥 是公开的,用来验证身份证真伪。
  • HTTPS 是通道,防止身份证在传输途中被偷看。
  • 本地 Token 是网站 P 自己发的门票,用于提升性能和解耦。
文章作者: Frosro
文章链接: https://frosro.github.io/2026/04/18/OAuth-2-0-%E4%B8%8E-OIDC-OpenID-Connect-%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 BETTER LATE THAN NEVER
打赏
  • 微信
    微信
  • 支付宝
    支付宝

评论