简介
: 授权码模式是功能最完整、流程最严密的授权模式,特点是通过客户端的后台服务器,与“服务提供商”的认证服务器进行互动。
+----------+
| Resource |
| Owner |
| |
+----------+
^
|
(B)
+----|-----+ Client Identifier +---------------+
| -+----(A)-- & Redirection URI ---->| |
| User- | | Authorization |
| Agent -+----(B)-- User authenticates --->| Server |
| | | |
| -+----(C)-- Authorization Code ---<| |
+-|----|---+ +---------------+
| | ^ v
(A) (C) | |
| | | |
^ v | |
+---------+ | |
| |>---(D)-- Authorization Code ---------' |
| Client | & Redirection URI |
| | |
| |<---(E)----- Access Token -------------------'
+---------+ (w/ Optional Refresh Token)
(A) 用户访问客户端,后者将前者导向认证服务器
(B) 用户决定是否基于客户端授权
(C) 假设用户给予授权,认证服务器将用户导向客户端事先指定的“重定向URI”(redirection URI),同时附上一个授权码
(D) 客户端收到授权码,附上早先的“重定向URI”,向认证服务器申请令牌。这一步是在客户端的后台服务器进行的,对用户不可见
(E) 认证服务器核对了授权码和重定向URI无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)
-- response_type: 必填且必须为“code”
-- client_id: 必填,客户端ID
-- redirect_uri: 选填,重定向URI
-- scope: 选填,申请的权限范围
-- state: 建议,客户端的当前状态,可以指定任意值,认证服务器会原封不动返回这个值
示例
:
GET /authorize?response_type=code&client_id=s6BhdRkqt3&state=xyz
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
Host: server.example.com
-- code: 必填,授权码。它的有效期应该很短,通常设为10分钟。客户端只能使用该码一次,否则会被授权服务器拒绝。该码与客户端ID、重定向URI是一一对应关系
-- state: 如果客户端请求包含这个参数,则服务端应返回一个一模一样的此参数
示例
:
HTTP/1.1 302 Found
Location: https://client.example.com/cbcode=SplxlOBeZQQYbYS6WxSbIA&state=xyz
-- error: 必填,错误码。以下 ASCII 错误码中的一个
- invalid_request: 请求参数错误
- unauthorized_client: 未授权的客户端
- access_denied: 用户或授权服务器拒绝请求
- unsupported_response_type: 授权服务器不支持此授权类型
- invalid_scope: 非法或未知的请求范围
- server_error: 授权服务器发送错误
- temporarily_unavailable: 授权服务暂时不可用
-- error_description: 选填,错误提示
-- error_uri: 选填,错误详情地址
-- state: 请求参数中有时才有,且与请求参数值一样
示例
:
HTTP/1.1 302 Found
Location: https://client.example.com/cb?error=access_denied&state=xyz
-- grant_type: 必填,授权类型,必须为“authorization_cod”
-- code: 必填,上一步拿到的授权码
-- redirect_uri: 必填,重定向URI,与A步骤中此参数值保持一致
-- client_id: 必填,客户端ID
示例
:
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA
&redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb
-- access_token: 必填,访问令牌
-- token_type: 必填,令牌类型,可以是 bearer 类型或 mac 类型
-- expires_in: 必填,标识过期时间(单位秒),如果不填需用其它方式标识过期时间
-- refresh_token: 选填,更新令牌,用来获取下一令牌
-- example_parameter: 选填,示例额外信息
-- scope: 选填,权限范围,与客户端申请的一致
示例
:
HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache
{
"access_token":"2YotnFZFEjr1zCsicMWpAA",
"token_type":"example",
"expires_in":3600,
"refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
"example_parameter":"example_value"
}