5

我正在构建一个基于令牌的身份验证(Node.js 使用带角度客户端的护照/JWT)。

用户输入他的凭据后,他会获得一个访问令牌,他会在每个请求的标头(标头:bearer TOKEN)中发送该令牌。

我不想每次他的访问令牌过期时都提示登录请求(我猜是每天),我听说过Refresh Tokens。刷新令牌永远不会过期(或很少过期)并且能够无限期地更新令牌。当访问令牌即将过期时,客户端可以通过发送他的刷新令牌来发送更新请求以获取新的访问令牌。

我不明白一些事情,我可能会遗漏一些东西:

  1. 长期/永不过期的刷新令牌如何不会破坏拥有短期访问令牌的安全性。

  2. Cookie 可以被窃取并使用到过期为止。令牌是短暂的,因此它们更安全,但如果我提供一个长期刷新令牌,我将失去使用令牌的优势。

注意:我知道刷新令牌是在初始登录时发送的,因此不能在每个请求中都被欺骗,但如果它们在初始请求中被欺骗,它们很容易受到攻击。

4

2 回答 2

4

刷新令牌呈现在与访问令牌不同的路径上:访问令牌只呈现给资源服务器,刷新令牌只呈现给授权服务器。访问令牌可以是自包含的,因此它不需要对授权服务器进行昂贵的调用来检查其有效性,但是为了减少损失并提高准确性(如果出现问题,它不能被撤销)它是短暂的。刷新令牌是长期存在的,并且在每次调用授权服务器时都会得到验证,因此它可以被撤销。两者的结合使系统安全。

于 2014-12-08T13:50:48.940 回答
0

我使用以下方法:

表/索引:

  1. 用户表(只有用户 ID 和所有用户相关的元数据)
  2. JWT 表(三个字段:user_id、access_token、refresh_token)

身份验证流程

1.当以前未经身份验证的用户登录时,发出一个包含访问令牌和刷新令牌的 JWT。更新 JWT 表中的刷新令牌,连同 user_id 和访问令牌。

2. 确保 JWT 的过期时间对您的用户来说是小而舒适的。通常不到一个小时。

4.当客户端使用 JWT 发出请求时

一个。检查访问令牌的到期时间。如果令牌尚未过期-> 继续而不命中任何数据库表。

湾。如果访问令牌已过期,则在 JWT 表中查找 user_id,并检查刷新令牌和访问令牌是否匹配,无论客户端提供什么,

如果是,则发出带有响应的新 JWT 并将新的刷新令牌、访问令牌更新到 JWT 表中。

如果否,则返回 401。客户端被迫要求用户登录。

结尾。

总结一下,

1.DB调用只需要检查刷新令牌是否有效。

2.该系统允许用户从任意数量的设备登录,使用任意数量的 JWT

3.通过从JWT表中擦除与该用户相关的刷新令牌,可以使与用户相关的所有JWT无效,例如:当用户更改他/她的密码时。实际上,这缩小了访问令牌/JWT 到期时间的妥协窗口。

我相信这是智威汤逊背后的意图。数据库调用/用户的百分比取决于您的到期时间、用户通常在您网站上的持续时间等。

于 2020-08-16T11:21:07.487 回答