OAuth 2.0 授权码授权(Authorization Code Grant)
授权码授权是 OAuth 2.0 中最常用的授权类型,适用于服务器端应用程序。它通过两个步骤确保安全性:首先获取授权码,然后用该授权码换取访问令牌。
1. 获取授权码
客户端将用户代理(通常是浏览器)重定向到授权服务器,用户在授权服务器上进行认证并授权客户端访问其资源。
请求示例:
GET /authorize?response_type=code&client_id=your_client_id&redirect_uri=https://yourapp.com/callback&scope=read&state=xyz HTTP/1.1
Host: authorization-server.com
请求参数:
response_type=code
: 表示请求授权码。client_id
: 分配给客户端的唯一标识符。redirect_uri
: 授权服务器在用户授权后重定向的 URI。scope
: 请求的权限范围。state
: 可选参数,用于防止 CSRF 攻击,客户端生成并在重定向时返回。
用户同意授权后,授权服务器将用户代理重定向到客户端的重定向 URI,并附上授权码和状态参数。
响应示例:
HTTP/1.1 302 Found
Location: https://yourapp.com/callback?code=authorization_code&state=xyz
响应参数:
code
: 授权码。state
: 与请求中的状态参数一致。
2. 使用授权码获取访问令牌
客户端通过服务器端(而不是用户代理)向授权服务器发送 POST 请求,用授权码换取访问令牌。
请求示例:
POST /token HTTP/1.1
Host: authorization-server.com
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=authorization_code&redirect_uri=https://yourapp.com/callback&client_id=your_client_id&client_secret=your_client_secret
请求参数:
grant_type=authorization_code
: 表示使用授权码换取访问令牌。code
: 从授权服务器接收到的授权码。redirect_uri
: 与初始请求中的redirect_uri
相同。client_id
: 分配给客户端的唯一标识符。client_secret
: 分配给客户端的密钥。
授权服务器验证授权码和其他参数的有效性后,返回访问令牌及其他信息。
响应示例:
{
"access_token": "access_token",
"token_type": "Bearer",
"expires_in": 3600,
"refresh_token": "refresh_token",
"scope": "read"
}
响应参数:
access_token
: 用于访问受保护资源的令牌。token_type
: 令牌类型,通常为Bearer
。expires_in
: 访问令牌的有效期(以秒为单位)。refresh_token
: 用于获取新访问令牌的刷新令牌。scope
: 授权范围。
流程图
- 客户端请求授权码:
Client --> Authorization Server
| |
| --(1) Authorization Request--> |
| |
| <--(2) Authorization Code---- |
| |
- 客户端使用授权码获取访问令牌:
Client --> Authorization Server
| |
| --(3) Token Request----------> |
| |
| <--(4) Access Token----------- |
| |
安全性
授权码授权流程通过使用授权码和客户端密钥的组合,使得访问令牌不会直接暴露给用户代理,有效提升了安全性。同时,授权码的使用确保了只有授权的客户端才能获取访问令牌。
总结
授权码授权是 OAuth 2.0 最常用的授权类型,适用于服务器端应用程序。它通过两个步骤确保安全性,既保证了访问令牌的安全传输,又提供了灵活的授权范围和状态参数以防止 CSRF 攻击。理解和实现授权码授权流程,可以帮助开发者构建安全可靠的 OAuth 2.0 授权机制。