对于刷新令牌轮换以及更新刷新令牌和访问令牌方式,我想知道,对于同一用户,他或她是否打开不同的浏览器并登录。这意味着,对于同一用户,令牌轮换会认为它被盗了。我说得对吗?
如果我不希望这种情况发生,我可以使用IP结合用户ID来识别用户吗?安全吗?我知道如果是共享IP,那就不是。
有什么是黑客无法伪造的,可以区分黑客和用户的吗?我认为 Phone 有某种设备 ID。浏览器怎么样?
我认为你混淆了完全不同的概念
访问令牌和刷新令牌用于授权。用户授予您的应用程序访问其数据的权限。用户不必在场即可发生这种情况。使用访问令牌来证明用户身份并不是正确的做法。
您应该使用 open id connect 来验证用户 - 让他们登录。然后您应该获得一个包含声明的 id 令牌,这些声明之一是主题声明,它应该是您要连接到的系统上的用户 ID 。您应该使用它来识别用户。
访问令牌的生命周期很短,它们将使您的应用程序在有限的时间内(通常是一个小时)访问系统。如果黑客获得了访问令牌,他们也可以在这一小时内访问系统。访问令牌是独立的。不进行进一步验证。
刷新令牌需要客户端 ID 和客户端密钥才能请求新的访问令牌。因此,黑客需要将您的客户端 ID、客户端密钥置于有效的重定向 uri 之一上。以请求新的访问令牌。这就是为什么你不应该将重定向 uri 设置为 localhost。
就登录而言,黑客需要用户登录名和密码才能登录并取回 ID 令牌。您应该很好地假设这不是黑客,而是机器背后的用户。
每个浏览器和设备都会有不同的刷新和访问令牌,因此不会触发令牌重用检测。如果同一浏览器有多个选项卡,那么如果一个选项卡更改了 cookie 中的刷新令牌,其他选项卡也将开始使用新的刷新令牌。
我只是将用户 id 存储在令牌中,以便能够通过 id 找到用户并检查字段
refreshTokens: [String]
。 代码
createAccessToken(id) {
return jwt.sign(
{
id,
},
ACCESS_TOKEN_SECRET,
{ expiresIn: access_token_expires_in }
)
},
createRefreshToken(id) {
return jwt.sign(
{
id,
},
REFRESH_TOKEN_SECRET,
{ expiresIn: refresh_token_expires_in }
)
}