扩展 Keycloak 的正确方法是什么——例如通过服务提供者接口 (SPI)——用从另一个服务获取的信息来丰富发布的 JWT 令牌,但不将用户凭据检查委托给另一个服务?
您创建 - Keycloak 文档所指的 -协议映射器。它们是各种类型的,您可以通过转到Clients > your_client > Mappers菜单找到并尝试创建一个。此外,您应该看到您可以选择要丰富的 JWT 令牌,ID 令牌或访问令牌。在您的情况下,您需要足够自定义映射器的逻辑以从另一个服务获取信息。有两种类型的映射器允许(至少据我所知):
脚本映射器:允许您在 JavaScript 中编写自定义映射器,以便您可以实现服务调用并将结果添加到 javascript 中的令牌声明中。有关更多信息,请参阅Stackoverflow 上的示例和映射器的源代码。这有一些限制,例如不能正确支持多值声明。
直接在 Java 中实现映射器:完全灵活但工作量更大(实现 Java 接口AbstractOIDCProtocolMapper)。例如,请参阅此自定义 Keycloak 协议映射器以了解组成员身份。