Keycloak ui_locale在请求密码重置链接时被忽略



我将从我的web应用程序中选择的语言传递到具有keyCloakClient.createLoginUrl({locale: locale})的keycloak登录ui,它正确地将我重定向到: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 (login-reset-password.ftl中的${url.loginAction?no_esc},生成urlhttps://localhost/auth/realms/../login-actions/reset-credentials?..)并提交表单时,我降落在:https://localhost/auth/realms/../login-actions/authenticate?execution=...上。url中突然没有ui_locales,因此内容不会在区域设置it中进行翻译。

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

任何想法?

编辑:

当使用错误的凭据提交登录表单时,添加&ui_locales=it的操作url (${url.loginAction?no_esc})也会发生同样的问题。

似乎区域设置查询参数是错误的,因为一段时间见为什么kc_locale和UI语言开关不工作?根据https://www.keycloak.org/docs/latest/release_notes/,在9.0中对区域设置进行了更改,并在9.0.1中恢复。从那时起,区域设置就没有新的变化。我使用12.0.4.

Cookie的方法:

我用JS在我的React登录GUI上创建了CookieKEYCLOAK_LOCALE,从URL传递了区域设置值。它只在用户第一次登录之前有效。因为然后,Keycloak以某种方式设置相同的Cookie与httpOnly,这样我就不能再用JS读/写Cookie值了。所以我不能在新登录时覆盖Cookie值,也不能读取Cookie值来与React GUI本地化同步。

  • 工作usecase:在App中选择语言->重定向到Keycloak login ->设置KEYCLOAK_LOCALECookie的值从url (Keycloak &GUI语言现在保持同步)->返回App ->更改App语言->重定向到Keycloak login ->Keycloak语言可以通过js在Cookie上更新,因为Cookie不是httpOnly
  • 不工作用例:在App中选择语言->重定向到Keycloak login ->设置KEYCLOAK_LOCALECookie的值从url (Keycloak &GUI语言现在保持同步)->登录→Keycloak将Cookie更新为httpOnly ->重定向回应用发生了->注销→更改App语言->重定向到Keycloak login ->Keycloak语言不能通过js更新Cookie,因为Cookie是httpOnly

我通过在重新加载页面之前手动设置template.ftl中的cookie来修复它。

如果你需要更多的支持请告诉我。

document.addEventListener("DOMContentLoaded", function() {
let locales = 'ui_locales';
document.getElementById("lang-link").addEventListener("click", function() {
let switchTo = ...
document.cookie = 'KEYCLOAK_LOCALE=; Path=/; Expires=Thu, 01 Jan 1970 00:00:01 GMT;'
document.cookie = 'KEYCLOAK_LOCALE='+ switchTo;
// change the language
const currentUrl = new URL(window.location.href);
currentUrl.searchParams.set(locales, switchTo);
document.location.href = currentUrl;
});
});
```

我已经将这个片段添加到我的代码中:

<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>

现在登录页面加载我设置KEYCLOAK_LOCALEui_locales参数

最新更新