Как разрешить межсайтовые запросы происхождения в Google App Engine?

У меня есть простой API, созданный с помощью Express, который возвращает json. Сервер Express работает на Google App Engine. Я использую cors (https://www.npmjs.com/package/cors) чтобы включить ВСЕ CORS-запросы, но я все равно получаю сообщение «Нет заголовка Access-Control-Allow-Origin на запрошенном ресурсе». при выполнении запросов AJAX из приложения SPA.

app.use(cors())

Настройки по умолчанию для вышеуказанного в соответствии с документацией: { "origin": "*", "methods": "GET,HEAD,PUT,PATCH,POST,DELETE", "preflightContinue": false, "optionsSuccessStatus": 204 }

Этого должно быть достаточно, так как я делаю только простой GET-запрос из своего SPA.

Любые идеи?


person borkanee    schedule 02.05.2019    source источник
comment
Продолжайте и добавьте код, который вы пробовали.   -  person Joey Phillips    schedule 02.05.2019
comment
@JoeyPhillips Немного изменил вопрос, добавив дополнительную информацию   -  person borkanee    schedule 02.05.2019


Ответы (3)


Меня действительно смущает документ, потому что он подразумевает, что заголовки CORS могут быть отправлены только при обслуживании статического контента, а не в более распространенном сценарии, когда CORS сообщает браузеру, что можно принимать JSON или XML из бэкэнда при вызове через третье - вечеринка размещена сценарием.

Мой обходной путь - просто вернуть его как настраиваемый заголовок в самом приложении. Например, с Flask:

from flask import Flask, jsonify
app = Flask(__name__)
@app.route("/")
def root():
     import traceback
     try:
         data = {'key1': "value1", 'key2': "value2"}
         return jsonify(data), 200, {'Access-Control-Allow-Origin': "*"}
     except:
         return format(traceback.format_exc()), 500,  {'Content-Type': "text/plain"}

if __name__ == '__main__':
    app.run()
person John Heyer    schedule 09.05.2021
comment
Спасибо тебе за это! Оба официальных решения ничего не сделали для меня - как свойство app.yaml http_headers, так и использование python CORS(app). Это корс, всегда час выдергивания волос, каждый раз, когда они появляются. - person chichilatte; 06.07.2021

App Engine поддерживает CORS через файл app.yaml, как указано здесь: ссылка

В файле app.yaml измените раздел handlers, добавив элемент http_headers, как показано ниже:

handlers:
- url: /images
  static_dir: static/images
  http_headers:
    Access-Control-Allow-Origin: '*'
  # ...

После этого вы можете повторно развернуть свой App Engine, чтобы применить изменения конфигурации.

person Renzo    schedule 03.05.2019
comment
Спасибо за ответ! Насколько я понимаю, это для статических файлов. В моем случае, когда у меня есть простой API, выполняющий json-ответы, заголовок Access-Control-Allow-Origin должен быть установлен внутри кода (т.е. с помощью модуля cors или чего-то еще). И это у меня не работает. - person borkanee; 03.05.2019
comment
Есть идеи, какие поля для этого нужны? Я попытался просто добавить http_headers, но это не сработало. - person basickarl; 19.11.2020

Как я здесь ответил, https://stackoverflow.com/a/62075272/2235936

Не нужны эти handlers вещи в app.yaml, просто установите CORS в сегменте хранилища G.

person avocado    schedule 28.05.2020
comment
Речь идет о Google App Engine, а не об облачном хранилище! - person koma; 19.10.2020