我们正在使用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能够得到解决。
提前致谢。
答案 0 :(得分:11)
我遇到了与keycloak v1.5.0.Final / Internet Explorer 11相同的问题,最后想出了发生了什么。
使用模式'登录要求'或者' 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
)。
是的!以下是Internet Explorer的问题,它具有严格的iframe和Cookie策略。实际上,由于 P3P policy , yourkeycloakhost
域Cookie(Microsoft Internet Explorer是唯一的主要浏览器)支持P3P)。
This problem is well described on this stackoverflow question
解决方案是让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政策。
您可以查看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})