我们使用Keycloak服务作为SSO解决方案,并将结果JWT提供给不同的微服务,并且效果非常好。
但现在我们遇到的问题是,当用户尝试登录时,JWT必须使用外部资源的数据进行扩展。
更明显的是,用户可以访问具有唯一ID作为标识符的不同市场,但我们没有看到管理用户可以访问Keycloak服务中的哪个市场。
这个问题的最佳解决方案是什么? 在阅读文档之后,自定义用户存储SPI就是一个答案,但我认为这有点太多了..
作为信息,我们使用Keycloak 3.1.0作为带有postgres DB的独立服务
答案 0 :(得分:0)
向密钥斗篷JWT令牌有效负载添加额外数据/信息的方式是通过在其中添加配置了适当的协议映射器的“客户端范围”来进行的,从而可以添加任何您的ID令牌和访问令牌的大量自定义额外信息。
一个例子,就是用户中有额外的变量,然后在协议映射器中(带有新创建的)“ client-scope”,您可以添加“ User-Attribute”类型的协议映射器,这样您的特定用户变量将以您在“协议映射器”上配置的方式出现在令牌中。 “协议映射器”有很多类型,它们使您可以将各种类型的信息映射到令牌(不仅仅用于映射用户变量)。
此问题之前曾得到解决:
Keycloak User Storage SPI Implementation
我在这里复制与您有关的部分:
原始问题是:
[如何]“从外部数据源中检索一些属性,将其映射到keycloak的id和访问令牌。需要检索用户唯一的id并将其作为主题id添加到jwt中。当此令牌传递给其他服务时,服务可以用来检索ID。”
[答案:]
为此,您可以做的最好的事情是: 将这些用户的唯一数据添加为用户属性(请在管理控制台上查看) 在Keycloak上创建一个“客户端范围”,并为“用户属性”创建一个映射器,以将您想要添加(从用户)添加到ID令牌和访问令牌的那些属性映射。您还需要将客户与刚刚创建的“客户范围”联系在一起。这听起来可能有点令人困惑,但是该视频非常棒,我相信可以帮助您:https://www.youtube.com/watch?v=ZxpY_zZ52kU(大约6:30左右,您将看到如何向令牌添加额外的用户信息)< / strong>