1

我使用 Keycloak 11,在用户注册过程中,我想触发一封电子邮件,要求用户设置密码。我已经用 restTemplate 和 keycloak 6 实现了它,它工作得很好。现在我使用推荐的 webClient。

@Override
    public void triggerRequiredActionUpdatePassword(String userId) {
        String url = applicationConstants.getKeykloakUsersUri()+ "/" + userId + "/execute-actions-email";
        String[] actions = new String[]{"UPDATE_PASSWORD"};
        webClient.put()
                .uri(url)
                .contentType(MediaType.APPLICATION_JSON)
                .body(BodyInserters.fromValue(actions))
                .exchange()
                .block();
    }

这不会导致错误,但未设置所需的操作。在注册期间,我还通过单独的请求设置了领域角色,它工作正常。

有谁知道为什么请求没有引发错误但未设置操作?

我已在用户所需的操作中将 admin-client 设置为 realm-admin。

我还不能使用我的 smtp 服务器,所以没有在 keycloak 中注册,但我希望至少该字段已设置。还是仅在注册 smtp 时才可用?

此外:

我对客户也有一个非常奇怪的行为。当我使用 webClient.exchange 设置领域角色时,它工作正常。当我使用 .retrieve() 时,未设置领域角色。我尝试了两种解决方案来执行所需的操作,但没有任何改变。

4

1 回答 1

1

如果您只想强制用户更新密码而不使用电子邮件功能,那么您可以将 URL 更改为:

 String url = applicationConstants.getKeykloakUsersUri()+ "/" + userId + "/execute-actions-email";

至:

 String url = applicationConstants.getKeykloakUsersUri()+ "/" + userId;

并在请求正文中发送一个 JSON,如:

{"id":"<YOUR_USER_ID>","requiredActions":["UPDATE_PASSWORD"]}

对于电子邮件选项,您需要在您的领域中配置 smtp :

  • 转到您的Realm并单击realm settings
  • 切换到Email tab;
  • 根据您的需要填写设置。对于 gmail:
    • Host: smtp.gmail.com;
    • 将端口设置为587if are using TLSor 465for SSL;
    • 设置为ON选项之一Enabled TLSEnabled SSL;
    • Enabled authentication: ON.
      • 分别设置Username和设置Password为您将用来代表 keycloak 发送电子邮件的电子邮件帐户及其密码。

更详细的信息可以在这里找到。

我刚刚进行了一次测试运行,就我而言,我已经向 Keycloak 管理员用户请求了一个令牌,并在PUT对端点的请求正文中使用了管理员的访问令牌:

{realm}/users/{id}/execute-actions-email

使用 JSON 内容'[UPDATE_PASSWORD]',然后我smtp按照以下步骤配置了我的领域。

最后,我收到了一封来自我的 Keycloak 配置电子邮件的电子邮件,其中包含以下消息:

我们的管理员刚刚要求您通过 > 执行以下操作来更新您的 DeepUnity 帐户:更新密码。单击下面的链接以 > 开始此过程。

链接到帐户更新

此链接将在 12 小时内过期。

如果您不知道您的管理员已提出此请求,请忽略此消息,不会有任何更改。

于 2020-11-23T10:20:20.473 回答