无需登录 数据私有 本地保存

Web 认证流程交互演示 - OAuth2/OIDC 步骤可视化

6
0
0
0
用户User Agent
客户端Client App
授权服务器Auth Server
资源服务器Resource API
请求消息 响应消息 重定向 ● 当前步骤
步骤 1 准备开始
点击"下一步"按钮开始演示OAuth2授权流程,或点击"自动播放"观看完整流程。
速度: 2s

常见问题与知识点

OAuth2 授权码模式为什么是最推荐的方式?
授权码模式(Authorization Code Flow)是OAuth2中最安全的授权方式,原因包括:

1. 令牌不经过浏览器:access_token通过后端通道(Back Channel)直接从授权服务器获取,不会暴露在浏览器URL或历史记录中。
2. 客户端认证:在换取令牌时,客户端需要提供client_secret进行身份验证,确保只有合法的客户端能获取令牌。
3. 支持PKCE扩展:可与PKCE(Proof Key for Code Exchange)结合,防止授权码拦截攻击,特别适合移动端和SPA应用。
4. 支持刷新令牌:可以获取refresh_token,实现长期安全的令牌管理。
OIDC 与 OAuth2 的核心区别是什么?
OAuth2 是授权协议,解决"你能访问什么"的问题,颁发access_token用于访问受保护资源。
OIDC (OpenID Connect) 是认证协议,在OAuth2基础上增加了身份认证层,解决"你是谁"的问题。

关键区别:
• OIDC引入了id_token(JWT格式),包含用户身份声明(如sub、name、email等)
• OIDC的scope必须包含"openid"
• OIDC提供UserInfo端点,用于获取更多用户信息
• OIDC标准化了用户身份的传递方式,使得单点登录(SSO)更加规范
什么是PKCE?为什么现代应用必须使用它?
PKCE(Proof Key for Code Exchange,发音"pixy")是OAuth2的安全扩展,用于防止授权码拦截攻击。

工作原理:
1. 客户端生成一个随机字符串code_verifier
2. 计算其SHA-256哈希值得到code_challenge
3. 授权请求时发送code_challenge
4. 换取令牌时必须提供原始code_verifier
5. 授权服务器验证哈希匹配后才颁发令牌

必要性:即使攻击者截获了授权码,没有code_verifier也无法换取令牌。对于无法安全存储client_secret的公共客户端(SPA、移动App),PKCE是强制要求。
access_token 和 refresh_token 分别有什么用途?
access_token(访问令牌):用于直接访问受保护资源,通常有效期较短(如1小时)。它像一把"临时门禁卡",过期后需要重新获取。

refresh_token(刷新令牌):用于在access_token过期后获取新的access_token,无需用户重新授权。有效期较长(如30天),像一把"续期钥匙"。

安全设计原则:access_token频繁使用,暴露风险高,因此短有效期限制损失;refresh_token使用频率低,可安全存储,实现长期会话。
隐式模式(Implicit Flow)为什么被废弃?
隐式模式曾用于纯前端SPA应用,但存在严重安全缺陷,已被OAuth2最佳实践明确废弃:

1. 令牌暴露在URL片段中:access_token直接通过浏览器重定向传递,可能被浏览器历史记录、日志或第三方脚本获取。
2. 无法使用刷新令牌:隐式模式不支持refresh_token,令牌过期后必须重新授权。
3. 无法进行客户端认证:无法验证令牌接收方的身份。

替代方案:使用授权码模式 + PKCE,即使是纯前端应用也能安全地获取令牌。
JWT (JSON Web Token) 在OAuth2/OIDC中扮演什么角色?
JWT是一种紧凑的、URL安全的令牌格式,广泛用于OAuth2/OIDC:

作为id_token(OIDC):包含用户身份声明(claims),如sub(用户ID)、iss(签发者)、aud(受众)、exp(过期时间)等,使用JWS签名确保完整性。
作为access_token(可选):一些实现使用JWT格式的access_token,资源服务器可以离线验证,无需内省端点。
结构:由三部分组成——Header(算法信息)、Payload(声明数据)、Signature(签名),用点号分隔。

注意:JWT的内容是Base64编码而非加密,敏感信息不应放入JWT中,除非使用JWE加密。