Keycloak 基于身份提供程序令牌中存在的数据更新KeyClope用户数据

Keycloak 基于身份提供程序令牌中存在的数据更新KeyClope用户数据,keycloak,Keycloak,我以身份代理的身份运行keydeport,并配置了一个身份提供者 当具有来自我的IdP的有效令牌的用户第一次访问我的应用程序时,该用户将使用来自令牌的信息在KeyClope中创建。这包括电子邮件、用户名、名字和姓氏。keydapore然后用该用户信息发布其令牌 当同一用户随后登录时,将根据keydrope数据库中的用户信息构建keydrope令牌 我的问题是:如果用户在IdP更改了他的姓氏,我如何配置keydove来自动更新其记录以匹配IdP令牌上的信息?我们提出的解决方案是实现我们自己的Ide

我以身份代理的身份运行keydeport,并配置了一个身份提供者

当具有来自我的IdP的有效令牌的用户第一次访问我的应用程序时,该用户将使用来自令牌的信息在KeyClope中创建。这包括电子邮件、用户名、名字和姓氏。keydapore然后用该用户信息发布其令牌

当同一用户随后登录时,将根据keydrope数据库中的用户信息构建keydrope令牌


我的问题是:如果用户在IdP更改了他的姓氏,我如何配置keydove来自动更新其记录以匹配IdP令牌上的信息?

我们提出的解决方案是实现我们自己的
IdentityProvider
,它扩展了keydove的
OIDCIdentityProvider
以覆盖
updateBrokeredUser
方法。在这个重写的方法中,我们将
userModel
的lastName设置为
BrokeredIdentityContext
(来自IdP的令牌)中的lastName。像这样:

@Override
public void updateBrokeredUser(KeycloakSession session, RealmModel realm, 
        UserModel user, BrokeredIdentityContext context) {
    user.setFirstName(context.getFirstName());
    user.setLastName(context.getLastName());
    // etc for other user attributes
}
这个
updateBrokeredUser
方法的默认实现是一个no-op,所以我很清楚keydape打算覆盖它来做这样的事情


我们的自定义标识提供程序类通过使用提供程序/提供程序工厂机制的常规方式连接进来。

您无需实现自己的
IdentityProvider
。相反,只需将类型为
属性导入器的映射器添加到标识提供程序。对于使用姓氏的情况,您可以从OpenID提供者应该提供的
概要文件
客户机范围中获取属性值。只需将
Claim
设置为
given_name
,将
User Attribute name
设置为
firstName
,如中所示。然后,代理帐户的每个新登录都会导致KeyClope更新帐户。(在Key斗篷7.0.1上测试)

应该有钩子,可以在外部IDP用户数据和内部Key斗篷用户表示之间执行同步。您应该检查文档或来源。至少实现事件监听器(KC应该在IDP登录时触发事件)会有所帮助。问题不在于如何在第一次登录时更新配置文件信息,而在于如何在之后保持更新。好吧,该解决方案不仅适用于第一次登录,而且适用于以后的每次登录(这就是我对新登录的意思)。但是,如果要求在用户更新IdP中的个人资料时立即触发,则需要对IdP本身进行一些调整(我不认为您可以访问)。如果我弄错了,请纠正我。@Martin我在谷歌身份提供商那里尝试了你的方法,但它不起作用(Key斗篷8.0.1),尽管它看起来很有希望,因为我的用户名确实存在不更新的问题。。。你知道会出什么问题吗?@Grammy你能给出映射器的配置吗?对我来说,它看起来是这样的:@Martin我有完全相同的映射器+另一个作为名字,但是当用户数据在身份提供者中更改时,在keylcoak中保持不变。谢谢你的帮助