我正在使用Express服务器开发NodeJ,而JWT身份验证存在许多问题,这些问题被认为是新标准。
主要问题是我的应用中有一个admin users manager部分。我不知道删除或避免客户端令牌访问的“好方法”。
我读过关于使用定义了短到期时间的令牌来制作黑名单数据库的想法,但其想法是允许用户登录数月,而不必重写登录数据(例如facebook)。在这种模式下,我认为黑名单数据库将是一个庞大的数据库。
另一种选择是将所有令牌保留在数据库中,并在删除用户时针对该数据库删除令牌的所有请求进行验证。
或简单地验证对用户的所有请求DB测试是否用户存在。这种方法需要大量的数据库交互。
我可能在不同设备上遇到相同用户连令牌的问题。
另一方面,在前端,我将不得不通过ajax进行导航或将令牌动态添加到所有href链接。 (也许是更好的方法?)
我必须使用任何一种方法吗?有更好的解决方案吗?可以更好地使用会话吗?
答案 0 :(得分:0)
如果创建自己的JWT,则可以将这种类型的信息存储在令牌本身中。 role: 'User'
或isAdmin = true
。然后,在客户端应用程序上使用令牌时,如果他们不是管理员,则不要显示这些页面。
确保服务器上的API调用验证令牌,并检查特权。即使有人使用了从Web到管理端点的客户端访问令牌(页面意外显示或出现超级错误),服务器也应拒绝。
如果访问类型不经常更改(例如“ admin或not admin”),则这种方法有效。您可能不会一直将用户升级为管理员。如果您尝试使用同一件事来更改经常更改的更特定的访问权限,那将是一团糟,因为您需要不断重新发行令牌或编辑令牌(这比较困难)。
答案 1 :(得分:0)
为避免使用附加数据库或黑名单,白名单或某种注销/删除用户控件。可以使用过期时间很短的jwt(我使用的是15分钟)来解决此问题,因为该用户没有播放负载(显然不是密码)。
在每个请求中,我都会验证令牌的符号,如果用户仍在数据库中处于活动状态,则该令牌有效(这解决了删除用户的问题)。然后它会使用15分钟的新过期时间生成一个新令牌,然后由客户端替换该令牌(旧令牌仍只能工作15分钟)
注销时,客户端会删除令牌(过期时间最多为15分钟,因此我认为保留JWT的无状态最终性不是安全问题)
将用户从数据库中删除后,其令牌将被自动禁用(最多15分钟将过期)(重要的是过期,因为将来可能会有同名用户注册)>
通过deffault用户必须在访问应用程序时登录,但使用“保持签名”按钮,我们可以通过将数据安全地存储在客户端上来解决托克姆过期时间短的问题(我必须研究是否部分适用)。
这也解决了网络视图中的手机问题。