在OAuth2.0中使用刷新令牌

时间:2016-05-17 07:59:08

标签: authentication cookies oauth oauth-2.0 openid-connect

我正在实施OAuth2.0 server并尝试阅读concepts of refresh token以及如何使用来调用访问令牌以及如何安全地存储它。

这对我来说听起来很混乱的一点是,“因为Auth2.0令牌是短期令牌,并且假设在成功登录后服务器给了我一个类似的令牌:

{
    "token_type":"bearer",
    "access_token":"eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyIjoiVlx1MDAxNcKbwoNUwoonbFPCu8KhwrYiLCJpYXQiOjE0NDQyNjI1NDMsImV4cCI6MTQ0NDI2MjU2M30.MldruS1PvZaRZIJR4legQaauQ3_DYKxxP2rFnD37Ip4",
    "expires_in":3600,
    "refresh_token":"fdb8fdbecf1d03ce5e6125c067733c0d51de209c"
}

由于访问令牌是短期令牌,因此在我的情况下会在1小时后过期。

假设一个用户browsing a protected resource拥有access tokens个凭据,一段时间后,其访问权限会过期,并且他的请求会返回这样的响应。

{
  "code":401,
  "error":"invalid_token",
  "error_description":"The access token provided has expired."
}

现在可以使用浏览器Cookie中存储的新refresh token but doesn't the user experience is getting affected as each time an access token expires in an hour a valid request by a client is getting rejected due to expired access token and then we have to first fetch a new access token and then try that request again.

生成新令牌
  

刷新令牌的提取是否只是这样,或者我缺少一些重要的概念?

另外,如何在cookie中安全地刷新令牌,因为它也不是最安全的存储方式?

2 个答案:

答案 0 :(得分:2)

刷新令牌是一种特殊的令牌,可以随时用于获取更新的id_token。刷新令牌必须由应用程序安全地存储,因为它们基本上允许用户永远保持身份验证。

身份验证请求的响应可能导致OAuth发出id_token。此令牌可用于对安全API进行经过身份验证的调用。

在签名等其他安全措施中,OAuths具有exp声明所指示的到期日期。但是,本地安装在桌面或智能手机等设备上的应用程序可能希望避免在每次令牌过期时要求用户输入凭据。

刷新令牌允许应用程序直接请求OAuth发出新的id_token,而无需重新进行身份验证。只要尚未撤销刷新令牌,这就可以正常工作。

安全注意事项

因为刷新令牌永不过期,所以提供一种撤销它们的方法很重要。这可以通过仪表板手动完成,也可以通过Auth的API以编程方式完成。

可以为应用,用户和设备的每个组合发布和撤消刷新令牌。要撤消刷新令牌,可以调用撤消刷新令牌端点:

DELETE https://YOUR_NAMESPACE/api/users/<user id>/refresh_tokens/<refresh token>

{
  "Authorization":   "Bearer <your access token>",
}

获取刷新令牌

要获取刷新令牌,在通过/ authorize端点启动身份验证请求时,必须包含offline_access范围和任意设备名称。例如:

GET https://YOUR_NAMESPACE/authorize/?
    response_type=token
    &client_id=YOUR_CLIENT_ID
    &redirect_uri=YOUR_CALLBACK_URL
    &state=VALUE_THAT_SURVIVES_REDIRECTS
    &scope=openid%20offline_access
    &device=my-device

使用刷新令牌

要获取新的id_token,请使用委托端点:

POST https://YOUR_NAMESPACE/delegation
Content-Type: 'application/json'
{
  "client_id":       "YOUR_CLIENT_ID",
  "grant_type":      "urn:ietf:params:oauth:grant-type:jwt-bearer",
  "refresh_token":   "your_refresh_token",
  "api_type":        "app"
}

此请求的回复可能如下:

{
  "token_type": "Bearer",
  "expires_in": 30000,
  "id_token": "eyJ..."
}

expires_in参数以秒为单位指示新JWT的生命周期。它可以通过JWT的exp和iat声明之间的差异来计算。

重要建议:只有在id_token过期时才会使用refresh_token获取新令牌。例如,每次执行API调用时调用端点获取新令牌是一种不好的做法。 Auth0中有速率限制,可以限制使用相同令牌从某个IP到此端点可以完成的请求数量。

有关进一步阅读,请尝试以下链接

https://auth0.com/docs/refresh-token

答案 1 :(得分:1)

刷新令牌是一种令牌,用于获取另一个有效令牌以与您正在使用的API进行交互,因为令牌是短暂的。然后,由于令牌是短暂的,因此每次要访问API时,都必须从用户那里获得另一个oauth2.0凭证。怎么避免这个? - &GT;刷新令牌。

如上所述,刷新令牌根本不是API访问的令牌,它只是一种用于每次获取新的短期令牌的令牌。

然后您的第一个登录凭据会获得用户同意的令牌和刷新令牌,然后您不再需要用户同意,只需使用刷新令牌。

不确定我是否回答你的问题:)