Keycloak:使用新的 Chrome SameSite/Secure cookie 强制执行令牌请求中缺少会话 cookie

Zik*_*iko 8 redhat google-chrome single-sign-on keycloak keycloak-services

最近,我使用 Keycloak 的应用程序在身份验证后停止处理 400 令牌请求。

到目前为止,我发现在令牌请求中,Keycloak cookie(AUTH_SESSION_ID、KEYCLOAK_IDENTITY、KEYCLOAK_SESSION)未在请求标头中发送,导致令牌请求失败并且应用程序收到会话错误。

通过深入研究,我发现 Chrome 现在阻止了没有设置 SameSite 属性的 cookie,keycloak cookie 就是这种情况,这就是为什么它们在身份验证后从未在令牌获取请求中解析的原因。

我得到的错误:-

在此处输入图片说明 https://blog.chromium.org/2019/10/developers-get-ready-for-new.html

https://adzerk.com/blog/chrome-samesite/

这是非常严重的,因为它阻止了 Keycloak 库保护的应用程序能够与 keycloak 服务器通信。

更新:使用新的 google chrome cookie SameSite 属性,任何使用 cookie 的第三方库没有正确设置 SameSite 属性,cookie 将被忽略。 https://blog.chromium.org/2019/10/developers-get-ready-for-new.html

https://www.chromium.org/updates/same-site

小智 8

如果您在使用keycloak-js适配器时遇到此问题。

那么这个问题的原因是:

默认情况下,JavaScript 适配器会创建一个隐藏的 iframe,用于检测是否发生单点注销。这不需要任何网络流量,而是通过查看特殊状态 cookie 来检索状态。

解决方法(不是修复):

可以通过在传递给 init 方法的选项中设置 checkLoginIframe: false 来禁用此功能。

例如。,

keycloak.init({ onLoad: '需要登录', checkLoginIframe: false })

  • 这是正确的,但请注意,iframe 的使用在许多情况下非常有用,例如检测第二个选项卡的注销等,除非您通过 websocket 调用额外控制您的应用程序。您将需要更新您的 keycloak 服务器来解决此问题,因为他们已经发布了支持该问题的版本。 (2认同)

Zik*_*iko 1

对于那些在更新库之前寻找短期解决方案的人。

您可以在 Chrome 中执行以下操作:-

  • 转到 chrome://flags/
  • 搜索“同一个网站”
  • 禁用“默认使用 SameSite cookie”和“没有 SameSite 的 Cookie 必须是安全的”标志。
  • 重新启动。