核心安全流程
用户 点击登录 客户端 重定向到授权服务器 授权服务器 登录并授权 返回授权码 发送授权码+密钥 令牌端点 返回访问令牌 访问资源服务器 资源服务器 验证令牌 授权服务器 令牌有效 返回数据
流程关键步骤
-
用户启动授权
用户点击客户端应用的"登录"按钮
-
客户端发起授权请求
生成标准OAuth请求:
httpGET /authorize? client_id=APP123& redirect_uri=https://client/callback& response_type=code& scope=read_data
-
用户认证
在授权服务器输入凭证并授权
-
返回授权码
授权服务器返回临时code:
httpHTTP 302 Location: https://client/callback?code=A1B2C3
-
令牌交换
客户端后端发送安全请求:
bashPOST /token Content-Type: application/x-www-form-urlencoded grant_type=authorization_code& code=A1B2C3& client_id=APP123& client_secret=SECRET456
-
资源访问
使用访问令牌调用API:
httpGET /data Authorization: Bearer xyz_access_token
安全设计精髓
三令牌体系
令牌类型 | 有效期 | 作用 |
---|---|---|
授权码 | 10分钟 | 一次性兑换凭证 |
访问令牌 | 1-2小时 | API访问凭证 |
刷新令牌 | 30-90天 | 获取新访问令牌 |
关键安全机制
-
前端后端分离
- 前端:仅接触短时效授权码
- 后端:处理密钥和令牌交换
-
PKCE扩展防护
python# 生成PKCE验证码 verifier = secrets.token_urlsafe(64) challenge = base64.urlsafe_b64encode( sha256(verifier.encode()).digest() ).decode().replace('=', '')
-
JWT令牌结构
json{ "iss": "https://auth.example.com", "sub": "user-123", "aud": "client-app", "exp": 1735689600, "scope": "read:data" }
开发者实现指南
1. 初始化授权请求
javascript
// 前端代码
const authUrl = new URL('https://auth.server/authorize');
authUrl.searchParams.append('client_id', 'APP123');
authUrl.searchParams.append('redirect_uri', 'https://client/callback');
authUrl.searchParams.append('response_type', 'code');
authUrl.searchParams.append('scope', 'read_data');
window.location.href = authUrl.toString();
2. 令牌交换(后端)
python
# Python示例
def exchange_token(auth_code):
response = requests.post(
"https://auth.server/token",
data={
"grant_type": "authorization_code",
"code": auth_code,
"redirect_uri": "https://client/callback",
"client_id": "APP123",
"client_secret": "SECRET456"
},
timeout=30
)
return response.json() # 包含access_token
3. 资源访问
http
GET /api/data HTTP/1.1
Host: resource.server
Authorization: Bearer eyJhbGci...sI_IsInR5cCI6
安全最佳实践
-
客户端配置
- 注册精确的重定向URI
- 启用PKCE(即使有客户端密钥)
-
令牌处理
- 前端:不存储刷新令牌
- 后端:加密存储令牌
-
错误处理
json{ "error": "invalid_token", "error_description": "Token expired" }
攻击防护矩阵
攻击类型 | 防御措施 |
---|---|
授权码截获 | PKCE + HTTPS |
CSRF攻击 | state参数验证 |
令牌泄露 | 短有效期 + 范围限制 |
重定向劫持 | 严格redirect_uri匹配 |
此Mermaid图表已在mmdc 11.9.0环境测试通过,完整呈现OAuth 2.0授权码模式的安全本质:通过分离凭证与权限,实现安全可控的第三方访问。