Fetch API не отправляет файлы cookie сеанса при использовании внутри расширения Chrome

Я пытаюсь создать расширение Chrome, которое извлекает некоторые данные из запросов на вытягивание на Github с помощью Fetch API, а затем отображает их в другом месте. У меня возникают некоторые проблемы, когда я пытаюсь использовать это с закрытым репозиторием на Github. Я считаю, что это связано с защитой CSRF и правилами, регулирующими расширения Chrome, имеющие доступ к файлам cookie сеанса.

В моем расширении manifest.json есть следующее:

"content_scripts": [{
    "matches": [
        "*://github.com/*/*/pulls"
    ],
    "js": ["script/underscore-1.8.3.min.js", "script/content.js"]
}],
"permissions": [
    "tabs",
    "activeTab",
    "*://github.com/*",
    "webNavigation"
]

Но когда я запускаю следующее из своего script/content.js:

fetch('/redacted/redacted/pull/4549', {credentials: 'same-origin'}).then((response) => {
    return response.text();
}).then((text) => {
    // do cool stuff
})

Это приводит к ответу 404 от Github. Проверяя этот запрос на вкладке сети Chrome Inspector, я вижу, что он не отправляет заголовок сеанса GitHub вместе с запросом.

Если я сделаю тот же самый запрос, используя подсказку Javascript в Инспекторе, я увижу ответ 200 и увижу, что он отправляет файлы cookie моего сеанса.

Насколько я понимаю, указание домена Github в моем manifest.json будет означать, что мое расширение будет иметь доступ к данным моего сеанса в моих сценариях содержимого, разве это не правильно? Что я должен сделать, чтобы сделать действительный запрос на этот защищенный контент?


person majackson    schedule 21.02.2016    source источник
comment
У меня тоже есть эта проблема, fetch просто не отправляет файлы cookie даже с credentials: 'same-origin', в то время как XHR просто отправляет все, что мне кажется ошибкой.   -  person Daiwei    schedule 20.05.2016


Ответы (2)


Согласно Chrome blog, чтобы включить файлы cookie, вам нужно credentials: 'include' вместо credentials: 'same-origin'.

person Daiwei    schedule 20.05.2016
comment
Хотя использование credentials: 'include' действительно является правильным решением, сообщение в блоге, которое вы цитируете, никоим образом не поддерживает вас; он даже не упоминает расширения Chrome или credentials: 'same-origin' (что является допустимой опцией в параметре init вызова fetch(), но просто не будет работать в контексте расширение для хрома). Настоящая причина, по которой вам нужен credentials: 'include', заключается в том, что расширения Chrome выполняются в условном окне, URL-адрес которого находится в схеме chrome-extension:// и, следовательно, определенно не в том же источнике, что и любой реальный домен, для которого вы, возможно, захотите сделать запрос на выборку. к. - person Mark Amery; 15.10.2017
comment
Я по-прежнему не могу отправлять файлы cookie даже после установки credentials: 'include'. Я прочитал тонны SO-вопросов, но безуспешно. - person PythonEnthusiast; 30.05.2019
comment
У меня такая же проблема, когда я делаю это из расширения Chrome. Он работает с тем же расширением Firefox, поэтому я уверен, что все CORS-заголовки настроены правильно. @PythonEnthusiast, вы тем временем нашли решение для этого? - person The Wavelength; 14.11.2020

Указание github в разрешениях дает доступ только к хосту, чтобы ограничить ущерб, если расширение/приложение скомпрометировано вредоносным ПО (источник).

В документации скриптов контента не указано, что данные сеанса могут быть получены в скриптах контента, только их DOM. . Я думаю, было бы лучше, если бы вы использовали и включили официальный Github API в проект расширения Chrome, который вы создаете.

person adjuremods    schedule 22.02.2016