JWT刷新令牌流


129

我正在构建一个移动应用程序,并且正在使用JWT进行身份验证。

似乎最好的方法是将JWT访问令牌与刷新令牌配对,以便我可以根据需要频繁地使访问令牌到期。

  1. 刷新令牌是什么样的?是随机字符串吗?该字符串是否已加密?是另一个JWT吗?
  2. 刷新令牌将存储在用户模型上的数据库中以供访问,对吗?在这种情况下,似乎应该对其进行加密
  3. 用户登录后,我会发回刷新令牌,然后让客户端访问一条单独的路由来检索访问令牌吗?

3
请注意,如果您使用的是刷新令牌,则应为用户提供在UI上使其无效的功能。如果例如一个月不使用它们,也建议自动使它们过期。
Vilmantas Baranauskas,2015年

1
@jtmarmon:如何在客户端存储刷新令牌?我的意思是Android设备具有安全性吗?
j10

Answers:


39

假设这与OAuth 2.0有关,因为它与JWT和刷新令牌有关...:

  1. 就像访问令牌一样,刷新令牌原则上可以是任何内容,包括您描述的所有选项;当授权服务器想要无状态或想要对呈现它的客户端实施某种“占有证明”语义时,可以使用JWT;请注意,刷新令牌与访问令牌的不同之处在于,刷新令牌不会呈现给资源服务器,而只会呈现给最初发布它的授权服务器,因此,针对JWTs-as-access-tokens的自包含验证优化不持有刷新令牌

  2. 这取决于数据库的安全性/访问权限;如果其他方/服务器/应用程序/用户可以访问该数据库,则可以(但是您的里程可能随存储密钥的位置和方式而变化...)

  3. 授权服务器可以同时颁发访问令牌和刷新令牌,这取决于客户端用于获取访问令牌和授予令牌的权限;该规范包含每个标准化赠款的详细信息和选项


31
2.您应该在数据库中存储刷新令牌的哈希,然后将用户刷新令牌的哈希与存储的哈希进行比较。这里遵循“不在数据库中存储纯文本密码”的规则。考虑一个令牌,例如您为用户创建的随机密码。
罗默

2
另外,如果您想提供更多的安全性,还请执行刷新令牌轮换。在ITEF RFC 6749中已经提到了这一点的重要性。如果实施正确,这也可以帮助识别令牌被盗的情况,即刷新令牌已被攻击者窃取。如果您正在寻找更好的解释,请转到此链接
Bhumil Sarvaiya

82

以下是撤销您的JWT访问令牌的步骤:

  1. 登录后,发送2个令牌(访问令牌,刷新令牌)以响应客户端。
  2. 访问令牌的有效期将更少,而刷新将具有较长的到期时间。
  3. 客户端(前端)将在其本地存储中存储刷新令牌,并在cookie中访问令牌。
  4. 客户端将使用访问令牌来调用API。但是,当它过期时,请从本地存储中选择刷新令牌,然后调用身份验证服务器API以获取新令牌。
  5. 您的身份验证服务器将公开一个API,该API将接受刷新令牌并检查其有效性并返回新的访问令牌。
  6. 刷新令牌过期后,将注销用户。

如果需要更多详细信息,请告诉我,我也可以共享代码(Java + Spring引导)。

对于您的问题:

问题1:这是另一个JWT,到期时间长,提出的索赔更少。

问题2:它将不在数据库中。后端将不会存储在任何地方。他们将只使用私钥/公钥解密令牌,并使用其到期时间对其进行验证。

问题3:是,正确


28
我认为JWT应该存储在中,localStorage而JWT应该存储在refreshTokenhttpOnly。该refreshToekn可以用来获得新的JWT所以它必须额外小心处理。
Tnc Andrei

2
谢谢,您存储在httpOnly中是什么意思?为什么不将两者都存储在localStorage中?
杰伊,

8
我缺少使用刷新令牌的好处,扩展访问令牌的有效性会有所不同吗?
user2010955 '19

3
@Jay根据Microsoft开发人员网络的说明,HttpOnly是Set-Cookie HTTP响应标头中包含的附加标志。在生成cookie时使用HttpOnly标志有助于减轻客户端脚本访问受保护cookie的风险(如果浏览器支持的话)。
shadow0359 '19

23
#2非常不准确。刷新令牌必须存储在服务器端。您不应该将JWT的“自包含”属性用于刷新令牌。这样做会使您除了更改私钥外无法撤消刷新令牌。
贾伊·夏尔马

26

在此实现中基于带有刷新令牌的JWT的Node.js

1)在这种情况下,他们使用uid而不是JWT。当他们刷新令牌时,他们发送刷新令牌和用户。如果将其实现为JWT,则无需发送用户,因为它将在JWT内部。

2)他们在单独的文档(表)中实现此目的。这对我来说很有意义,因为用户可以登录到不同的客户端应用程序中,并且每个应用程序都可以具有刷新令牌。如果用户丢失了安装了一个应用程序的设备,则该设备的刷新令牌可能会无效,而不会影响其他已登录的设备。

3)在此实现中,它使用访问令牌和刷新令牌对登录方法进行响应。它对我来说是正确的。


说“ 1),在这种情况下,他们使用一个uid ...”,您的意思是UUID吗?
ozanmuyes

那么这个简单的实现又如何-问题JWT-当您想刷新时发送较旧的iat
JWT-

@adonese只发送JWT您的意思是拥有refresh_token里面的内容吗?如果是这样,OAuth RFC 6749明确表示不发送refresh_token到资源服务器(并且JWT发送到资源服务器):tools.ietf.org/html/rfc6749#section-1.5
Brenno Costa
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.