【问题标题】:Keycloak ui_locales is ignored on requesting password reset link请求密码重置链接时忽略 Keycloak ui_locales
【发布时间】:2023-03-05 13:59:01
【问题描述】:

我正在使用keyCloakClient.createLoginUrl({locale: locale}) 将我的网络应用程序中的一种选择的语言传递到keycloak 登录用户界面,这会将我正确重定向到:https://localhost/auth/realms/../protocol/openid-connect/auth?....&ui_locales=it。这会在语言环境it 中正确显示内容。

对于登录表单中显示的密码重置链接,我还在 URL 中添加了ui_locales=it,这会将我重定向到:https://localhost/auth/realms/../login-actions/reset-credentials?....&ui_locales=it。这也会在语言环境it 中正确显示内容。

问题:

当我将ui_locales=it 添加到提交重置密码请求的提交网址(${url.loginAction?no_esc}login-reset-password.ftl 中,生成网址https://localhost/auth/realms/../login-actions/reset-credentials?..)并提交表单时,我登陆:@ 987654333@。这突然在url中没有ui_locales,因此内容没有在语言环境it中翻译。

为了测试是否有任何魔术重定向,我在启用了保留日志的情况下登录了网络。单击重置密码请求按钮后,它只显示一个新条目:https://localhost/auth/realms/../login-actions/reset-credentials?...&ui_locales=it

有什么想法吗?

编辑:

将带有错误凭据的登录表单提交到附加 &ui_locales=it 的操作 url (${url.loginAction?no_esc}) 时会发生同样的问题。

似乎区域设置查询参数有一段时间是错误的,请参阅Why are kc_locale and UI lang switch not working?。根据https://www.keycloak.org/docs/latest/release_notes/9.0 中的区域设置发生了变化,并在9.0.1 中恢复。从那时起,语言环境就没有新的变化。我正在使用12.0.4

Cookie 方法:

我在我的 React 登录 GUI 上使用 JS 创建了 Cookie KEYCLOAK_LOCALE,并从 URL 传递了区域设置值。它仅在用户第一次登录之前有效。因为那时,Keycloak 以某种方式使用 httpOnly 设置了相同的 Cookie,因此我无法再使用 JS 读取/写入 Cookie 值。所以我无法在新登录时覆盖 Cookie 值,也无法读取 Cookie 值以将其与 React GUI 本地化同步。

  • 工作用例:在 App 中选择语言 -> 重定向到 Keycloak 登录 -> 使用 url 中的值设置 KEYCLOAK_LOCALE Cookie(Keycloak 和 GUI 语言现在保持同步) -> 返回 App ->更改 App 中的语言 -> 重定向到 Keycloak 登录 -> Keycloak 语言可以使用 js 在 Cookie 上更新 因为 Cookie 不是 httpOnly
  • 不工作用例:在应用程序中选择语言 -> 重定向到 Keycloak 登录 -> 使用来自 url 的值设置 KEYCLOAK_LOCALE Cookie(Keycloak 和 GUI 语言现在保持同步)-> 登录 -> Keycloak 更新Cookie 为 httpOnly -> 发生重定向回 App -> 注销 -> 更改 App 中的语言 -> 重定向到 Keycloak 登录 -> Keycloak 语言无法使用 js 在 Cookie 上更新 因为 Cookie 是 httpOnly强>。

【问题讨论】:

    标签: keycloak


    【解决方案1】:

    我已将此 sn-p 添加到我的代码中:

            <script type="text/javascript">
                (function() {
                    if ('URLSearchParams' in window) {
                        let parameters = new URLSearchParams(location.search);
                        let locale = parameters.get('ui_locales');
                        if (locale != null) {
                            let [language, country] = locale.split('-');
                            document.cookie = "KEYCLOAK_LOCALE=" + language + "; path=/;";
                        }
                    }
                })();
            </script>
    

    现在登录页面加载我从ui_locales参数设置KEYCLOAK_LOCALE

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多