OAuth2.0 - 刷新令牌

1,852 阅读3分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

刷新令牌(Refresh Token)

刷新令牌是用于获取访问令牌的凭据。刷新令牌由授权服务器颁发给客户端,用于在当前访问令牌失效或过期时获取新的访问令牌,或者获取具有相同或更窄范围的附加访问令牌(访问令牌可能具有更短的范围)生命周期和少于资源所有者授权的权限)。颁发刷新令牌是可选的,由授权服务器决定。

流程

  +--------+                                           +---------------+
  |        |--(A)------- Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<-(B)----------- Access Token -------------|               |
  |        |               & Refresh Token             |               |
  |        |                                           |               |
  |        |                            +----------+   |               |
  |        |--(C)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(D)- Protected Resource --| Resource |   | Authorization |
  | Client |                            |  Server  |   |     Server    |
  |        |--(E)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(F)- Invalid Token Error -|          |   |               |
  |        |                            +----------+   |               |
  |        |                                           |               |
  |        |--(G)----------- Refresh Token ----------->|               |
  |        |                                           |               |
  |        |<-(H)----------- Access Token -------------|               |
  +--------+           & Optional Refresh Token        +---------------+

(A) 客户端通过身份验证请求访问令牌授权服务器并提供授权许可。

(B) 授权服务器对客户端进行身份验证并验证授权许可,如果有效,则颁发访问令牌和刷新令牌。

(C) 客户端向资源发出受保护的资源请求服务器通过提供访问令牌。

(D) 资源服务器验证访问令牌,如果有效,服务于请求。

(E) 重复步骤 (C) 和 (D),直到访问令牌过期。如果客户端知道访问令牌已过期,它跳到步骤(G);否则,它会发出另一个受保护的资源请求。

(F) 由于访问令牌无效,资源服务器返回无效的令牌错误。

(G) 客户端通过身份验证请求一个新的访问令牌授权服务器并提供刷新令牌。这客户端身份验证要求基于客户端类型并在授权服务器策略上。

请求参数:

参数参数说明是否必填备注
grant_type授权类型必填必须是refresh_token
refresh_token刷新令牌必填该值大小写不敏感
scope权限范围可选

因为刷新令牌通常是用于请求额外的访问令牌的持久凭证,刷新令牌绑定到被它被颁发给的客户端。如果通过客户端凭证模式,建议选定其他的身份验证。

请求示例:

POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&refresh_token=tGzv3JOkF0XG5Qx2TlKWIA

(H) 授权服务器对客户端进行认证并验证刷新令牌,如果有效,则发出新的访问令牌(并且,可选地,一个新的刷新令牌)。

响应参数:

参数参数说明是否必填备注
access_token访问令牌必填
token_type令牌类型必填该值大小写不敏感
expires_in过期时间,单位为秒。可选如果省略该参数,必须其他方式设置过期时间。
refresh_token更新令牌可选用来获取下一次的访问令牌
scope权限范围可选如果与客户端申请的范围一致,此项可省略。

响应示例:

{
       "access_token":"2YotnFZFEjr1zCsicMWpAA",
       "token_type":"example",
       "expires_in":3600,
       "refresh_token":"tGzv3JOkF0XG5Qx2TlKWIA",
       "example_parameter":"example_value"
 }

说明

建议将access_tokenrefresh_token的过期时间保存下来,每次调用平台方的业务api前先对access_tokenrefresh_token进行一下时间判断,如果过期则执行刷新access_token或重新授权操作。refersh_token如果过期就只能让用户重新授权。