Keycloak 导致 IE 出现无限循环

Posted

技术标签:

【中文标题】Keycloak 导致 IE 出现无限循环【英文标题】:Keycloak is causing IE to have an infinite loop 【发布时间】:2015-11-14 04:57:46 【问题描述】:

我们正在使用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,希望能解决这个奇怪的错误。

提前致谢。

【问题讨论】:

您使用的是 angular?如果是,您可以尝试创建服务。如果没有,请从您的问题中删除“angularjs”标签。 我已将 Keycloak 更新到 1.4.0,但问题仍然存在。是的,我正在使用 AngularJs,并且我已将 keycloak 初始化放入标头控制器中,然后从中获取有关用户、名称和类似信息的数据,然后在需要的地方显示这些数据。 【参考方案1】:

我在使用 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 policy(Microsoft Internet Explorer 是唯一支持 P3P 的主要浏览器),keycloak iframe 确实 可以访问 yourkeycloakhost 域 cookie。

This problem is well described on this *** question

3。分辨率

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

为此,您的 keycloak 服务器必须在 HTTP 响应标头中附加 P3P 信息。您可以使用始终设置正确标头的 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,问题已修复!

【讨论】:

最终我们已经放弃了这个工具,所以我不能真正测试这个,同样如上所述,现在应该修复 Keycloak 实现,但我会将其设置为接受的答案写它的努力。谢谢。【参考方案2】:

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于Keycloak 导致 IE 出现无限循环的主要内容,如果未能解决你的问题,请参考以下文章

成功登录后的 Node.js Express 无限重定向循环

为啥这会导致无限循环

while循环中的Javascript continue语句导致无限循环

骑士之旅 - 导致无限循环,我不知道为啥

无限循环的线程是不是会导致 CPU 过多

为啥这段代码不会导致无限循环?