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

如何在同域Angular应用间安全共享Access Token实现自动登录?

同主域名下Angular应用间自动登录的安全实现方案

因为两个应用属于同主域名(example.com)的子域名,完全可以通过以下几种安全方式实现自动登录:

方案一:利用主域名Cookie存储JWT(推荐)

sessionStorage是子域隔离的,无法跨app-a.example.com和app-b.example.com访问,但Cookie可以通过设置domain属性实现跨子域共享:

  • 当用户在App A登录成功后,后端在设置JWT时,将Cookie的domain设为.example.com(注意前面的点),同时添加以下安全属性:
    • Secure:仅在HTTPS请求中传输,防止明文泄露
    • HttpOnly:禁止前端JS读取Cookie,避免XSS攻击窃取令牌
    • SameSite=Strict或Lax:阻止跨站请求携带Cookie,防范CSRF攻击
  • App B加载时,浏览器会自动携带该Cookie到后端,后端验证Cookie中的JWT有效性后,直接完成用户登录,无需前端额外操作。

如果业务需要前端读取JWT(比如前端要做权限判断),可以不用HttpOnly,但必须做好XSS防护:比如对所有用户输入做转义、启用Content-Security-Policy(CSP)、避免使用eval等危险API。

方案二:一次性授权码跳转(适合无法用Cookie的场景)

如果不想用Cookie,可以通过一次性授权码间接传递身份信息,避免JWT直接暴露在URL中:

  1. 用户在App A点击跳转按钮时,先向后端请求生成一个短有效期、一次性的授权码(比如5分钟内有效,使用后立即作废)
  2. 将授权码作为URL参数(如app-b.example.com/login?code=xxx)跳转到App B
  3. App B加载后,立即用这个授权码向后端请求换取JWT,后端验证授权码有效后,返回JWT并作废该授权码
  4. App B将获取到的JWT存入自身的sessionStorage,完成自动登录

这种方式的优势是即使授权码被泄露,有效期短且只能使用一次,风险可控;缺点是多了一次后端请求。

方案三:跨子域页面通信(document.domain)

通过设置document.domain实现同主域名下的页面通信:

  1. 在App A和App B的页面中,都设置document.domain = 'example.com'(注意:必须在页面加载早期执行)
  2. App A跳转前,可以打开App B的隐藏iframe,通过postMessage将JWT发送给iframe中的App B页面
  3. App B接收到消息后,验证消息的origin为app-a.example.com,确认合法后将JWT存入sessionStorage,完成登录

这种方式需要注意:postMessage必须严格验证发送方的origin,避免恶意页面伪造消息;同时JWT在传输过程中要确保是HTTPS环境,防止被窃听。

通用安全注意事项

  • 所有通信必须使用HTTPS,防止令牌被中间人窃取
  • JWT设置较短的过期时间(比如15-30分钟),配合刷新令牌机制实现无感续期
  • 对两个应用都启用XSS防护:开启CSP、过滤用户输入、避免不安全的DOM操作
  • 后端对所有敏感接口启用CSRF验证(如果用Cookie的话,SameSite属性可以大幅降低风险,但仍建议配合CSRF令牌)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 01:38:12