Node.js 用于web应用的Nodejs Express JWT,带有数据库或会话以验证用户身份

Node.js 用于web应用的Nodejs Express JWT,带有数据库或会话以验证用户身份,node.js,express,session,jwt,Node.js,Express,Session,Jwt,我正在用Express server开发一个NodeJs,我对作为新标准的JWT身份验证有很多问题 主要问题是当我的应用程序中有一个admin users manager部分时。我不知道删除或避免客户端令牌访问的“好”方法 我读到过关于使用定义了短过期时间的令牌创建黑名单数据库的文章,但其想法是允许用户登录数月,而不必重写登录数据(类似于facebook)。在这种模式下,我认为黑名单数据库将是一个巨大的数据库 另一种选择是将所有令牌保留在数据库中,并在删除用户时根据该数据库删除令牌来验证所有请求

我正在用Express server开发一个NodeJs,我对作为新标准的JWT身份验证有很多问题

主要问题是当我的应用程序中有一个admin users manager部分时。我不知道删除或避免客户端令牌访问的“好”方法

我读到过关于使用定义了短过期时间的令牌创建黑名单数据库的文章,但其想法是允许用户登录数月,而不必重写登录数据(类似于facebook)。在这种模式下,我认为黑名单数据库将是一个巨大的数据库

另一种选择是将所有令牌保留在数据库中,并在删除用户时根据该数据库删除令牌来验证所有请求

或者,如果用户存在,只需根据用户DB测试验证所有请求。这种方法使用了大量的数据库交互

我可能对同一用户在不同设备上使用令牌有问题

另一方面,在前端,我必须通过ajax导航,或者将令牌动态添加到所有href链接。(可能是更好的方式?)


我必须使用这些方法中的任何一种吗?有更好的解决办法吗?使用会话会更好吗

如果您创建自己的JWT,您可以将该类型的信息存储在令牌本身中<代码>角色:“用户”或
isAdmin=true
。然后,在客户端应用程序上使用令牌时,如果他们不是管理员,则不显示这些页面

确保服务器上的API调用验证令牌,并检查特权。即使有人从web向管理端点(意外显示的页面或超级hax0rs)使用了客户端访问令牌,服务器也应该拒绝


如果访问类型不经常更改,例如“admin或not admin”,这种方法就可以工作。您可能不会一直将用户升级为管理员。如果您尝试了同样的方法来获得经常更改的更具体的访问权限,那将是一个混乱,因为您需要不断地重新发布令牌或修改令牌(这更难)

避免使用传统的DB或黑名单、白名单或某种注销/删除用户控制。这个问题可以通过使用jwt解决,jwt的过期时间很短(我用的是15分钟),让用户卸载(显然不是密码)

在每个请求中,我验证令牌的符号,如果用户在DB中仍然处于活动状态,则令牌是有效的(这解决了已删除用户的问题)。然后,它会生成一个新的令牌,该令牌的过期时间为15分钟,客户端会替换该令牌(旧的令牌最多只工作15分钟)

注销时,客户端将删除令牌(过期时间最多为15分钟,因此我认为这不会是保护JWTs无状态最终性的安全问题)

当用户从DB中删除时,其令牌将自动禁用(最多15分钟后将过期)(过期很重要,因为将来可能会有同名用户注册)

通过deffault,用户在访问应用程序时必须登录,但使用“让我签名”按钮,我们可以通过安全地将数据存储在客户端来解决tokem过期时间短的问题(我必须研究这部分是否适用)


这也解决了网络视图中的移动电话问题。

关于
会话
?它非常灵活,我想这肯定是你需要的,但我读到会话可能会有手机问题。过去我不必使用会话,因为我通常在前端工作,所以你知道在手机上集成Web和会话是否存在任何问题吗?也许我需要在没有浏览器的手机应用程序中集成网页,但问题不在于访问expecific私人区域的角色。这个想法是当管理员从数据库中删除一个用户时,这些方法中的哪一种可以更好地工作(或者我不知道的另一种方法,或者在这种情况下使用会话是否更可取)我在“会话的使用”方式中有一个传统的问题,即在没有浏览器的移动webview中集成web(我不知道它是否允许会话和cookie。我明白了。撤销JWT令牌类似于撤销会话密钥-必须检查“真相”。1)将令牌本身作为“白名单”跟踪,如果您可以在列表中找到引用的令牌,它仍然有效。如果需要撤销,请从列表中删除,我猜这意味着每次发出令牌时都会使用令牌标识符。或者2)检查每次访问的用户数据。令牌确保发送的内容不会更改和验证,用户访问是业务逻辑,也必须进行验证。但是,没有额外的令牌存储,令牌具有用户标识符,这是正常检查的。是的,问题是在数据库中存储令牌以在每个请求中进行验证需要一个数据库传统存储和大量对db的请求(更多服务器容量,可能更慢),并且会丢失jwt逻辑(无状态)为了测试每次访问的用户数据,必须将这些凭证存储在客户端上,这是一个不安全的选项。