Keycloak 导致 IE 无限循环
Keycloak is causing IE to have an infinite loop
我们正在使用 keycloak 1.3.1 身份验证库,我注意到一旦我使用 { 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,希望能解决奇怪的错误。
提前致谢。
我在 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_SESSION先前由keycloak在身份验证时设置的cookie(在同一域中,即http(s)://yourkeycloakhost:port
).
2。 IE的问题
是的!这是 Internet Explorer 的问题,它对 iframe 和 cookie 有严格的政策。实际上,由于其 P3P policy (Microsoft Internet Explorer是唯一支持 P3P 的主流浏览器)。
This problem is well described on this Whosebug question
3。分辨率
解决方案是让 Internet Explorer 信任我们的 keycloak 域 (yourkeycloakhost
) 使用 cookie,以便 iframe 能够读取 KEYCLOAK_SESSION
cookie 值,并将其注册到其数据中.
为此,您的 keycloak 服务器必须附加带有 P3P 信息的 HTTP 响应header。您可以使用始终设置正确 headers 的 apache 或 nginx 代理来做到这一点。我用 apache 做到了,它是 mod_headers 模块:
Header always set P3P "CP=ALL DSP COR CUR ADM PSA CONi OUR SAM OTR UNR LEG"
您可以通过 W3C and/or validate your P3P Policy with this P3P validator 了解有关 P3P 的更多信息。
4。后果
你可以看看keycloak的iframe代码:
var cookie = getCookie('KEYCLOAK_SESSION');
if (cookie) {
data.loggedIn = true;
data.session = cookie;
}
现在 Internet Explorer 可以正确检索域 yourkeycloakhost
上的 cookie,问题已解决!
如@François Maturel 所述,Keycloak 开发人员在版本 1.9.3 中修复了此问题。有关详细信息,请参阅问题 #2828。
一个对我有用的解决方法,从keycloak文档中学到,在执行init方法时添加参数checkLoginIframe
:.init({onLoad: 'login-required', checkLoginIframe: false})
我们正在使用 keycloak 1.3.1 身份验证库,我注意到一旦我使用 { 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,希望能解决奇怪的错误。
提前致谢。
我在 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_SESSION先前由keycloak在身份验证时设置的cookie(在同一域中,即http(s)://yourkeycloakhost:port
).
2。 IE的问题
是的!这是 Internet Explorer 的问题,它对 iframe 和 cookie 有严格的政策。实际上,由于其 P3P policy (Microsoft Internet Explorer是唯一支持 P3P 的主流浏览器)。
This problem is well described on this Whosebug question
3。分辨率
解决方案是让 Internet Explorer 信任我们的 keycloak 域 (yourkeycloakhost
) 使用 cookie,以便 iframe 能够读取 KEYCLOAK_SESSION
cookie 值,并将其注册到其数据中.
为此,您的 keycloak 服务器必须附加带有 P3P 信息的 HTTP 响应header。您可以使用始终设置正确 headers 的 apache 或 nginx 代理来做到这一点。我用 apache 做到了,它是 mod_headers 模块:
Header always set P3P "CP=ALL DSP COR CUR ADM PSA CONi OUR SAM OTR UNR LEG"
您可以通过 W3C and/or validate your P3P Policy with this P3P validator 了解有关 P3P 的更多信息。
4。后果
你可以看看keycloak的iframe代码:
var cookie = getCookie('KEYCLOAK_SESSION');
if (cookie) {
data.loggedIn = true;
data.session = cookie;
}
现在 Internet Explorer 可以正确检索域 yourkeycloakhost
上的 cookie,问题已解决!
如@François Maturel 所述,Keycloak 开发人员在版本 1.9.3 中修复了此问题。有关详细信息,请参阅问题 #2828。
一个对我有用的解决方法,从keycloak文档中学到,在执行init方法时添加参数checkLoginIframe
:.init({onLoad: 'login-required', checkLoginIframe: false})