0

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

不过,我的主要问题是,如果发生权限更改,这些将如何失效。

例如,系统管理员 Joe 撤销了用户 Bob 的“add_foo”和“delete_foo”权限,但保留了“read_foo”权限。在这种情况下,用户 Bob 不应该让他的令牌完全失效并需要重新登录,他基本上应该被迫获得一个具有新权限的新 JWT 并照常继续。

我看过一些解释在密码更改时发布新 JWT 的示例,但这里的不同之处在于系统管理员 Joe 对用户 Bob 进行了更新。因此,用户 Bob 在此工作流程中没有机会立即获得新令牌。

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

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

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

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

谢谢,迈克。

4

2 回答 2

0

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

于 2017-03-07T14:27:56.130 回答
0

当权限更改时,您应该使该用户的颁发令牌无效。有不同的技术可以使用。请参阅使客户端 JWT 会话无效

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

正如Oauth2.0中定义的那样,刷新令牌的目标是允许应用程序获得新的访问令牌而无需重新验证

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

如果权限不经常更改,则重新验证用户可能更容易,如果更改很大,请考虑是否真的应该将它们包含在令牌中

于 2017-03-08T08:21:52.463 回答