如何使用JWT刷新令牌?

时间:2020-05-13 11:17:33

标签: jwt jwt-auth

我想为我的REST API实现JWT身份验证。 客户端是一个Reactjs Web应用程序,后端是Expressjs REST API。

假设这种情况,

  1. 用户访问/登录路径,服务器生成访问令牌和刷新令牌,并将它们发送给客户端。我在哪里存储访问令牌和刷新令牌?我还会将刷新令牌与特定的userID一起存储在数据库中吗?
  2. 访问令牌已到期。如何刷新它,而不必使用户再次使用凭据登录?

客户端是否需要了解刷新令牌?当服务器尝试使用过期的访问令牌访问路由时,服务器可以验证它并使用与数据库中与userID关联的刷新令牌,并为客户端生成新的访问令牌。

1 个答案:

答案 0 :(得分:0)

以下假设使用OAuth 2.0 / OpenId Connect。

  1. 用于访问令牌的最佳IMO位于内存中。本机应用程序的刷新令牌应安全地存储在设备上。注意:您不应该在Web客户端/浏览器中存储刷新令牌。通过在对offline_access端点的请求中指定的作用域列表中指定/token,本机应用可以接收刷新令牌。
  2. 对于已收到刷新令牌的本机应用程序,您可以检测到对保护路由的请求的401响应,随后尝试从刷新令牌(安全存储在设备上)中获取新的访问令牌。要使用刷新令牌获取新的访问令牌,您可以向/token端点发出另一个请求,但是这次除了实际的刷新令牌外,还指定了grant_type=refresh_token。请参见下面的示例请求:
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=refresh_token&client_id=4d7481b6-9de3-4e20-9fc1-f907cda9d993&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&refresh_token=QWERTY123&scope=openid%20offline_access" https://idp.example.com/token

最后一件事;除非出于安全原因,除非您可以严格管理对数据库的访问,否则您可能不应该考虑将刷新令牌存储在数据库中。