JWT 令牌中的无状态身份验证和权限

Posted

技术标签:

【中文标题】JWT 令牌中的无状态身份验证和权限【英文标题】:stateless authentication and permissions in the JWT token 【发布时间】:2021-08-05 02:02:45 【问题描述】:

    应用程序中的用户根据他们所在的组拥有权限

    我们希望将用户所在的组列表存储在 JWT 令牌中

    当用户被添加或从组中删除时,这实际上意味着权限发生了变化,这就是用户端应该发生的事情:

    如果它们已完全从系统中删除,用户会立即被踢回登录屏幕

    如果他们刚刚从组中删除,例如,用户不会被踢出

    他们被告知他们的权利已经更新,他们被告知请刷新页面

    当用户刷新时,他们停留在他们正在查看的页面上

    如果用户在他们不再有权访问的屏幕上,他们将被发送到主页

1.到目前为止,我们一直在编写无状态的 REST API,但这似乎打破了这一点。实现它的最佳方法是什么? 2. 如果我们要保持简单并确保无国籍,最好的方法是什么?

【问题讨论】:

【参考方案1】:

通过无状态身份验证,您的 ID 令牌包含您的群组信息,直到过期(通常是一个小时)才会更新。您可以将此持续时间减少到 5 分钟。这将是确保对组的任何更新快速反映在前端的最简单方法。这些代币是独立的,一旦发行就无法撤销。即使您运行全局注销 API 调用或忘记设备 API 调用,也只会撤销刷新令牌,而 ID 和访问令牌在到期之前仍然有效。

您提到的要求与无状态身份验证方法不兼容。当然,您可以创建一个“hacky”流程,其中您有一个数据库,该数据库记录被踢出的用户的 id,并且在每次调用之前它都会检查数据库,但这将是很多不必要的工作,而且您会打败整点使用无状态身份验证。

如果您想继续使用 cognito,我的建议是将所有令牌的到期时间减少到最小值。您还可以从流程中消除刷新令牌,但这意味着用户需要每 5 分钟登录一次。 但如果你真的需要实现这一点,我建议使用有状态的身份验证方法。

【讨论】:

如果我要使用物联网,是每个租户一个主题还是每个租户每个组一个主题,还是每个用户一个主题?

以上是关于JWT 令牌中的无状态身份验证和权限的主要内容,如果未能解决你的问题,请参考以下文章

使用 Angular 和 spring 进行 Jwt 身份验证

ASP.NET Core 中的 Jwt 令牌身份验证

PyGithub 中的 JWT 令牌身份验证问题

为啥验证函数中的令牌参数在 jwt 身份验证中显示错误?

如何跨不同 API 对 JSON Web 令牌 (JWT) 进行身份验证?

如何在 django rest 框架中验证 jwt 身份验证中的令牌