8

我们正在使用keycloak 1.3.1身份验证库,我注意到一旦我用 初始化 keycloak { onLoad: 'login-required' },IE (11) 就会无限循环......

其他浏览器工作正常。

我基本上是这样做的:

keycloak.init({ onLoad: 'login-required' }).success(function(authenticated) {
    console.info(authenticated ? 'authenticated' : 'not authenticated');

    some other stuff...

}).error(function() {
    console.warn('failed to initialize');
});

知道是什么原因造成的,并解决这个问题吗?现在尝试安装最新版本 1.4.0,希望能解决这个奇怪的错误。

提前致谢。

4

3 回答 3

15

我在 keycloak v1.5.0.Final / Internet Explorer 11 上遇到了同样的问题,终于弄清楚发生了什么。

1. 幕后

当在 Keycloak 的 init 方法中使用“login-required”或“check-sso”模式时,Keycloak Javascript Adapter 会设置一个 iframe,以定时间隔检查用户是否已通过身份验证。

此 iframe 是从 keycloak 的服务器检索的(假设http(s)://yourkeycloakhost:port):

http(s)://yourkeycloakhost:port/auth/realms/yourrealm/protocol/openid-connect/login-status-iframe.html?client_id=yourclientid&origin=http(s)://yourorigin

它的内容是一个javascript脚本,它应该能够访问之前由keycloak在身份验证时设置的KEYCLOAK_SESSION cookie(在同一域上,即http(s)://yourkeycloakhost:port)。

2. IE的问题

是的!这是 Internet Explorer 的问题,它对 iframe 和 cookie 有严格的政策。实际上,由于其P3P 策略,keycloak iframe无法访问域 cookie (Microsoft Internet Explorer 是唯一支持 P3P 的主要浏览器)。yourkeycloakhost

这个问题在这个stackoverflow问题上有很好的描述

3. 分辨率

解决方案是让 Internet Explorer 信任我们 keycloak 的域 ( yourkeycloakhost) 以使用 cookie,以便 iframe 能够读取KEYCLOAK_SESSIONcookie 值,并将其注册到其数据中。

为此,您的 keycloak 服务器必须附加带有 P3P 信息的 HTTP 响应标头。您可以使用始终设置正确标头的 apache 或 nginx 代理来做到这一点。我用 apache 做到了,它是 mod_headers 模块:

Header always set P3P "CP=ALL DSP COR CUR ADM PSA CONi OUR SAM OTR UNR LEG"

您可以通过W3C了解有关 P3P 的更多信息和/或使用此P3P 验证器验证您的 P3P 策略。

4. 后果

你可以看看 keycloak 的 iframe 代码:

var cookie = getCookie('KEYCLOAK_SESSION');
if (cookie) {
    data.loggedIn = true;
    data.session = cookie;
}

yourkeycloakhost现在,Internet Explorer 可以正确检索域上的 cookie ,问题已解决!

于 2015-11-27T17:46:57.620 回答
9

一种对我有用的解决方法,从 keycloak 文档中学习,checkLoginIframe在执行 init 方法时添加参数:.init({onLoad: 'login-required', checkLoginIframe: false})

于 2018-09-06T09:03:20.287 回答
4

正如@François Maturel 所述,Keycloak 开发人员在 1.9.3 版中修复了这个问题。有关更多信息,请参阅问题#2828

于 2016-06-01T14:36:21.060 回答