不是同一域名下 iframe如何传递token
时间: 2024-12-20 22:16:27 浏览: 4
如果你要在非同源的iframe之间传递安全令牌(通常用于身份验证),由于浏览器的安全策略(跨域资源共享-CORS),直接通过HTML属性或JavaScript的`document.domain`设置通常是不允许的,因为这涉及到所谓的同源策略。
然而,有几种间接的方式来实现这一目的:
1. **JSON-P (JSON with Padding)**: 创建一个包含数据(包括token)的服务器端脚本,该脚本可以跨域返回,并且格式化为一个`<script>`标签,客户端通过动态插入这个链接来获取数据。
```javascript
// parent.html
var script = document.createElement('script');
script.src = 'https://otherdomain.com/token?callback=parentCallback';
document.head.appendChild(script);
function parentCallback(token) {
// 使用token...
}
```
2. **POST请求(服务器转发)**: 在父页面发送一个POST请求到服务器,请求带上token,然后服务器将token返回给iframe,或者将token存储在一个共享存储(如Local Storage或IndexedDB)里,让iframe通过查询或读取获取。
```javascript
// parent.js
fetch('/api/token', { method: 'POST', body: { token } })
.then(response => response.json())
.then(tokenData => {
iframe.contentWindow.postMessage(tokenData.token, '*');
});
// child.js (接收消息)
window.addEventListener('message', event => {
if (event.origin !== 'https://otherdomain.com') return;
console.log('Received token:', event.data);
});
```
3. **利用CSP(Content Security Policy)**:如果服务器支持CSP,允许从特定来源加载资源,你可以设置允许iframe从某个源加载响应头,然后在response header里携带token。
尽管如此,这些方法都有其局限性,比如安全风险或性能开销,所以通常在设计上需要权衡利弊。特别是对于敏感信息(如token),建议还是尽量避免跨域传输,并考虑其他的授权机制。
阅读全文