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

Keycloak: Session cookies are missing within the token request with the new Chrome SameSite/Secure cookie enforcement

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

到目前为止,我发现在令牌请求中,Keycloak cookie(AUTH_SESSION_ID、KEYCLOAK_IDENTITY、KEYCLOAK_SESSION)未在请求中发送 headers导致令牌请求失败,应用程序收到 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

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

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

  • 转到 chrome://flags/
  • 搜索 "Samesite"
  • 禁用 "SameSite by default cookies" 和 "Cookies without SameSite must be secure" 标志。
  • 重新启动。

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

那么这个问题的原因:

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

解决方法(不是修复):

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

例如,

keycloak.init({ onLoad: 'login-required', checkLoginIframe: false })

对于 Chrome 91+,标志中的设置已消失,但可通过命令行访问,对于 94,这些设置不可访问。

可以同时使用Firefox或Safari。