跨独立系统的SSO实现咨询:基于Keycloak的AccessToken复用
可行实现思路
基于你的场景(中间API对接不受管控的A、B系统,用Keycloak AccessToken实现SSO),结合不同系统的支持能力,提供以下几种落地思路:
1. Token交换方案(适配支持OAuth2/OIDC Token Exchange的系统B)
- 我方API收到A的跳转请求时,先调用Keycloak的
introspect接口验证用户AccessToken的有效性(校验签名、过期时间、受众等) - 验证通过后,以我方作为中间OAuth2客户端,向系统B的授权服务发起Token Exchange请求,用Keycloak的AccessToken换取B的登录凭证(如B的AccessToken或授权码)
- 将换取到的凭证拼接成重定向URL(比如带上
code或access_token参数)返回给A,用户跳转后,B的前端/后端识别参数自动完成登录流程 - 核心前提:系统B支持
urn:ietf:params:oauth:grant-type:token-exchange类型的授权请求
2. 签名身份断言方案(适配可接受第三方身份断言的系统B)
- 我方API验证Token有效性后,提取用户核心身份字段(如用户名、邮箱、唯一用户ID)
- 用与系统B预先约定的密钥和签名算法(如HMAC-SHA256),将身份信息+过期时间等生成签名断言(可简化为签名串或标准JWT)
- 重定向URL中携带身份信息和签名断言参数,系统B收到后用约定密钥验证签名,确认身份合法后自动创建用户会话完成登录
- 关键:必须与B的运维团队提前协商断言格式、签名规则、参数名称,确保B能识别并验证
3. 模拟登录接口调用方案(适配有可调用登录API的系统B)
- 我方API验证Token后,提取用户身份信息,调用系统B的后端登录接口(需确认B支持接收可信第三方传递的身份信息,或已预先在B中同步用户数据)
- 调用成功后,获取B返回的会话凭证(如SessionID、登录Cookie),通过重定向URL传递给前端(或我方API直接在B的域名下设置Cookie,需注意跨域SameSite限制)
- 若存在跨域问题,可通过B域名下的中转页面,将会话凭证写入本地Cookie,完成自动登录
4. Keycloak统一身份源方案(适配支持OIDC/SAML的系统B)
- 协调系统B的运维团队,将我方Keycloak配置为B的身份提供商(IdP)
- 用户从A跳转至我方API时,我方验证Token后,生成Keycloak的授权码(或直接复用现有AccessToken),重定向到B的OIDC登录端点并携带凭证,B直接向Keycloak验证身份完成登录
- 这是最标准化、长期稳定的方案,但需要B方配合完成IdP配置
核心注意事项
- 所有传递敏感信息的请求必须使用HTTPS,防止数据泄露
- 我方API必须严格校验Keycloak AccessToken的合法性,拒绝无效、过期或篡改的Token
- 若系统B未开放任何可对接的认证接口,必须与B的运维方协商开放适配能力,否则无法实现自动登录
内容的提问来源于stack exchange,提问作者hk02
相关产品推荐
相关产品推荐

