Keycloak JS 库:已登录时的 iframe 重定向

Kri*_*ket 6 oauth-2.0 keycloak

我正在开发一个使用 keycloak.js 与我的 Keycloak 服务器交互的 SPA。我使用 onload = 'check-sso' 并启用 checkLoginIFrame 来初始化 Keycloak 对象。

如果我执行以下步骤:

  • 加载我的网站
  • 单击我的“登录”按钮(调用 Keycloak.login())
  • 重定向到 Keycloak 的登录页面,登录,重定向回我的应用程序
  • 重新加载我的网站

我观察到,当站点重新加载时,它会进行快速重定向(URL 从 mysite.com 短暂更改为 mysite.com/#state=..... 然后返回 mysite.com)。当我已经登录时,我想避免进行这种重定向。

通过调试代码,我发现了为什么会发生这种情况:

  • 登录状态,Iframe.html的页面基本上是只是一个包装了一些静态JS来管理的Cookie存储身份验证令牌。
  • 它的主要方法checkState(...)在初始化期间被调用(通过来自 keycloak.js 的消息)......没有令牌(sessionState因为 keycloak.js 不知道 cookie 为空)。
  • 登录 iFrame 的代码读取 cookie 并创建一个 XHR 请求到 mykeycloak.com/.../login-status-iframe.html/init?...(带有请求标头中的 cookie)。
  • 当它收到 204 响应时(我的意思是:cookie 有效,一切正常),它将令牌(来自 cookie)与从 keycloak.js 提供的令牌(即什么都没有)进行比较。
  • 由于它们不相等,因此它以“已更改”来响应回调。
  • 这在 keycloak.js 中被解释为(令牌改变了?),因此它调用doLogin(false),这是它改变 URL 的地方,创建不需要的重定向。

所以我的问题是:

  • 调用login-status-iframe.html/init 的API 文档在哪里?
  • 是否有可能做这样的事情:
    • 让 login-status-iframe 返回令牌,当 KC 服务器通知它令牌仍然有效时(例如,'update XXXXX' 而不是 'changed')
    • 然后 keycloak.js 会接受这个并更新它的令牌,而不必调用 doLogin()

Dan*_* P. 5

我已经检查过这种情况会在 5 秒后发生,并且仅在开发服务器(Angular SPA 中的 ng 服务)中发生,这与 checkLoginIframeInterval 的默认时间匹配。

我尝试在 init() 方法中设置 checkLoginIframeInterval = false ,它修复了循环问题,但我担心副作用,我宁愿更新 keycloak.js 文件。

https://www.keycloak.org/docs/latest/secure_apps/

  • checkLoginIframe - 设置启用/禁用监视登录状态(默认为 true)。
  • checkLoginIframeInterval - 设置检查登录状态的时间间隔(默认为 5 秒)。


小智 3

如果您保持 keycloak 的版本与 keycloak.js 相同,将会很有帮助。我也面临着无限重定向,我使用的 keycloak 版本是 11.0.1,而 keycloak.js 是旧版本。因此,我将其替换为 keycloak-js-adapter-dist-11.0.1.zip 中的文件(从https://www.keycloak.org/archive/downloads-11.0.1.html下载)。那么无限重定向问题就消失了。