You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现从System B跳转至Spring+Keycloak的System A免密自动登录

跨系统免密自动认证方案(Spring+Keycloak架构)

问题背景

  • System A:基于Spring后端、Angular单页应用(SPA),采用Keycloak作为统一认证系统
  • System B:拥有独立认证机制的第三方应用,所有System B用户已在System A的Keycloak完成注册,但System A存在未注册System B的用户
  • 核心需求:用户已登录System B后跳转至System A时,无需再次输入密码,在不获取用户明文密码的前提下,为用户在System A中建立与正常登录完全一致的会话

已尝试方案

使用Keycloak令牌交换机制获取访问令牌,但生成的令牌无法模拟System A正常登录的完整会话状态(例如缺少前端SPA所需的会话Cookie、刷新令牌等)

可行解决方案

方案1:Keycloak信任客户端+令牌交换授权码流程

  1. Keycloak客户端配置:

    • 在Keycloak目标Realm中为System B创建专用客户端,开启Service Accounts Enabled,并赋予impersonation(用户模拟)权限
    • 配置客户端的有效重定向URI为System A的SPA回调地址
  2. System B端身份传递:
    用户在System B登录后,System B后端调用Keycloak令牌交换API,传入用户唯一标识(如用户名/邮箱)及自身的服务账户凭证,获取授权码而非直接获取访问令牌:

    POST /auth/realms/{realm}/protocol/openid-connect/token
    Content-Type: application/x-www-form-urlencoded
    
    grant_type=urn:ietf:params:oauth:grant-type:token-exchange
    client_id=system-b-trusted-client
    client_secret={system-b-client-secret}
    subject={system-b-username}
    requested_token_type=urn:ietf:params:oauth:token-type:authorization_code
    redirect_uri={system-a-spa-callback-uri}
    
  3. System A端会话建立:
    将获取到的授权码通过重定向传递给System A的Angular SPA,SPA再执行标准的OAuth2授权码流程与Keycloak交互,获取完整的访问令牌、刷新令牌及会话Cookie,从而建立与正常登录完全一致的会话状态

方案2:SAML身份提供者集成(适用于System B支持SAML的场景)

  1. 在Keycloak中添加System B作为SAML身份提供者,配置信任关系(导入System B的SAML元数据,或手动配置实体ID、签名证书等)
  2. 用户在System B登录后,System B生成包含用户身份信息的SAML断言,重定向至Keycloak的SAML回调端点
  3. Keycloak验证SAML断言的有效性后,自动为用户生成OAuth2令牌,并重定向至System A的SPA,完成会话初始化
  4. 此方案依赖SAML的信任机制,无需System B直接处理Keycloak的令牌逻辑,兼容性更强

方案3:自定义Spring Security认证过滤器

如果上述标准方案无法满足需求,可在System A的Spring后端实现自定义认证逻辑:

  1. 身份传递规则:System B跳转至System A时,携带由自身私钥签名的JWT令牌,令牌中包含用户唯一标识、过期时间等核心信息
  2. 后端验证逻辑:在System A的Spring Security链中添加自定义过滤器,使用System B的公钥验证JWT签名,确认用户身份合法且属于System B已注册用户
  3. 会话同步:验证通过后,调用Keycloak的users/{userId}/impersonation API生成临时会话,或直接通过Spring Security创建认证对象并同步至Keycloak会话
  4. 前端初始化:重定向至Angular SPA时携带认证状态标识,让前端触发会话初始化流程,确保前后端状态一致

关键注意事项

  • 所有跨系统的身份传递必须使用加密签名,防止身份伪造与篡改
  • 严格限制System B的用户模拟权限,仅允许其访问已在自身注册的用户,避免越权操作
  • 测试阶段需验证会话完整性:包括前端SPA的登录状态持久化、后端接口的权限校验、刷新令牌的有效性等

内容的提问来源于stack exchange,提问作者Ez Az

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 13:57:25