当前位置: 首页 > 面试题库 >

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

乐正镜
2023-03-14
问题内容

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

要创建JWT令牌用户会话,我只需执行以下操作:

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

或在登录电话的情况下

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

每次调用受保护的URL时,我都会检查req.userJWT中间件是否自动设置了该URL 。

现在我想知道:

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

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

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

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


问题答案:

您必须已经使用其他用户的先前答复来弄清楚所有先前问题的答案,但是我也会尝试为他人解决一些问题:

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

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

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

是的你是。这个想法是,一旦客户端获得令牌,客户端将在每次发出请求时将令牌发送到服务器。服务器处理令牌,以确定特定的客户端是否已经通过身份验证。

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

与第1点的答案略相关。调用sign函数将仅生成另一个标记。令牌的到期时间存储在签名令牌本身中。因此,每次服务器从客户端获取令牌时,都会在令牌验证过程中检查过期时间。重要的是要注意,已签名的令牌只是您在签名期间作为参数传递的“
user_profile”对象,以及添加到该对象的其他字段(例如到期日期)。

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

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

这个想法是每个浏览器有1个用户。由于在这种情况下,浏览器是客户端。我无法想到用例中每个浏览器/客户端需要有多个用户,因此您显然做错了事。这并不是说不可能将多个令牌发送到同一浏览器/客户端。



 类似资料:
  • 问题内容: 我已经开始研究 Node JS了 。 这是我的文件。 index.html app.js webpack.config.js 更新 bundle.js 因此,当我点击一个 app.js 并访问地址(localhost:3000)时,我在控制台中得到了错误。 bundle.js:1未捕获的SyntaxError:意外的令牌< 另外我的JS文件没有运行。有人可以建议一些解决办法吗? 提前致

  • 在一个小项目上工作并使用jwt令牌进行了一些身份验证,整个过程如下所示: < li >在auth/register上生成jwt令牌以及刷新令牌 < li >使用令牌发出请求 < li >如果令牌过期,我将查询请求用户及其refreshToken,比较其当前请求refreshToken和数据库令牌 < li >如果令牌匹配,我将生成一个新令牌和一个新刷新令牌。 整个问题是第五步,假设我向“/me/f

  • 我有以下代码在Javascript中解码Jwt令牌(参考:如何在Javascript中解码Jwt令牌) 我从上面的代码中得到了我需要的有效负载,但我在节点中实现了它,那里我们没有“atob”函数来解码base64编码的字符串 似乎我们需要在节点中使用缓冲区。我做了研究,提出了下面的解决方案,但不起作用。 请让我知道是否有更好的方法-没有库(Jwt或decode-Jwt)

  • 什么应该是我的JWT身体的一部分?我在想uid和提供者提供了访问令牌。我在这里可以想到的一个问题是,提供程序特定的访问令牌可以更改。用户可以从提供商的站点撤消令牌,并再次使用emberjs注册。 我愿意在任何其他javascript客户端框架中编写前端,如果它使它更容易的话。

  • 我正在构建一个使用JWT进行身份验证的应用程序。我开始做一些研究,但对于诸如刷新令牌和令牌存储之类的主题缺乏共识,我感到惊讶。 据我所知,JWT和OAuth是两个不同的协议,它们遵循不同的规范。 但我的问题是,对于一个没有通过第三方资源服务器如Google、Facebook等认证的应用程序,有一个刷新令牌真的有用吗?为什么不让JWT令牌像刷新令牌一样持续时间长。 另一方面,我可以看到,如本文所述,

  • 这是我的身份验证流程: 用户登录后收到两个令牌(具有过期时间的访问令牌和没有过期时间的刷新令牌) 对于每个用户,刷新令牌存储在数据库中名为refreshTokens的json列中(这是一个数组) 在客户端,访问令牌和刷新令牌都存储在本地存储器上 当需要验证用户时,如果访问令牌过期,将使用刷新令牌创建一个新的访问令牌,并将其发送回用户并保持用户登录 当用户注销时,数据库中存储的刷新令牌(在refre