Project 4 - 授权码管理与 PKCE
实验目标 本周我们将实现 OAuth 2.0 的核心:授权码流程。完成本实验后,你将能够: ✅ 理解授权码在 OAuth 2.0 流程中的关键作用 ✅ 实现授权码的创建和一次性使用验证 ✅ 理解授权码被截获的安全威胁 ✅ 实现 PKCE(Proof Key for Code Exchange)安全增强 ✅ 掌握 SHA-256 哈希和 Base64 URL 编码 理论背景 1. 授权码流程详解 1.1 为什么需要授权码? OAuth 2.0 使用两步验证而非直接颁发访问令牌,主要出于安全考虑: ❌ 不安全的单步流程(隐式授权): 用户登录 → SSO 直接返回访问令牌到浏览器 问题:访问令牌暴露在浏览器历史记录、日志中 ✅ 安全的两步流程(授权码): 步骤 1:用户登录 → SSO 返回临时授权码到浏览器 步骤 2:客户端后端用授权码 + 密钥换取访问令牌 优势:访问令牌只在后端传输,永不经过浏览器 1.2 授权码的生命周期 时间轴: T0: 用户完成登录,SSO 生成授权码 授权码特性: - 随机生成(UUID 或密码学随机数) - 生命周期极短(5 分钟) - 一次性使用(use once and destroy) T0+30s: 客户端用授权码换取令牌 授权码被立即销毁 T0+5min: 授权码自动过期 (即使未被使用) 2. 授权码截获攻击与 PKCE 2.1 授权码截获攻击场景 攻击场景:恶意应用截获授权码 正常流程: 1. 合法 App 发起授权请求 2. 用户登录,SSO 重定向到 callback URL 3. 恶意 App 拦截重定向(通过注册相同的 URL Scheme) 4. 恶意 App 获取授权码 5. 恶意 App 用授权码 + 客户端密钥换取令牌 ← 问题! 在移动应用中,客户端密钥无法安全存储 (反编译即可获取) 2.2 PKCE 工作原理 PKCE(读作 “pixy”)通过动态密钥解决此问题: ...