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