使用 express-session 和 JWT

Posted

技术标签:

【中文标题】使用 express-session 和 JWT【英文标题】:Use of express-session and JWT 【发布时间】:2019-05-14 10:46:04 【问题描述】:

在我正在构建的项目中,我有很多关于 express-session 和 JWT 的问题。

我有一个 Express API 服务器,我想使用某种 API 密钥来保护它,以确保只有授权的应用程序才能访问我的数据。 JWT 可能会完成这项工作。但是,我还需要对用户进行身份验证并限制他们使用 express-session 访问数据的某些部分(例如基于角色的权限)。

前端服务器将是一个 Next.js 实例,它将保存并使用 cookie 进行快速会话。会话将存储在 MongoDB 实例中。

我可以在同一个项目中使用这两种身份验证方法吗?会安全吗?有没有更简单的方法呢?如何实现权限?

任何帮助和提示将不胜感激。

【问题讨论】:

首先,JWT 可以存储会话数据,您可以将其保存到 cookie 中或使用localStorage 或任何客户端存​​储来获取数据。由于安全原因需要刷新会话,因此不应以任何方式将会话存储在数据库中。您可以保存在登录时应添加到令牌中的 JWT 授权,还可以存储在令牌用户 ID 和您需要的任何其他信息中,例如用户名电子邮件等但不是密码。 Authorization 需要单独完成 - 在 db 中创建用户创建授权(完全取决于您将如何操作,例如“admin”、“user”或使用整数,如 1 = admin 0 =客人 )。正如我在登录时将该引用保存到令牌之前所说的那样,然后检查后端的每个请求 user.authorization 并做任何你想做的事情..例如发送不同的数据 @Maielo 那么通过专门使用 JWT 我可以处理用户身份验证和应用身份验证吗?这适用于跨域请求吗?我的 api 和前端服务器是分开托管的,所以这是我关心的问题之一。 是的 JWT 基本上是 JSON 字符串,在数据后面带有签名散列。你把它寄到哪里都没关系。建议您在请求中使用标头Authorization: Bearer <token> 【参考方案1】:

JWT 和 Express-Session 都完成了同样的事情。不同之处在于浏览器不允许通过 javascript 访问仅限 http 的 cookie。最后,它们都用于同一目的。

jwt 应该与用户的会话相关,因此用户权限是最重要的。这些可以在数据库中实现并与用户相关。他有这个权限还是他的角色有这个权限是你要放在路由上的中间件。

如果使用 express-session,我个人会采用相同的方法。

【讨论】:

以上是关于使用 express-session 和 JWT的主要内容,如果未能解决你的问题,请参考以下文章

使用 passport.js、mysql 和 express-session 保持登录状态

express-session 和 cookie-session 有啥区别?

与 socket.io 一起使用时 express-session 未设置会话 cookie

node的cookie-parser和express-session

使用 Passport.js、express-session 和 express-mysql-session 进行用户身份验证

什么时候应该将 cookie-parser 与 express-session 一起使用?