一、OAuth 2.0 授权码模式 vs. 实际登录场景
1、标准的 OAuth 2.0 授权码模式
- 定义:OAuth 2.0 是一个授权框架,解决的是“委托授权”问题(即:应用 A 能否访问用户在应用 B 的数据)。
- 核心产物:
Access Token(访问令牌)。 - Token 生成者:必须由授权服务器(如微信、Google)生成。
- 原因:资源服务器只信任授权服务器。如果由第三方(客户端)自己生成,资源服务器无法验证其真伪,安全体系将崩溃。
- Token 持有者:第三方应用(客户端)。
- Token 用途:第三方应用拿着 Token 去访问资源服务器的接口。
2、实际企业登录场景(混合模式)
- 场景描述:公司新买的网站 P 接入公司统一登录平台。
- 网站 P 通过 OAuth 2.0 获取
code。 - 用
code换取用户信息。 - 网站 P 自己生成 Token,建立本地会话。
- 网站 P 通过 OAuth 2.0 获取
- 定性:这属于“基于 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 登录流程
- 发起请求:网站 P 跳转至授权服务器,Scope 中必须包含
openid。 - 用户授权:用户在授权服务器登录并同意。
- 发放令牌:网站 P 用
code换取 Token。- 返回
access_token(用于访问数据)。 - 返回
id_token(用于确认身份)。
- 返回
- 验证身份:
- 网站 P 拿到
id_token。 - 验签:确认 Token 确实由授权服务器签发(防伪造)。
- 解码:直接读取 JWT 中的用户信息(无需额外请求接口)。
- 网站 P 拿到
- 建立会话:网站 P 确认身份后,生成自己的本地 Token 完成登录。
三、ID Token 的验证与公钥机制
1、为什么需要公钥?
ID Token是 JWT 格式,包含签名。- 为了防止黑客伪造 Token,网站 P 必须验证签名。
- 验证签名需要公钥。
2、公钥的获取:JWKS 与 Discovery
- 公钥存放:授权服务器提供一个公开的 URL,即 JWKS 端点(如
/.well-known/jwks.json)。 - 获取流程(自动化):
- 网站 P 访问
/.well-known/openid-configuration(Discovery Document)。 - 获取配置文件,从中读取
jwks_uri。 - 访问
jwks_uri获取公钥集合(JWKS)。 - 本地缓存公钥,用于验证 Token。
- 网站 P 访问
- 开发者配置:通常只需配置
issuer-uri,客户端库会自动处理上述流程。
3、公钥的安全性
- 必须公开:任何人都可以访问 JWKS 端点,无需认证。
- 原理:公钥用于验证,私钥用于签名。只要私钥不泄露,公钥公开无风险。
- 防御中间人攻击:
- 通过 Issuer 校验:比对配置文件中的
issuer与本地配置是否一致。 - 强制使用 HTTPS:防止传输过程被篡改。
- 通过 Issuer 校验:比对配置文件中的
四、ID Token 的安全性问题
1、拦截 ID Token 的风险
- 事实:ID Token 是 Base64 编码的,任何人(包括黑客)拿到后都可以解码看到里面的用户信息。
- 结论:ID Token 不加密,只防篡改。
2、为什么不加密 ID Token?
- 性能:非对称解密消耗大,验签速度快。
- 内容非敏感:ID Token 里只放标识符(User ID),不放敏感信息(密码、手机号)。
3、如何防止拦截带来的危害?
- HTTPS (TLS/SSL):
- 这是底线。HTTPS 保证传输过程加密,黑客拦截到的是乱码,拿不到原始 Token。
- 短期有效期:
- ID Token 有效期极短(如 5-10 分钟)。
- 即使被截获,黑客利用的时间窗口极短。
- 不可伪造性:
- 黑客虽然能读取内容,但无法修改 Token(因为没有私钥签名)。
- 无法将 User ID 改为管理员 ID。
4、补充:JWE (加密)
- 如果业务确实要求 Token 内容不可见,可以使用 JWE (JSON Web Encryption) 对 Token 进行加密。
- 代价:性能损耗大,实现复杂,一般场景不推荐。
总结
- OAuth 2.0 是授权框架,负责发钥匙。
- OIDC 是认证协议,在 OAuth 基础上发了张身份证 (
ID Token)。 - JWT 是身份证的格式,包含签名。
- 公钥 是公开的,用来验证身份证真伪。
- HTTPS 是通道,防止身份证在传输途中被偷看。
- 本地 Token 是网站 P 自己发的门票,用于提升性能和解耦。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 BETTER LATE THAN NEVER!
评论





