You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现类似谷歌的跨网站自动登录功能?

这个问题问得很到位!谷歌旗下网站的自动登录就是**单点登录(SSO)**的典型实现,针对你提到的多个独立域名网站的场景,我整理了几种不需要OAuth的可行方案,你可以根据自身域名情况和技术栈选择:

方案一:基于共享父域名的Cookie方案

如果你的所有独立网站能调整到同一个父域名下(比如 site1.example.comsite2.example.com 都归属 *.example.com),这是最简单的实现方式:

  • 原理:浏览器允许同一父域名下的子域共享Cookie,只要把认证Cookie的domain属性设置为父域名(比如 .example.com),所有子域就能读取这个Cookie。
  • 实现步骤
    1. 统一所有网站的域名后缀为同一个父域名(这是前提,如果已经是完全独立的顶级域名比如 a.comb.com,这个方案就用不了)
    2. 选其中一个网站作为认证入口(或者搭建独立的认证页),用户登录成功后,后端设置Cookie时指定:domain=.example.compath=/,同时开启HttpOnlySecure属性提升安全性
    3. 其他网站在用户访问时,先检查这个父域Cookie是否存在且有效,若有效则直接为用户创建本地会话,完成自动登录
  • 优缺点
    • ✅ 优点:实现成本极低,依赖浏览器原生机制,无需额外复杂逻辑
    • ❌ 缺点:受限于域名结构,必须统一父域名,灵活性差

方案二:基于Token的跨域认证(前端跨域传递)

适合完全独立的顶级域名场景,核心是用一个中央认证服务(CAS)来协调各网站的登录状态:

  • 原理:用户在任意网站登录后,中央认证服务生成加密的认证Token,通过前端跨域通信(比如postMessage、iframe)把Token传递给其他网站,其他网站验证Token有效性后自动登录。
  • 实现步骤
    1. 搭建独立的中央认证服务器(比如 auth.yourdomain.com),负责处理登录请求、生成加密Token(推荐用JWT)、提供Token验证接口
    2. 用户在 siteA.com 点击登录,跳转到 auth.yourdomain.com 完成登录,登录成功后CAS生成短期有效的JWT,跳回 siteA.com 并把JWT存在siteA的本地存储或Cookie中
    3. 当用户访问 siteB.com 时,siteB 的前端嵌入一个指向 auth.yourdomain.com 的隐藏iframe,这个iframe可以读取CAS的Cookie(同域权限),获取用户的认证状态后,通过postMessage把JWT发送给siteB的主页面
    4. siteB 拿到JWT后,后端调用CAS的验证接口确认Token有效,验证通过则为用户创建本地会话,完成自动登录
  • 优缺点
    • ✅ 优点:支持完全独立的顶级域名,灵活性高,扩展性强
    • ❌ 缺点:需要处理跨域通信的安全校验(比如验证postMessage的来源域名),Token要设置合理的过期时间,防止被劫持

方案三:基于共享会话存储的同步方案

通过共享数据库来同步各网站的登录会话,适合不想依赖前端跨域逻辑的场景:

  • 原理:所有网站共用同一个会话存储(比如Redis、Memcached),用户在一个网站登录后,会话信息写入共享存储,其他网站访问时查询共享存储,若有有效会话则自动登录。
  • 实现步骤
    1. 搭建一个所有网站都能访问的共享会话存储(推荐Redis,性能高且支持过期时间)
    2. 用户在 siteA.com 登录成功后,后端生成唯一的会话ID,将用户信息与会话ID关联存入共享存储,同时把会话ID存在siteA的Cookie中
    3. 用户访问 siteB.com 时,有两种方式获取会话ID:
      • 若用户从siteA跳转过来,可以通过加密的URL参数携带会话ID(注意要加密,防止明文泄露)
      • 或者siteB页面加载时,主动请求中央认证服务的接口,检查当前用户是否有有效会话
    4. siteB 拿到会话ID后,去共享存储查询是否有效,有效则为用户创建本地会话,完成自动登录
  • 优缺点
    • ✅ 优点:不依赖跨域Cookie,适合完全独立的域名,后端逻辑可控性强
    • ❌ 缺点:需要处理会话ID的安全传递问题,共享存储的可用性和安全性是关键,要做好防劫持和容灾

关键安全注意事项

不管用哪种方案,都要注意这些安全细节:

  • 所有认证相关的请求和数据传输必须用HTTPS,防止明文泄露
  • Token或会话ID要设置较短的过期时间,同时支持刷新机制,降低被盗用的风险
  • 跨域通信时要严格校验来源域名,只允许信任的网站接收Token
  • 敏感用户信息不要直接放在Token或Cookie里,只存储用户ID等标识,需要时从数据库查询

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

火山引擎 最新活动