使用express-session和JWT

6
我正在构建一个项目,与express-session和JWT有关,有一些问题需要解答。我有一个Express API服务器,想要使用某种API密钥来保护它,以确保只有授权应用程序能够访问我的数据。JWT可能可以胜任这个工作。然而,我还需要使用express-session对用户进行身份验证,并通过角色权限限制他们访问某些数据的部分(例如:基于角色的权限)。Next.js实例将作为前端服务器,保存并使用express-session的cookies,该会话将存储在MongoDB实例中。我是否能够在同一个项目中同时使用这两种身份验证方法?是否安全?有更简单的方法吗?如何实现权限呢?感激您所提供的任何帮助和提示。

首先,JWT 可以存储会话数据,您可以将其保存到 cookie 中或使用 localStorage 或任何客户端存储来获取数据。为了安全起见,会话不应以任何方式存储在数据库中,因为它需要定期刷新。您可以在 JWT 授权中保存用户 ID 和任何其他信息,例如用户名、电子邮件等,但不包括密码。这些信息应该在登录时添加到令牌中进行存储。 - Maielo
授权需要单独完成 - 在数据库中创建用户创建授权(取决于您如何执行,例如“管理员”,“用户”或使用整数,如1 = 管理员0 = 访客)。并且如我之前所述,在登录时将该引用保存到令牌中,然后在后端对每个请求进行检查以获取user.authorization并执行您想要执行的任何操作..例如发送不同的数据。 - Maielo
@Maielo 所以,通过仅使用JWT,我可以处理用户身份验证和应用程序身份验证?这是否适用于跨域请求?我的API和前端服务器是分别托管的,所以这是我关注的问题之一。 - Alejandro Otero Gómez
是的,JWT 基本上是带有签名哈希数据的 JSON 字符串。它发送到哪里并不重要。建议您在请求头中使用 Authorization: Bearer <token> - Maielo
1个回答

3

JWT(JSON Web Token)和Express-Session都能够实现相同的功能。它们的区别在于,浏览器不允许JavaScript访问http-only cookie。最终,它们都是用于相同的目的。

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

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


使用express-session + JWT是多余的,我猜。 - Renan Coelho
使用express-session + JWT是多余的,我猜。 - undefined
1
现在看起来很明显,但作为一个初学者,我花了一些时间才确定我需要:1)在JWT负载中存储用户ID,2)在每个需要安全性的路由中提升用户,3)在req对象中存储用户,以便用户信息对路由的其余处理可用。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接