如何跳转至其他网站并同时发送JWT作为Bearer Token?
问题解答:跳转外部网站并携带JWT作为Bearer Token
你当前的fetch实现方式无法达成需求,核心原因是:
你用fetch发送的带Authorization头的请求,和后续window.location.href触发的页面跳转是两个完全独立的HTTP请求。跳转的请求是浏览器发起的全新导航请求,不会继承fetch请求里的任何请求头——等于白做了前面的fetch步骤,还可能额外触发CORS跨域错误(如果目标网站没配置允许你的域名跨域请求)。
可行的实现方案
根据你和目标网站的域名关系,选择以下合适的方式:
1. 同域/共享父域场景:用Cookie传递JWT
如果两个网站属于同域(比如a.example.com和b.example.com共享父域example.com),可以把JWT写入跨域Cookie,跳转后目标网站直接从Cookie读取验证。
$(document).ready(function() { document.getElementById('Aother-Website-Link').addEventListener('click', event => { event.preventDefault(); // 根据实际域名调整Cookie参数 document.cookie = `jwt=${jwt}; path=/; domain=.example.com; SameSite=None; Secure; HttpOnly`; window.location.href = 'Another-Website-Link'; }); });
注意:SameSite=None和Secure属性需要配合HTTPS环境使用,HttpOnly能降低XSS攻击风险。
2. 跨域且无共享域场景:URL参数传递(不推荐,有安全风险)
如果只能通过URL传递,可将JWT编码后放在URL参数里,但这种方式会把敏感的JWT暴露在浏览器历史、服务器日志中,仅适用于非敏感场景:
$(document).ready(function() { document.getElementById('Aother-Website-Link').addEventListener('click', event => { event.preventDefault(); const encodedJwt = encodeURIComponent(jwt); const targetUrl = `Another-Website-Link?token=${encodedJwt}`; window.location.href = targetUrl; }); });
目标网站需要从URL的token参数中提取JWT进行验证。
3. 正规跨域方案:走SSO单点登录流程
跨域场景下最安全合规的方式是采用OAuth2/OpenID Connect这类单点登录(SSO)标准流程:
- 你的网站先向统一认证服务器申请授权码;
- 跳转至目标网站时携带该授权码;
- 目标网站使用授权码向认证服务器换取JWT,完成身份验证。
这种方式避免了JWT直接在前端传递的安全风险,也是企业级应用的常用方案。
内容的提问来源于stack exchange,提问作者Ramin Zahedi
相关产品推荐
相关产品推荐

