在权限上使JWT无效

时间:2017-03-07 11:27:42

标签: json refresh token jwt auth-token

人们通常会在JWT中存储权限吗?我见过可能有admin: truescopes: ['add_foo', 'delete_foo', 'read_foo']的示例。这似乎很好,其他如果有很多权限/范围,JWT可能会变大。它似乎非常有用,因为只要可以验证JWT,您就不需要访问数据库或缓存来获取用户权限。

我的主要问题是,如果权限发生变化,这些问题将如何失效。

例如,sys admin Joe撤消用户Bob的'add_foo'和'delete_foo'权限,但保留'read_foo'权限。在这种情况下,用户Bob不应该让他的令牌完全失效并且需要重新登录,他基本上应该被迫获得具有新权限的新JWT并继续正常进行。

我已经看到了解释在密码更改时发布新JWT的示例,但不同之处在于sys admin Joe对用户Bob进行了更新。因此,此工作流程中没有机会让用户Bob立即获得新令牌。

大多数示例都建议无效维护撤销令牌的黑名单,或更改数据库记录ID以使令牌不再有效,或者具有每用户机密并更改它。

我发现所有这些都可以用于撤销令牌并测试其无效,但用户如何获得新令牌?他们目前的JWT现在无效了吗?试图用它做任何事都应该失败。

我见过提到“刷新令牌”。这些广泛使用吗?它们在网络上是安全的还是主要用于难以获得刷新令牌的移动应用程序。似乎通过浏览器开发工具或类似工具窃取刷新令牌相当容易,然后有人可以永久访问该帐户,直到注意到未经授权的访问并撤销刷新令牌。

也许在这种情况下强迫用户Bob重新进行身份验证并不是一件大事?权限可能不会经常更改。

谢谢,迈克。

2 个答案:

答案 0 :(得分:0)

您可以设置过期日期(对于Web应用,我们通常使用15分钟 - 30分钟,移动设备为1周)。当您设置颁发声明参数(“ iat ”)时。然后,每次验证令牌时,都应检查令牌的“年龄”。如果超过5分钟,则从数据库加载数据并使用当前“ iat ”值创建新令牌。

答案 1 :(得分:0)

当权限更改时,您应该使此用户的已发行令牌无效。有不同的技术可供使用。见Invalidating client side JWT session

但是考虑到撤销令牌不是推荐的做法,因为你失去了JWT的一个主要优点:它不需要服务器存储。

Oauth2.0中定义的刷新令牌的目标是允许应用程序获取新的访问令牌而无需重新进行身份验证

  

刷新令牌是用于获取访问令牌的凭据。授权服务器向客户端发送刷新令牌,用于在当前访问令牌失效或过期时获取新的访问令牌,

如果权限不经常更改,则可能更容易重新对用户进行身份验证,如果他们更改了很多,请考虑他们是否真的应该包含在令牌中