在授权 JWT 令牌 OAuth2+OIDC 中使用 Claims 的边界

Boundaries of using Claims in the authorization JWT token OAuth2+OIDC

我们的主要产品是PublicAPI。我们使用 IdentityServer4 对我们的用户进行身份验证和授权。现在我正在和我的队友争论令牌中可以声明的信息的数量和类型。例如,通常我们在声明中添加用户标识符和用户所在组织的标识符。 另外,我们添加用户的配置,例如

有一个选项 - 在 JWT 令牌中仅保留用户标识符,并在 API 方法中请求所有配置属性。 从我的角度来看,在索赔中保留配置的主要优点是减少对其他服务和数据库的请求。

也许,关于我的问题的最佳实践来自可靠的来源,甚至在 RFC 中,声明中可以包含哪些信息?

没有任何 RFC 或标准可以说明哪些信息可以在声明中结束,哪些不能。我会尽量遵守这些准则:

  1. 尽量将令牌中的信息保持在所需的最低限度。不要仅仅因为某项服务可能不时需要它而将其放入索赔中。只放置大多数服务一直使用的那些声明,或者需要由授权服务器断言的信息。其他数据通常属于微服务本身,或者可以通过 API 调用轻松获取。如果您使用的是在 Internet 上公开可用的 JWT,这一点尤其重要,因为任何人都可以阅读这些信息。

  2. 尽量不要将个人身份信息放入 JWT 中,尤其是在令牌公开可用的情况下。当有人窃取此类令牌时,他们将能够读取您用户的 PII。如果您需要令牌中的此类信息,请考虑使用 Phantom Token 模式。这样信息就不会被窃听。

  3. 通过限制令牌中声明的数量,您还可以限制令牌的权限。最好使用权限较低的令牌,并在需要更多信息或特权时使用 token exchange

  4. 请记住,令牌中的声明是授权服务器与消费者(通常是 API)之间的合同。一旦您将某些内容添加到令牌中,您通常将无法将其删除,因为这将构成重大更改。

看看我们在 Curity 上写的这些文章,以获得更多关于处理声明和 JWT 的知识: