网站A与B实现单点登录(SSO)交互及iframe访问问题咨询
跨门户免登录跳转实现方案(A→B)
针对你提到的场景(A、B门户用户认证信息一致,登录A后点击按钮直接访问B),以下是几种可行的解决方案,能解决你之前iframe方案遇到的会话超时、页面显示问题:
方案1:基于JWT的单点登录(SSO)
这是最灵活的跨域方案,无需共享会话存储:
- 门户A登录成功后,后端生成包含用户身份信息(如用户名、用户ID)的JWT,使用A和B共同约定的密钥签名,并设置合理的过期时间(比如10分钟)。
- 点击A中的新增按钮时,前端先向A的后端请求获取该JWT。
- 通过页面跳转(而非iframe)的方式,将JWT作为参数传递到B的SSO登录接口,示例:
btwo.com/sso/login?token=xxx(建议用HTTPS传输,避免明文泄露)。 - B的后端验证JWT的签名有效性和过期时间,验证通过后直接为用户创建B门户的本地会话,跳转至B的主页。
这种方式下,B的会话由自身管理,不会出现会话超时不一致的问题,且用户直接进入B的正常页面,不会看到登录/注销页。
方案2:共享会话存储(如Redis)
如果两个门户可以共用存储资源,这种方案更简单:
- 配置A和B的后端使用同一个Redis实例存储会话数据,会话ID的生成规则、加密密钥保持一致。
- 用户登录A后,A会在Redis中写入包含用户身份的会话记录。
- 点击新增按钮时,前端跳转至B的会话同步接口,将A的会话ID通过以下方式传递:
- 若A、B为同主域名(如aone.example.com和btwo.example.com),可通过共享Cookie传递会话ID(设置Cookie的
domain为父域名); - 跨主域名则通过URL参数或隐藏表单POST传递。
- 若A、B为同主域名(如aone.example.com和btwo.example.com),可通过共享Cookie传递会话ID(设置Cookie的
- B的后端根据会话ID从Redis中查询用户信息,验证有效后创建B的本地会话,跳转至主页。
方案3:后端代理登录请求
适合不想引入额外组件的场景:
- 用户登录A后,点击新增按钮时,A的后端直接模拟用户登录请求到B的登录接口(使用用户的用户名和密码,因为两个系统认证信息一致)。
- B验证通过后,返回B的会话Cookie,A的后端将这些Cookie设置到响应中(注意跨域Cookie的限制,若为同主域名可直接设置,跨域则需要B配合允许跨域Cookie)。
- 前端跳转至B的主页,此时已携带有效的会话Cookie,直接进入登录状态。
注意事项
- 所有方案都必须使用HTTPS传输,避免凭证泄露;
- JWT方案中,不要在Payload中存放敏感信息(如密码),仅保留必要的身份标识;
- 共享会话存储方案中,要确保Redis的访问权限安全,避免会话数据被篡改或窃取;
- 若使用Cookie传递会话信息,需配置
HttpOnly和Secure属性,提升安全性。
内容的提问来源于stack exchange,提问作者Aaska Patel
相关产品推荐
相关产品推荐

