我正在构建一个移动应用程序,并且正在使用JWT进行身份验证。
似乎最好的方法是将JWT访问令牌与刷新令牌配对,以便我可以根据需要频繁地使访问令牌到期。
- 刷新令牌是什么样的?是随机字符串吗?该字符串是否已加密?是另一个JWT吗?
- 刷新令牌将存储在用户模型上的数据库中以供访问,对吗?在这种情况下,似乎应该对其进行加密
- 用户登录后,我会发回刷新令牌,然后让客户端访问一条单独的路由来检索访问令牌吗?
我正在构建一个移动应用程序,并且正在使用JWT进行身份验证。
似乎最好的方法是将JWT访问令牌与刷新令牌配对,以便我可以根据需要频繁地使访问令牌到期。
Answers:
假设这与OAuth 2.0有关,因为它与JWT和刷新令牌有关...:
就像访问令牌一样,刷新令牌原则上可以是任何内容,包括您描述的所有选项;当授权服务器想要无状态或想要对呈现它的客户端实施某种“占有证明”语义时,可以使用JWT;请注意,刷新令牌与访问令牌的不同之处在于,刷新令牌不会呈现给资源服务器,而只会呈现给最初发布它的授权服务器,因此,针对JWTs-as-access-tokens的自包含验证优化不持有刷新令牌
这取决于数据库的安全性/访问权限;如果其他方/服务器/应用程序/用户可以访问该数据库,则可以(但是您的里程可能随存储密钥的位置和方式而变化...)
授权服务器可以同时颁发访问令牌和刷新令牌,这取决于客户端用于获取访问令牌和授予令牌的权限;该规范包含每个标准化赠款的详细信息和选项
以下是撤销您的JWT访问令牌的步骤:
如果需要更多详细信息,请告诉我,我也可以共享代码(Java + Spring引导)。
对于您的问题:
问题1:这是另一个JWT,到期时间长,提出的索赔更少。
问题2:它将不在数据库中。后端将不会存储在任何地方。他们将只使用私钥/公钥解密令牌,并使用其到期时间对其进行验证。
问题3:是,正确
localStorage
而JWT应该存储在refreshToken
中httpOnly
。该refreshToekn
可以用来获得新的JWT所以它必须额外小心处理。
1)在这种情况下,他们使用uid而不是JWT。当他们刷新令牌时,他们发送刷新令牌和用户。如果将其实现为JWT,则无需发送用户,因为它将在JWT内部。
2)他们在单独的文档(表)中实现此目的。这对我来说很有意义,因为用户可以登录到不同的客户端应用程序中,并且每个应用程序都可以具有刷新令牌。如果用户丢失了安装了一个应用程序的设备,则该设备的刷新令牌可能会无效,而不会影响其他已登录的设备。
3)在此实现中,它使用访问令牌和刷新令牌对登录方法进行响应。它对我来说是正确的。
iat
JWT
您的意思是拥有refresh_token
里面的内容吗?如果是这样,OAuth RFC 6749明确表示不发送refresh_token
到资源服务器(并且JWT
发送到资源服务器):tools.ietf.org/html/rfc6749#section-1.5