Keycloak中能否用offline cookie实现SSO?是否支持Realm级离线令牌?
为什么会出现"Session doesn’t have required client"错误?
这个报错的核心原因是:Keycloak的离线令牌(offline token)是与生成它的特定客户端(client)强绑定的。当你在App A(clientA)下获取离线令牌时,Keycloak会在令牌中记录关联的客户端ID,后续用这个令牌请求其他客户端(比如clientB)的访问令牌时,Keycloak会校验令牌绑定的客户端与当前请求的客户端是否一致,不一致就会抛出这个错误。
解决跨客户端复用离线令牌的方案
针对你的场景,有几个可行的解决思路:
方案1:在生成离线令牌时包含目标客户端的Scope
当App A首次获取离线令牌时,除了必须的offline_accessscope,额外添加clientB的客户端scope(如果clientB允许的话)。比如在授权请求中指定:scope=offline_access clientB这样生成的离线令牌就具备了为clientB请求访问令牌的权限。需要注意的是,你需要在Keycloak后台配置clientA的"Allowed Client Scopes",确保它能访问clientB的scope;同时在clientB的配置中开启"Full Scope Allowed"(或者针对性配置clientA的访问权限),允许clientA生成的令牌访问clientB的资源。
方案2:让App A和App B共用同一个客户端
如果两个应用属于同一业务体系、权限边界不需要严格区分,可以直接让它们使用同一个Keycloak客户端(比如统一用clientAB)。这样无论是哪个应用生成的离线令牌,都能被另一个应用复用。但这个方案的缺点是无法单独管控两个应用的权限、重定向URI等配置,适合高度关联的应用场景。方案3:使用Realm级角色统一权限(辅助方案)
虽然不能直接解决离线令牌的跨客户端问题,但如果两个应用需要共享用户权限,可以将用户权限配置为Realm级角色,而非客户端角色。这样当跨客户端获取访问令牌时,只要令牌包含Realm角色,就能在两个应用中通用权限。
关于Realm级离线令牌的问题
Keycloak本身不存在独立于客户端的Realm级离线令牌,所有离线令牌都必须关联到具体的客户端。这是因为每个客户端的配置(比如权限范围、重定向规则、令牌有效期等)都是独立的,Keycloak需要确保离线令牌的使用符合其关联客户端的安全规则。不过通过上面的方案1,你可以实现一个离线令牌支持多个客户端的效果,间接达到类似"Realm级"的复用能力。
内容的提问来源于stack exchange,提问作者Rohan Kadu

