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
对于那些在更新库之前寻找短期解决方案的人。
您可以在 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。
最近我使用 Keycloak 的应用程序在验证后停止处理 400 令牌请求。
到目前为止,我发现在令牌请求中,Keycloak cookie(AUTH_SESSION_ID、KEYCLOAK_IDENTITY、KEYCLOAK_SESSION)未在请求中发送 headers导致令牌请求失败,应用程序收到 session 错误。
通过深入挖掘,我发现 Chrome 现在阻止未设置 SameSite 属性的 cookie,keycloak cookie 就是这种情况,这就是为什么它们在身份验证后从未在令牌获取请求中被解析。
我得到的错误:-
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
对于那些在更新库之前寻找短期解决方案的人。
您可以在 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。