跳到主要内容

5. 发放访问令牌 (Issuing an Access Token)

如果访问令牌请求有效且已获授权, 授权服务器 (Authorization Server) 按第 5.1 节所述发放访问令牌 (Access Token) 以及可选的刷新令牌 (Refresh Token). 如果请求未通过客户端认证或请求无效, 授权服务器按第 5.2 节所述返回错误响应.

5.1. 成功响应 (Successful Response)​

授权服务器发放访问令牌以及可选的刷新令牌, 并通过向 HTTP 200 (OK) 响应的实体主体中加入以下参数来构造响应:

access_token
必需 (REQUIRED). 授权服务器发放的访问令牌.

token_type
必需 (REQUIRED). 按第 7.1 节所述发放的令牌类型. 该值大小写不敏感.

expires_in
推荐 (RECOMMENDED). 访问令牌的生命周期, 以秒为单位. 例如, 值 "3600" 表示访问令牌将在响应生成后一小时过期. 如果省略, 授权服务器应该 (SHOULD) 通过其他方式提供过期时间, 或文档化默认值.

refresh_token
可选 (OPTIONAL). 刷新令牌, 可按第 6 节所述使用同一授权授予来获取新的访问令牌.

scope
如果与客户端请求的作用域相同则可选 (OPTIONAL); 否则必需 (REQUIRED). 访问令牌的作用域, 如第 3.3 节所述.

这些参数使用 [RFC4627] 定义的 "application/json" 媒体类型包含在 HTTP 响应实体主体中. 参数通过在最高结构层级添加每个参数而序列化为 JavaScript Object Notation (JSON) 结构. 参数名和字符串值作为 JSON 字符串包含. 数值作为 JSON 数字包含. 参数顺序无关紧要, 可以变化.

授权服务器在任何包含令牌, 凭据或其他敏感信息的响应中, 必须 (MUST) 包含值为 "no-store" 的 HTTP "Cache-Control" 响应头字段 [RFC2616], 以及值为 "no-cache" 的 "Pragma" 响应头字段 [RFC2616].

例如:

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"
\}

客户端必须 (MUST) 忽略响应中无法识别的值名称. 授权服务器返回的令牌以及其他值的大小未定义. 客户端应该避免对值大小作出假设. 授权服务器应该 (SHOULD) 文档化其发放的任何值的大小.

5.2. 错误响应 (Error Response)​

除非另有规定, 授权服务器以 HTTP 400 (Bad Request) 状态码响应, 并在响应中包含以下参数:

error
必需 (REQUIRED). 来自以下集合的单个 ASCII [USASCII] 错误码:

invalid_request
请求缺少必需参数, 包含不受支持的参数值 (授权类型除外), 重复某个参数, 包含多个凭据, 使用多种机制对客户端进行认证, 或者请求格式存在其他错误.

invalid_client
客户端认证失败, 例如未知客户端, 未包含客户端认证, 或认证方法不受支持. 授权服务器可以 (MAY) 返回 HTTP 401 (Unauthorized) 状态码以指示支持哪些 HTTP 认证方案. 如果客户端尝试通过 "Authorization" 请求头字段进行认证, 授权服务器必须 (MUST) 以 HTTP 401 (Unauthorized) 状态码响应, 并包含与客户端所用认证方案匹配的 "WWW-Authenticate" 响应头字段.

invalid_grant
提供的授权授予 (例如授权码或资源所有者凭据) 或刷新令牌无效, 已过期, 已撤销, 与授权请求中使用的重定向 URI 不匹配, 或签发给了另一个客户端.

unauthorized_client
已认证的客户端未被授权使用此授权授予类型.

unsupported_grant_type
授权服务器不支持该授权授予类型.

invalid_scope
请求的作用域无效, 未知, 格式错误, 或超出资源所有者授予的作用域.

"error" 参数值不得 (MUST NOT) 包含集合 %x20-21 / %x23-5B / %x5D-7E 之外的字符.

error_description
可选 (OPTIONAL). 人类可读的 ASCII [USASCII] 文本, 提供额外信息, 用于帮助客户端开发者理解发生的错误. "error_description" 参数值不得 (MUST NOT) 包含集合 %x20-21 / %x23-5B / %x5D-7E 之外的字符.

error_uri
可选 (OPTIONAL). 标识一个人类可读网页的 URI, 该网页包含关于错误的信息, 用于向客户端开发者提供有关该错误的额外信息. "error_uri" 参数值必须 (MUST) 符合 URI-reference 语法, 因而不得 (MUST NOT) 包含集合 %x21 / %x23-5B / %x5D-7E 之外的字符.

这些参数使用 [RFC4627] 定义的 "application/json" 媒体类型包含在 HTTP 响应实体主体中. 参数通过在最高结构层级添加每个参数而序列化为 JSON 结构. 参数名和字符串值作为 JSON 字符串包含. 数值作为 JSON 数字包含. 参数顺序无关紧要, 可以变化.

例如:

HTTP/1.1 400 Bad Request
Content-Type: application/json;charset=UTF-8
Cache-Control: no-store
Pragma: no-cache

\{
"error":"invalid_request"
\}