#javascript #google-chrome-extension #google-cloud-functions #cors #gsutil
#javascript #google-chrome-расширение #google-cloud-функции #cors #gsutil
Вопрос:
Я работаю над расширением Google Chrome, чтобы блокировать подмножество изображений из сообщений в ленте Reddit пользователя на основе некоторого серверного компьютерного зрения, выполняемого на Python в облачном хранилище Google. Код Python принимает один аргумент (URL изображения в Reddit), который передается в JavaScript через:
const api_url = https://<my-google-chrome-url>
var curUrl = $(this).attr("src")
fetch(api_url,{
method: 'POST',
body: JSON.stringify(curUrl),
headers: {
'Content-Type': 'application/json'
},
})
.then(data => {console.log(data)})
Когда выполняется код расширения, я получаю следующее в консоли:
Доступ к выборке в ‘https://this-is-the-path-to-my-google-cloud-function » из источника «https://www.reddit.com ‘ заблокирован политикой CORS: ответ на предполетный запрос не проходит проверку контроля доступа: заголовок ‘Access-Control-Allow-Origin’ отсутствует на запрошенном ресурсе. Если непрозрачный ответ удовлетворяет вашим потребностям, установите режим запроса на «no-cors», чтобы получить ресурс с отключенным CORS.
Я пробовал несколько решений, перечисленных ниже:
- Я следовал приведенным здесь инструкциям, так что, используя Google
gsutil
, я могу подтвердить, что следующее верно для корзины, в которой находится моя функция:[{"maxAgeSeconds": 3600, "method": ["GET", "POST"], "origin": ["https://www.reddit.com"], "responseHeader": ["Content-Type"]}]
. Я также пытался["*"]
использовать его в качестве источника, но безрезультатно. - Я также пытался использовать в своей выборке,
mode: no-cors
но безуспешно.
Любые предложения или решения будут высоко оценены!
Комментарии:
1.
<my-google-chrome-url>
разрешает ли CORS?2.
Response to preflight
… включая обработкуOPTIONS
предполетного запроса3. Спасибо за комментарий @Jaromanda X Согласно командам gsutil, которые я запускал, <my-google-chrome-url> должен быть настроен, как в #1 выше. Есть ли дополнительные разрешения, которые мне нужно внести в мой код Python или другие?
4. прочитайте о предполетной проверке на этой странице … в частности, пункты 3, 5 и 6
5. Современный Chrome запрещает запросы из разных источников в сценариях содержимого, поэтому делайте это в фоновом скрипте. Чтобы сделать запрос с перекрестным источником в фоновом скрипте, просто добавьте URL
permissions
-адрес и используйтеfetch
orXMLHttpRequest
как есть, никаких хитростей не требуется, см. developer.chrome.com/extensions/xhr
Ответ №1:
Что касается того, что вы упомянули, ошибка CORS в этом случае, похоже, исходит из облачной функции.
Чтобы решить эту проблему, вы должны настроить CORS для облачной функции, а не для облачного хранилища.
CORS состоит из предполетного запроса и основного запроса. В вашей функции вы должны проверить наличие предполетного запроса, проверив, является ли метод запроса ОПЦИЕЙ, и если да, ответьте на соответствующие заголовки. Вот пример:
def cors_enabled_function(request):
# For more information about CORS and CORS preflight requests, see
# https://developer.mozilla.org/en-US/docs/Glossary/Preflight_request
# for more information.
# Set CORS headers for the preflight request
if request.method == 'OPTIONS':
# Allows GET requests from any origin with the Content-Type
# header and caches preflight response for an 3600s
headers = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET',
'Access-Control-Allow-Headers': 'Content-Type',
'Access-Control-Max-Age': '3600'
}
return ('', 204, headers)
# Set CORS headers for the main request
headers = {
'Access-Control-Allow-Origin': '*'
}
return ('Hello World!', 200, headers)
Для получения дополнительной информации вы можете прочитать документы