首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在websocket连接中从扩展的后台脚本发送cookie?

问如何在websocket连接中从扩展的后台脚本发送cookie?
EN

Stack Overflow用户
提问于 2021-09-19 21:43:23
回答 1查看 148关注 0票数 0

我正在尝试打开一个从chrome扩展到我的后端的经过身份验证的websocket连接,为此我使用了会话cookie。这是我的清单文件:

代码语言:javascript
复制
{
    "manifest_version": 2,
    "background": {
        "scripts": ["extension.js"],
        "persistent": true
    },
    "permissions": [
        "tabs",
        "storage",
        "http://localhost:8000/",
        "ws://localhost:8000/"
    ],
    "icons": {
        "16": "img/icon16.png",
        "48": "img/icon48.png",
        "128": "img/icon128.png"
    }
}

在那里,我请求允许在HTTP和websocket方案上访问localhost:8000,但是Chrome只为AJAX请求发送cookie。如果我尝试

代码语言:javascript
复制
await fetch('http://localhost:8000/checklogin', {
    method: 'GET',
    credentials: 'include'
});

从后台脚本发送cookie,但如果我尝试

代码语言:javascript
复制
const ws = new WebSocket('ws://localhost:8000/');

根本不会发送cookie。

不是同一个域名,为什么Chrome不为websocket发送cookie?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-20 18:24:42

根据我的研究,我得出结论,带有websocket凭据的CORS在chrome扩展中不受支持,因此Chrome不会在websocket升级请求中注入凭据。解决方法是使用chrome.webRequest截获websocket升级请求并注入Cookie标头:

代码语言:javascript
复制
class WebsocketCookie {

    constructor(websocketUrl, name, value) {
        this.name = name;
        this.value = value;
        chrome.webRequest.onBeforeSendHeaders.addListener(
            ({ requestHeaders }) => {
                requestHeaders.push({name: 'Cookie', value: `${this.name}=${this.value}`});
                return {requestHeaders};
            },
            {types: ['websocket'], urls: [websocketUrl]},
            ['blocking', 'requestHeaders', 'extraHeaders']
        );
    }
}

// you can change this cookie later by changing cookie.name or cookie.value
const cookie = new WebsocketCookie('ws://localhost:8000/', 'sessionid', 'my_session_id');
const ws = new WebSocket('ws://localhost:8000/'); // sessionid cookie will be injected

这需要将websocket URL、webRequest和webRequestBlocking权限添加到清单文件。使用chrome.cookies获取需要在websocket升级请求中注入的cookies。

如果你想提高安全性,onBeforeSendHeaders回调会将该请求的来源作为initiator成员,用它来检查来源是否是你自己的分机。您可以使用chrome.management接口获取您的扩展的来源。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69247283

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档