通过外部服务丰富 Keycloak 令牌的正确方法
Proper way to enrich Keycloak token via external service
扩展 Keycloak 的正确方法是什么——例如通过服务提供商接口 (SPI)——以使用从其他服务获取的信息丰富已发布的 JWT 令牌,但又不将用户凭证检查委托给其他服务?
您创建 - Keycloak documentation 所指的 - 一个 协议映射器 。它们有多种类型,您可以通过转到 Clients > your_client > Mappers
菜单找到它们并尝试创建一个。此外,您应该看到您可以选择要丰富的 JWT 令牌,ID 令牌或访问令牌。在您的情况下,您需要充分自定义映射器的逻辑以从其他服务获取信息。有两种类型的映射器允许这样做(至少据我所知):
脚本映射器:允许您在 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.
直接在 Java 中实现映射器:完全灵活但工作量更大(实现 Java 接口 AbstractOIDCProtocolMapper
)。例如参见this Custom Keycloak Protocol Mapper for group membership。
扩展 Keycloak 的正确方法是什么——例如通过服务提供商接口 (SPI)——以使用从其他服务获取的信息丰富已发布的 JWT 令牌,但又不将用户凭证检查委托给其他服务?
您创建 - Keycloak documentation 所指的 - 一个 协议映射器 。它们有多种类型,您可以通过转到 Clients > your_client > Mappers
菜单找到它们并尝试创建一个。此外,您应该看到您可以选择要丰富的 JWT 令牌,ID 令牌或访问令牌。在您的情况下,您需要充分自定义映射器的逻辑以从其他服务获取信息。有两种类型的映射器允许这样做(至少据我所知):
脚本映射器:允许您在 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.
直接在 Java 中实现映射器:完全灵活但工作量更大(实现 Java 接口
AbstractOIDCProtocolMapper
)。例如参见this Custom Keycloak Protocol Mapper for group membership。