跨域单点登录Token丢失本质是同源策略与Cookie作用域限制所致,需通过中心化认证服务(如OAuth2)、同主域设Domain=.example.com+SameSite=None;Secure、第三方走OAuth2授权码模式或后端代理解决。

跨域单点登录(SSO)中 Token 传递丢失,本质是浏览器同源策略和 Cookie 作用域限制导致的。核心解决方向不是“强行传 Token”,而是让认证状态能在跨域场景下被可信识别和延续——通常靠后端协调 + 前端适配,而非前端单独 hack。
后端统一认证中心(Auth Server)是前提
Token 丢失的根本原因,常在于多个子系统各自维护会话,没有共享信任锚点。必须有一个中心化的认证服务(如 OAuth2 授权服务器、CAS 或自建 Auth API),所有子域/跨域应用都向它验证身份,而不是各自存 Token。
- 用户首次登录时,跳转到 auth.example.com/login,成功后颁发一个长期有效的、签名的 SSO Token(如 JWT),并设置 Domain=.example.com 的 HttpOnly Cookie
- 各子应用(a.example.com、b.example.com、app.thirdparty.com)不自己存 Token,而是每次请求时携带该 Cookie,由后端网关或中间件统一校验
- 第三方跨域应用(非同主域)需走 OAuth2 Authorization Code Flow,通过重定向 + code 换 token,避免前端接触敏感凭证
同主域下用一级域名 Cookie 共享会话
如果 a.example.com 和 b.example.com 属于同一主域,最简单可靠的方式是把认证 Cookie 的 Domain 设为 .example.com,并开启 SameSite=None; Secure(仅限 HTTPS 环境)。
基于官方 GMGN API 的代币分析工具。通过合约地址查询代币在 SOL/BSC/Base 链上的准确市场数据、安全检测、KOL 分析、开发者分析和 AI 智能分析(叙事/筹码/老鼠仓/机器人)。支持自动识别链。
- 后端 Set-Cookie 时明确指定:Set-Cookie: sso_token=xxx; Domain=.example.com; Path=/; HttpOnly; Secure; SameSite=None
- 前端发起跨子域请求时,fetch 或 axios 需带上 credentials:credentials: 'include'
- 注意:Chrome 80+ 要求 SameSite=None 必须搭配 Secure,即只在 HTTPS 下生效;HTTP 开发环境可用 localhost 绕过限制
完全跨域(不同主域)推荐后端代理或 OAuth2 中继
像 app.com 访问 api.service.org 的场景,无法共享 Cookie,也不应让前端暴露 Token。正确做法是:
立即学习“Java免费学习笔记(深入)”;
- 后端代理模式:app.com 的后端作为反向代理,把请求转发给 service.org,并在转发时注入认证头(如 Authorization: Bearer xxx)或内部票据,前端始终只跟同域后端通信
- OAuth2 中继模式:app.com 引导用户跳转至 service.org/auth?client_id=xxx&redirect_uri=app.com/callback,service.org 认证后回调并返回 code,app.com 后端再用 code 向 service.org/token 换取访问令牌,全程 Token 不暴露给前端
- 避免前端 localStorage/sessionStorage 存 Token 后手动带入跨域请求——既不安全,又因 CORS 预检失败或缺少 credentials 而丢失
调试关键检查点
Token “丢失”往往不是代码问题,而是配置或流程断点。快速定位可查:
- 浏览器开发者工具 → Application → Cookies:确认目标域名下是否有预期的认证 Cookie,Domain 和 Secure 标志是否匹配当前页面协议和域名
- Network → 请求 Headers:检查 Request Headers 是否含 Cookie(若没出现,说明未满足发送条件);Response Headers 是否有新的 Set-Cookie(注意是否被浏览器拒绝,比如 SameSite 冲突)
- CORS 响应头是否包含:Access-Control-Allow-Origin: https://your-frontend-domain.com(不能为 *,否则 credentials 不生效)和 Access-Control-Allow-Credentials: true
- 前端 fetch 是否漏写 credentials: 'include',或 axios 是否配置了 withCredentials: true

















