我将用户角色存储在JWT中(以限制API端点)。管理员可以更改角色。
如果角色发生了变化。我怎么能在所有代币中反映这一点?我考虑过几个解决方案:
如果我使用刷新令牌,则用户必须等到访问令牌的到期日期到期。
我可以记录已更改的用户ID并检查每个请求,然后在用户更改后返回新令牌。
有没有标准的方法来做到这一点?
我将用户角色存储在JWT中(以限制API端点)。管理员可以更改角色。
如果角色发生了变化。我怎么能在所有代币中反映这一点?我考虑过几个解决方案:
如果我使用刷新令牌,则用户必须等到访问令牌的到期日期到期。
我可以记录已更改的用户ID并检查每个请求,然后在用户更改后返回新令牌。
有没有标准的方法来做到这一点?
如果您关心即时更改,刷新令牌似乎不是解决方案,如果您撤消其权限,您可能不希望用户访问审核工具一段时间。
您可以做的是在jwt令牌中保留相对于用户的版本号,就像mongoose如何使用它一样 versionKey。通过这样做,您将能够针对给定用户的数据库中的版本检查此版本。每次更改此用户的角色时,如果jwt的版本不匹配,您将增加此版本,只需重新创建具有正确角色和版本的新版本并将其发送回用户。
我不相信有一个适当的标准,因为jwt是设计不可变的,如果你需要“更新”它,你必须完全改变它。
JWT令牌是不可变的,因此您无法更改/更新现有令牌的声明 - 因此您必须发出新的JWT令牌。
这导致了JWT的最大问题 - 令牌撤销。没有好的解决方案。你能做的是
保持JWT到期日期短(并可选择使用刷新令牌)
使用黑名单来保存已撤销的令牌列表(当然这样会丢失'无状态'部分)
更改密钥(请记住,这会撤消所有用户的所有有效令牌)
最好的解决方案取决于具体情况。
为了解决这种情况,您可以保持令牌生命周期短,一旦令牌过期,您可以在隐式授权的情况下以静默方式续订令牌,或者使用刷新令牌机制从授权服务器发出新令牌。一旦角色发生变化,它可能不会立即反映在令牌中,但一旦令牌更新,它就可用。