节点js,JWT令牌和后面的逻辑

its*_*sme 9 javascript node.js express jwt express-jwt

我正在使用JWT保护节点js urls https://github.com/auth0/express-jwt

要创建JWT令牌用户会话,我只需:

-> auth/signup
    -> jwt.sign(user_profile,secret,expireInMinutes:{900000000 /*almost never expires*/});
Run Code Online (Sandbox Code Playgroud)

或者在登录电话的情况下

 -> auth/login
        -> jwt.sign(user_profile,secret,expireInMinutes:{900000000 /*almost never expires*/});
Run Code Online (Sandbox Code Playgroud)

每次调用受保护的URL时,我都会检查是否req.user由JWT中间件自动设置.

现在我想知道:

1 - 调用sign()时JWT令牌存储在哪里?

2 - 每次调用受保护的URL时,我是否必须验证()令牌?如果是,为什么?

3 - 当我为已经签名的用户设置新令牌时,旧令牌(如果存在)会被删除吗?如果未设置到期或例如5年后该怎么办?

4 - 为什么我不能在同一浏览器/应用页面上设置新令牌?如果我注册一个新令牌但令牌匹配(我已检查),我会收到无效的签名错误这就像我不能在同一个浏览器上签署多个用户

Ala*_*pin 17

您必须已经使用之前其他用户的回复找出了所有先前问题的答案,但我也会尝试为其他人清除一些问题:

1 - 调用sign()时JWT令牌存储在哪里?

当你调用sign时,签名的令牌不存储在任何地方,它由sign函数返回,然后你必须将它发送到客户端,以便可以存储在客户端.(例如会话存储,本地存储或cookie)

2 - 每次调用受保护的URL时,我是否必须验证()令牌?如果是,为什么?

是的你是.这个想法是,一旦客户端拥有令牌,他们就会在每次发出请求时将令牌发送到服务器.令牌由服务器处理以确定特定客户端是否已经过身份验证.

3 - 当我为已经签名的用户设置新令牌时,旧令牌(如果存在)会被删除吗?如果未设置到期或例如5年后该怎么办?

与第1点的答案略有关联.调用sign函数只会生成另一个令牌.令牌的到期存储在签名令牌本身中.因此,每次服务器从客户端获取令牌时,它都会将到期时间作为令牌验证的一部分进行检查.重要的是要注意,签名的令牌只是您在签名期间作为参数传入的"user_profile"对象,以及添加到该对象的额外字段,如到期日期.

因此,客户端可以在客户端存储多个令牌.只要它们尚未过期,它们都将有效.但是,我们的想法是,只有在旧客户端过期后再次对其进行身份验证时,才会向客户端发送令牌.

4 - 为什么我不能在同一浏览器/应用页面上设置新令牌?如果我注册一个新令牌但令牌匹配(我检查),我得到无效的签名错误就像我不能在同一个浏览器上签署多个用户

这个想法是每个浏览器有1个用户.因为在这种情况下浏览器是客户端.我想不出每个浏览器/客户端需要多个用户的用例,所以你显然做错了.这并不是说不可能将多个令牌发送到同一个浏览器/客户端.


wol*_*ski 8

  1. 您需要将令牌存储在客户端(本地存储或cookie)

  2. 是.HTTP是无状态的.如果您不是每次都进行验证,则有人可以在没有令牌或无效令牌的情况下调用您的URL.如果您担心性能,HMACSHA256检查速度非常快.

  3. 这没有意义,你必须做错事.