如何在 NodeJS 中使用 JWT 令牌验证路由

Posted

技术标签:

【中文标题】如何在 NodeJS 中使用 JWT 令牌验证路由【英文标题】:How to verify routes with JWT token in NodeJS 【发布时间】:2020-11-18 13:11:06 【问题描述】:

亲爱的,

我正在尝试使用 JWT 令牌来授权我的用户。在数据库中确认用户和密码后,将创建一个 JWT 令牌。我还制作了一个中间件来验证该令牌并在我创建的某个路线上使用该中间件。使用 Postman 在标头插入令牌测试此路由,一切正常,但是当我尝试在浏览器上使用它时,令牌在我登录后存储在登录标头中,但是当我重定向时(使用 res.redirect ('/dashboard')) 我无法访问仪表板页面,因为令牌仅在登录标题处,而不在仪表板标题处。

您知道如何使该令牌在我的所有环境中都可用吗?或者路由授权的最佳方式是什么?

非常感谢您的帮助!

【问题讨论】:

你可以使用cookies或者localStorage 您可以使用passport-jwt。它更好。或者你可以问我解决办法? 【参考方案1】:

您可以使用会话或 cookie 并将该令牌存储在其中并设置到期时间限制。

【讨论】:

感谢您的帮助!我从未使用过会话,事实上这是我的第一个网络应用程序。我可以使用“express-session”创建一个会话并将令牌存储在该会话中。那是对的吗?如果是,我必须将 sessionID 保存在某个数据库中,否则不需要? 会话 ID 可以在客户端本地存储为 cookie。当您拥有大量用户时,您可以使用数据库,将会话存储在数据库中被认为是一种很好的做法,但不是必需的。当向服务器发出请求时,服务器会传输包含会话 ID 的 cookie。 但是如果用户尝试在隐私模式下使用网络应用程序,默认情况下无法保存cookie,对吧?有没有办法防止这种情况发生? 这就是私人模式的用途。在这种模式下浏览器不会存储历史记录、cookies、表单数据等。【参考方案2】:

使用sessionStorage 让您的 JWT 在用户的浏览器上持久存在:

sessionStorage.setItem('JWT', 'my.jwt.data');

然后,使用getItem 取回它:

const jwt = sessionStorage.getItem('JWT');

【讨论】:

据此 (***.com/questions/38495168/…) 我无法在 NodeJS 中使用 sessionStorage。我试过了,但失败了。你认为有办法通过“express-session”来完成这项工作吗? 我明白了。然后,我了解您希望能够在后端访问 JWT,因为它应该存在于 req.headers 中。由前端向您发送 authorization 标头(或任何类似标头),很可能使用 localStorage 存储在浏览器中,您可以在其中访问 JWT。然后,您使用jwt.decode 对其进行解码。

以上是关于如何在 NodeJS 中使用 JWT 令牌验证路由的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 JWT 在 Express 中验证单个路由(无代码重复)的多种类型用户的身份验证令牌?

如何验证nodejs中的jwt令牌/永不过期?

加密 Nodejs JWT 令牌

如何在 ReactJS 上使用 JWT 令牌注销

如何在 NodeJs 中使用 .pfx 证书和密码验证 Bearer 令牌?

如何通过 vue 路由器和服务器提供的 JWT 令牌管理用户身份验证?