Nodejs Express 用于 Web 应用程序 JWT,带有数据库或会话以验证用户身份
Posted
技术标签:
【中文标题】Nodejs Express 用于 Web 应用程序 JWT,带有数据库或会话以验证用户身份【英文标题】:Nodejs Express for web aplication JWT with database or sessions to authenticate users 【发布时间】:2019-06-24 00:15:00 【问题描述】:我正在开发一个带有 Express 服务器的 NodeJ,但我在 JWT 身份验证方面遇到了很多问题,而 JWT 身份验证应该是新标准。
主要问题是当我的应用程序中有一个管理员用户管理器部分时。我不知道删除或避免客户端令牌访问的“好”方法。
我读到过使用定义了短到期时间的令牌创建黑名单数据库,但其想法是允许用户登录数月而不必重写登录数据(类似于 facebook)。在这种模式下,我认为黑名单数据库将是一个巨大的数据库。
另一种选择是将所有令牌保留在数据库中,并在删除用户时验证针对该数据库删除令牌的所有请求。
或者如果用户存在,则简单地针对用户数据库测试验证所有请求。此方法使用大量数据库交互。
我可能对同一用户在不同设备上使用令牌有疑问。
另一方面,在前端,我将不得不通过 ajax 导航或将令牌动态添加到所有 href 链接。 (可能是更好的方法?)
我必须使用其中任何一种方法吗?有更好的解决方案吗?使用会话会更好吗?
【问题讨论】:
sessions
怎么样?它是如此灵活,我想这绝对是您所需要的
可能,但我读到会话可能会出现手机问题。过去我不必使用会话,因为我通常在前端工作,所以你知道在手机上集成 web 和会话是否存在任何问题?可能我也需要在没有浏览器的手机应用程序中集成网络
【参考方案1】:
如果您创建自己的 JWT,则可以将该类型的信息存储在令牌本身中。 role: 'User'
或 isAdmin = true
。然后在客户端应用上使用令牌时,如果他们不是管理员,则不要显示这些页面。
确保您在服务器上的 API 调用验证令牌,并检查权限。即使有人使用他们的客户端访问令牌从 Web 到管理端点(页面意外显示或超级 hax0rs),服务器也应该拒绝。
如果访问类型不经常更改,例如“管理员或非管理员”,这种方法就可以工作。您可能不会一直将用户升级为管理员。如果您尝试使用相同的方法来获得经常更改的更具体的访问权限,那将是一团糟,因为您需要不断重新发行令牌或编辑令牌(这更难)。
【讨论】:
感谢您的回复,但问题不在于访问特定私人区域的角色。这个想法是当管理员从数据库中删除用户时,哪些方法可以更好地工作(或者我不知道的另一种方法,或者在这种情况下使用会话是否更可取)我在“使用session”的方式,关于在没有浏览器的情况下将 web 集成到移动 webview 中(我不知道它是否允许 sessins 和 cookie。 我明白了。撤销 JWT 令牌类似于撤销会话密钥 - 必须检查“真相”。 1)将令牌本身作为“白名单”进行跟踪,如果您可以在列表中找到引用的令牌,它仍然有效。如果需要撤销,请从列表中删除,我猜这意味着每次发出令牌标识符。或者 2) 检查每次访问的用户数据。令牌确保发送的内容不被更改和验证,用户访问是业务逻辑,也必须经过验证。虽然没有额外的令牌存储,但令牌具有用户标识符并且可以正常检查。 是的,问题在于将令牌存储在数据库中以在每个请求中进行验证需要额外的数据库存储和大量对 db 的请求(更多的服务器容量并且可能更慢)并且丢失了 jwt 逻辑(无状态) 并且为了在每次访问时测试用户数据,必须将这些凭据存储在客户端上,这是一个不安全的选项。【参考方案2】:为了避免使用额外的数据库或黑名单、白名单或某种注销/删除用户控制。使用过期时间较短的 jwt(我使用 15 分钟)让用户取消播放负载(显然不是密码)可以解决问题。
在每个请求中,我都会验证令牌的符号,如果用户在 DB 中仍然处于活动状态,则令牌是有效的(这解决了已删除用户的问题)。然后它会生成一个新的令牌,其过期时间为 15 分钟,客户端替换令牌(旧的令牌最多只能工作 15 分钟)
注销时,客户端会删除令牌(过期时间最长可能为 15 分钟,所以我认为这不会是保持 JWT 的无状态最终性的安全问题)
当用户从数据库中删除时,他的令牌会自动禁用(并且最多会在 15 分钟内过期)(过期很重要,因为将来可能会出现同名用户注册的情况)
默认情况下,用户在访问应用程序时必须登录,但是通过“保持我签名”按钮,我们可以通过将数据安全地存储在客户端来解决令牌过期时间短的问题(我必须研究是否这样做部分适用)。
这也解决了webviews里面的手机问题。
【讨论】:
以上是关于Nodejs Express 用于 Web 应用程序 JWT,带有数据库或会话以验证用户身份的主要内容,如果未能解决你的问题,请参考以下文章
当同时使用 GraphQL 时,Nodejs 和 Express 在 MERN 堆栈 Web 应用程序中的作用是啥?