我正在构建基于令牌的身份验证(Node.js使用带有角度客户端的passport / JWT)。
在用户输入他的凭据后,他获得了一个访问令牌,他在头部(header:bearer TOKEN)内的每个请求中发送该令牌。
我不想在每次访问令牌过期时都提示登录请求(关于我每天的猜测), 我听说过Refresh Tokens。刷新令牌永不过期(或很少过期)并且能够无限期地更新令牌。当访问令牌即将到期时,客户端可以通过发送刷新令牌发送续订请求以获取新的访问令牌。
我不了解一些事情,我可能会遗漏一些东西:
长寿/永不过期的刷新令牌如何破坏短生命的安全性 访问令牌。
Cookie可以被盗取并在到期前使用。代币生命短暂,因此更安全, 但如果我提供一个长期存在的刷新令牌,我将失去使用令牌的优势。
注意:我知道刷新令牌是在初次登录时发送的,因此在每个请求中都不会被欺骗,但如果它们在初始请求时被欺骗,则它们容易受到攻击。
答案 0 :(得分:4)
刷新令牌显示在与访问令牌不同的路径上:访问令牌仅呈现给资源服务器,刷新令牌仅呈现给授权服务器。访问令牌可以是自包含的,因此它不需要昂贵的调用授权服务器来检查其有效性,但是为了减少损失并提高准确性(如果出现问题则无法撤销)它是短暂的。刷新令牌是长期存在的,并且在每次调用授权服务器时都会得到验证,因此可以撤销它。两者的结合使系统安全。
答案 1 :(得分:0)
我使用以下方法:
表/索引:
身份验证流程
1。当先前未经身份验证的用户登录时,发出一个JWT,其中包含访问令牌和刷新令牌。更新JWT表中的刷新令牌以及user_id和访问令牌。
2。确保JWT的到期时间对您的用户来说很小/不舒服。通常不到一个小时。
4。当客户端通过JWT发出请求时
a。检查访问令牌的到期时间。如果令牌尚未过期->继续操作,不打任何数据库表。
b。如果访问令牌已过期,请在JWT表中查找user_id,并检查刷新令牌和访问令牌是否匹配,无论客户端提供了什么,
如果是,请使用响应发出新的JWT,并将新的刷新令牌,访问令牌更新到JWT表中。
如果否,则返回401。客户端被迫要求用户登录。
END。
总结
1.DB调用仅需要检查刷新令牌是否有效。
2。该系统允许用户使用任意数量的JWT从任意数量的设备登录
3。通过从JWT表中擦除与该用户相关的刷新令牌,可以使与该用户相关的所有JWT无效,例如:当用户更改其密码时。实际上,这缩小了访问令牌/ JWT到期时间的折衷范围。
我相信这是JWT背后的意图。数据库调用/用户的百分比取决于您的到期时间,用户通常在您网站上的停留时间等。