Keycloak桌面Java适配器删除KEYCLOAK_IDENTITY类Cookie如何避免
根因说明
Keycloak 15.0.2版本的KeycloakInstalled桌面适配器默认内置了安全策略:登录授权流程完成后,会在回调响应中主动将KEYCLOAK_IDENTITY、KEYCLOAK_IDENTITY_LEGACY等SSO会话Cookie的过期时间设置为过去时间,清除浏览器侧的会话残留,避免桌面端登录后浏览器遗留会话的安全风险。这个机制就是你遇到旧Cookie被删除、新Cookie无法写入、无法实现跨应用SSO的核心原因。
修复方案
按优先级从高到低选择即可:
- 方案1:添加配置禁用Cookie清除逻辑(推荐,无需修改源码)
在你的keycloak.json配置文件中新增如下配置项即可:
{ // 原有其他配置保持不变 "disable-clearing-identity-cookie": true }
如果是用代码动态覆盖配置,可以在初始化KeycloakInstalled时添加:
// 原有初始化逻辑不变 keycloak.getDeployment().setDisableClearingIdentityCookie(true); keycloak.loginDesktop();
- 方案2:调整Cookie适配跨域场景
如果你的多Web应用存在跨站部署的情况,还需要额外调整Keycloak Realm的Cookie配置:
- 进入对应Realm的「Realm Settings」-「Cookies」配置页
- 将
SameSite Cookie属性修改为None - 确认所有应用都使用HTTPS协议访问(SameSite=None必须配合HTTPS生效)
- 方案3:自定义适配器逻辑(仅在上述方案不生效时使用)
如果因为版本适配问题配置项不生效,可以继承KeycloakInstalled类,重写loginDesktop方法,删除其中回调响应中设置Cookie过期的相关逻辑即可。
验证步骤
- 重启桌面应用,重新触发登录流程
- 登录完成后打开浏览器开发者工具,检查Keycloak域名下的Cookie,确认
KEYCLOAK_IDENTITY等Cookie的过期时间为正常的会话有效期,未被设置为过去时间 - 访问同Realm下的其他Web应用,确认无需重复登录即可正常访问,SSO能力生效
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

