通过外部服务丰富 Keycloak 令牌的正确方法

Proper way to enrich Keycloak token via external service

扩展 Keycloak 的正确方法是什么——例如通过服务提供商接口 (SPI)——以使用从其他服务获取的信息丰富已发布的 JWT 令牌,但又不将用户凭证检查委托给其他服务?

您创建 - Keycloak documentation 所指的 - 一个 协议映射器 。它们有多种类型,您可以通过转到 Clients > your_client > Mappers 菜单找到它们并尝试创建一个。此外,您应该看到您可以选择要丰富的 JWT 令牌,ID 令牌或访问令牌。在您的情况下,您需要充分自定义映射器的逻辑以从其他服务获取信息。有两种类型的映射器允许这样做(至少据我所知):

  1. 脚本映射器:允许您在 Java脚本中编写自定义映射器,这样您就可以实现服务调用并将结果添加到 javascript 中的令牌声明中.见 the example on Whosebug, and source code of the mapper for more info. This has some limitations, e.g. does not support multi-valued claims properly.

  2. 直接在 Java 中实现映射器:完全灵活但工作量更大(实现 Java 接口 AbstractOIDCProtocolMapper)。例如参见this Custom Keycloak Protocol Mapper for group membership