使用LinkedIn作为IDP时logout_token签发者不被Keycloak接受
Keycloak + LinkedIn OIDC 登出与离线会话撤销问题解决
核心逻辑澄清
你搞反了/protocol/openid-connect/logout/backchannel-logout端点的调用方:
- 你配置的「Backchannel logout URL」是Keycloak主动通知你的应用用户登出的地址,这部分你之前的操作是对的。
- 而
logout/backchannel-logout是身份提供商(LinkedIn)用来通知Keycloak用户在IDP侧登出的端点——所以Keycloak才会要求这个请求里的logout_token issuer必须是LinkedIn,因为它本来就该由LinkedIn签发。
你拿着Keycloak自己发的token去调用这个端点,自然会触发验证失败。
为什么「Backchannel logout revoke offline sessions」没生效?
这个选项的触发条件是:Keycloak收到LinkedIn发来的包含revoke_offline_access事件的Logout Token。但问题是——LinkedIn目前根本不支持OIDC Backchannel Logout,你查不到相关文档就是明证,它没实现这个功能,自然不会给Keycloak发这个token。
替代解决方案
既然LinkedIn不支持,要实现离线会话撤销,换这两种思路:
1. 应用登出时主动调用撤销端点
当用户在你的应用触发登出(调用Keycloak的/protocol/openid-connect/logout)时,额外调用Keycloak的令牌撤销端点,传入用户的离线refresh token:
POST /auth/realms/{你的领域名}/protocol/openid-connect/revoke Content-Type: application/x-www-form-urlencoded client_id=你的客户端ID&client_secret=你的客户端密钥&token=用户的离线Refresh Token
这样就能直接撤销对应的离线会话。
2. 自定义Keycloak事件监听器
写一个Keycloak SPI扩展,监听用户的LOGOUT事件,当事件触发时,自动删除该用户的所有离线会话。核心是调用Keycloak内部的OfflineSessionProvider接口来实现会话清理,适合需要全局自动处理的场景。
总结
logout/backchannel-logout这条路走不通,因为LinkedIn不支持给Keycloak发Backchannel Logout Token。- 要实现离线会话撤销,只能通过主动调用revoke端点或自定义事件监听器来替代。
内容的提问来源于stack exchange,提问作者Guenther Mahr
相关产品推荐
相关产品推荐

