谈谈OAuth2.0 中访问令牌(access token)和刷新令牌(refresh_token )

当采用有效的方式请求访问令牌时,授权服务器则会返回一个授权令牌(access token)和一个可选的刷新令牌(refresh token),同时返回给客户端还有其他一些附加属性,比如用户姓名,编号等。
访问令牌请求的返回内容如下:

访问令牌 access_token (必需)
令牌类型 token_type (必须)
超时时间 expires_in (推荐)
刷新令牌 refresh_token (可选)
作用域 scope(可选)

当返回访问令牌时,HTTP服务器必须在HTTP头信息中增加两个属性
Cache-Control: no-store
Pragma: no-cache
确保客户端不缓存返回结果。

HTTP/1.1 200 OK
Content-Type: application/json
Cache-Control: no-store
Pragma: no-cache
 
{
  "access_token":"MTQ0NjJkZmQ5OTM2NDE1ZTZjNGZmZjI3",
  "token_type":"bearer",
  "expires_in":3600,
  "refresh_token":"IwOGYzYTlmM2YxOTQ5MGE3YmNmMDFkNTVk",
  "scope":"create"
}

OAuth2.0 协议草案第4.2节提出授权服务器即可以返回一个 access_token(要用验证对资源的访问),也要返回一个用于创建新的 access_token的 refresh_token。
为什么要同时返回,为什么不让access_token的有效期和refresh_token一样长久,省掉refresh_token岂不是更好?

采用刷新令牌的想法是:

如果访问令牌受到劫持,由于它的存在是短时间的,所以对访问令牌的滥用是控制在一定范围内的。
如果刷新令牌被劫持,基本上无害的,攻击者需要得到 client_id,secrect_id (通常存储在服务器上),再加上刷新令牌才可以进行操作。

https://www.oauth.com/oauth2-servers/access-tokens/access-token-response/
https://tools.ietf.org/html/rfc6749#section-4.2
https://stackoverflow.com/questions/3487991/why-does-oauth-v2-have-both-access-and-refresh-tokens

你可能感兴趣的:(谈谈OAuth2.0 中访问令牌(access token)和刷新令牌(refresh_token ))