Keycloak导致IE无限循环

时间:2015-08-20 13:50:28

标签: javascript angularjs keycloak

我们正在使用keycloak 1.3.1身份验证库,我注意到一旦用{ onLoad: 'login-required' }初始化keycloak,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,希望这个奇怪的bug能够得到解决。

提前致谢。

3 个答案:

答案 0 :(得分:11)

我遇到了与keycloak v1.5.0.Final / Internet Explorer 11相同的问题,最后想出了发生了什么。

1。在幕后

使用模式'登录要求'或者' check-sso'在Keycloak的init方法中,Keycloak Javascript Adapter设置iframe,以定时间隔检查用户是否经过身份验证。

从keycloak的服务器(请说http(s)://yourkeycloakhost:port)中检索此iframe:

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 policy 可以访问yourkeycloakhost域Cookie(Microsoft Internet Explorer是唯一的主要浏览器)支持P3P)。

This problem is well described on this stackoverflow question

3。分辨率

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

为此,您的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 validator验证您的P3P政策。

4。结果

您可以查看keycloak的iframe代码:

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

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

答案 1 :(得分:3)

Keycloak开发人员修复了这个问题,如@FrançoisSrowll所述,版本1.9.3。有关详细信息,请参阅#2828

答案 2 :(得分:3)

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