人们通常是否将权限存储在JWT中?我见过的例子可能有admin: true
或scopes: ['add_foo', 'delete_foo', 'read_foo']
。这看起来很好,除此之外,如果有很多权限/范围,JWT可能会变得很大。看起来它会非常有用,因为只要JWT可以验证,您就不需要访问数据库或缓存来获取用户权限。权限上的JWT失效
但我的主要问题是如何在权限更改的情况下这些将被无效。
例如,系统管理员Joe撤消用户Bob的'add_foo'和'delete_foo'权限,但保留'read_foo'权限。在这种情况下,用户Bob不应让他的令牌完全失效并需要重新登录,他应该基本上被迫使用新的权限获得新的JWT并继续正常运行。
我见过的例子解释了在发生密码更改时发布新的JWT,但这里的区别在于系统管理员Joe对用户Bob进行了更新。因此,用户Bob在此工作流中没有机会立即获取新令牌。
大多数示例都建议维护被吊销令牌的黑名单,或者更改数据库记录ID以使令牌不再有效,或者拥有每个用户的机密并更改该凭证。
我看到所有这些都可以用于撤销令牌并测试其无效,但用户如何获得新令牌?他们目前的JWT现在是无效的?试图用它做任何事情都会失败。
我见过提到“刷新令牌”。这些广泛使用?他们是否安全在网上或主要用于刷新令牌难以获得的移动应用程序。似乎通过浏览器开发工具或类似软件窃取刷新令牌似乎是相当容易的,然后有人可以永久访问该帐户,直到发现未经授权的访问并撤销刷新令牌为止。
也许在这种情况下强制用户Bob重新认证并不是什么大不了的事?权限可能不会经常更改。
谢谢,迈克。