JWT的有效载荷中应包括访问权限和角色吗?


9

JWT是否应包含有关客户端的权限和角色的信息?

在JWT令牌中具有此类信息将非常有用,因为每次有有效令牌出现时,都将更容易提取有关用户权限的信息,并且无需为此调用数据库。但是,将这样的信息包括在数据库中而不对它们进行仔细检查是否会带来安全问题?

要么,

诸如上述信息之类的信息不应成为JWT的一部分,而应该仅使用数据库来检查用户的访问角色和权限?

Answers:


7

将声明包含在令牌中的目的是使您不必在资源和身份验证提供程序之间进行通信。

资源仅可以检查令牌是否具有有效签名并信任内容。

假设私钥对身份验证服务器是私有的,那么您就很好。一些提供商改变了密钥以减轻风险。

如果您考虑一下,资源是否会回拨给auth服务器以获取声明。然后,从根本上确保它通过类似的信任方法与正确的服务器通信。


非常感谢您提供一个漂亮的答案,我是否可以从“某些提供者更改其密钥以减轻风险”的声明中进一步了解您的意思。?
Anshul Sahni

1
因此,除了具有固定的签名密钥外,身份验证提供程序还会如此频繁地对其进行更改,并为资源服务器提供端点以下载公共部分。资源必须每隔一段时间就对auth服务器进行一次调用,但每个请求都不必进行一次调用
Ewan 2013年

因此,每次服务更改密钥签名时,所有令牌都是无效的
Anshul Sahni

1
通常,它们将具有多个可能的密钥,以使飞行中的令牌不会失效。令牌将包含一个“密钥ID”以告诉资源使用哪个密钥
Ewan

我在这里唯一想念的是JWT中的数据无效时如何进行。假设角色在服务器端已更改,但是客户端仍然拥有具有所有角色集的令牌。您必须能够在服务器端撤消令牌,以便那些包含过时信息的令牌不再有效,可用于进一步的请求。这与Ewans出于某种原因(允许服务器撤销令牌)提出的建议是一致的。
Laiv

1

根据我的经验,如果您的所有系统都使用某个中央角色和权限数据库,则可以将所有内容添加到JWT中。

但是,当auth服务器本身对接收和信任令牌的目标系统一无所知时,此方法在SSO方案中可能无法很好地工作。

用户的角色和权限完全取决于JWT令牌的接收者。当您将具有JWT的SSO auth集成到一些已有其权限子系统的旧系统中时,尤其如此,因此它们仅需要在JWT中存在一个声明-用户身份声明。


我同意这一点。用户权限不应特别是在SSO中成为jwt的一部分,因为idp并不知道该用户jwt将要与之通信的其他服务..相反,一旦为用户确认了身份,资源应实现授权部分
Manish Rawat

我还同意,除了简单的整体式API外,JWT中的权限声明不是一个好主意。:我写了一个博客帖子大约是sdoxsee.github.io/blog/2020/01/06/...
sdoxsee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.