Node.js jwt令牌如何确保在数据库更改时更新有效负载

Node.js jwt令牌如何确保在数据库更改时更新有效负载,node.js,reactjs,jwt,express-jwt,Node.js,Reactjs,Jwt,Express Jwt,我有一个关于JWT令牌类型身份验证的概念的问题。 因此,假设我在用户登录后签署一个jwt令牌,该令牌负载包含用户名和用户角色。然后我将令牌返回给用户并存储在用户的本地存储中 现在,如果我在数据库中更改userrole,即从normalUser更改为AdminUser,那么如何确保用户的本地存储上的负载也会更改 我有一个问题,如果用户是管理员用户,当他登录时,jwt存储在他的本地存储中。之后,我将他的角色设置为普通用户,他仍然可以访问管理功能,因为他的本地存储包含AminUser角色 有人能建议一

我有一个关于JWT令牌类型身份验证的概念的问题。 因此,假设我在用户登录后签署一个jwt令牌,该令牌负载包含用户名和用户角色。然后我将令牌返回给用户并存储在用户的本地存储中

现在,如果我在数据库中更改userrole,即从normalUser更改为AdminUser,那么如何确保用户的本地存储上的负载也会更改

我有一个问题,如果用户是管理员用户,当他登录时,jwt存储在他的本地存储中。之后,我将他的角色设置为普通用户,他仍然可以访问管理功能,因为他的本地存储包含AminUser角色

有人能建议一种正确的方法来实现授权,以便在用户端更新令牌吗?
谢谢。

更改用户授权的触发因素是什么?如果您说您正在打开数据库客户端(例如MySQL或PostgreSQL)并手动更改用户的授权,那么您的服务器或客户端无法知道该更改(至少据我所知),并且他们无法对该特定更改做出反应

如果您的触发器是用户发送的某个请求,例如
注销
更改授权
,那么您应该使用该特定请求的新令牌进行响应并将其存储,easy peasy

如果您的触发器与您的客户机无关,并且它是在您的服务器端发生的,那么您应该在服务器和客户机之间打开一个套接字,并将更改从服务器发送到客户机

这样,您就可以确保客户始终是最新的


但这还不够,因为你让客户保持最新,但是如果他保存了令牌并在你更新后替换了它呢?他/她仍然可以访问管理员功能,即使你告诉他们他们只是普通用户。为此,您需要验证您的任何用户所做的每个请求,并首先检查他们是否被允许提出该请求。

您不能真正信任客户。您应该找到一种使jwt令牌无效的方法。当您拒绝您的客户机时,您的客户机应该获得一个新的令牌。您可以使用刷新键旋转令牌

为此:

  • 保持你的代币寿命短
或:

  • 将列入黑名单的令牌存储在数据库中,并拒绝失效的令牌
是的,我认为这会很困难,因为我们没有仪表板来分配或更改用户角色,所以现在可以通过手动更改数据库来实现。因为它是一个react应用程序,所以我使用state在客户端存储令牌。这应该不是问题,因为这里是您要查找的流程用户是Admin>我更改数据库并使其成为普通用户>用户保留令牌(不知何故)>用户使用管理员令牌发送请求>我检查数据库>我发现用户不是管理员,因为他声称>我拒绝请求。有了这个流程,即使没有套接字或触发器,你也可以做你想做的事情。不过这有副作用,所以如果我做相反的事情,例如,一个普通用户>我给他分配了一个管理员用户>他试图访问管理员功能,他被拒绝了,因为他的令牌是普通用户的,除非我不在令牌中存储用户角色,每当我收到对api服务器的请求时,我都会检索用户对象并检查服务器端的角色。这正是我要说的。我存储在localStorage中,所以也许我应该在会话中存储令牌,并缩短生命周期。这样他们将被迫更频繁地重新登录。我认为这是目前最好的方法,因为我们没有足够的时间来实现更复杂的逻辑。请记住,这不是真正安全的方法。您应该将过期数据保存在jwt令牌中。您的后端应该控制身份验证和授权。您可以在localStorage中设置jwt令牌的过期时间吗?