Механизм приложения Google предотвращает запрос OPTIONS между двумя службами

Я создал проект GAE и развернул две службы:

  1. по умолчанию (https://myservice.appspot.com) для интерфейсного приложения
  2. бэкэнд (https://backend-dot-myservice.appspot.com) для бэкенда ( Node.js)

Я также добавил собственный домен, чтобы служба по умолчанию была доступна также по адресу https://myservice.com.

У меня проблема в том, что каждому запросу AJAX, выполняемому браузером, предшествует запрос OPTIONS (для обработки CORS).

Какое лучшее решение, чтобы избежать этого запроса OPTIONS? Это должно быть исправлено, если оба интерфейса и серверные части находятся на одном хосте, но как я могу сделать это в Google App Engine?

Спасибо!


person user2010955    schedule 15.10.2019    source источник
comment
Поможет ли вам что-то вроде CORS в App Engine? У вас есть методы для приложений на основе Python, Java и Go. Этот SO case может помочь.   -  person sllopis    schedule 15.10.2019
comment
Я уже применил CORS (иначе это не сработало бы, если бы клиент и сервер находились в разных источниках), но при этом браузер выполняет предварительный запрос OPTIONS для всех запросов от внешнего интерфейса к внутреннему. Это то, что я хочу предотвратить, и единственный способ, который я знаю, - это иметь и клиент, и сервер в одном и том же источнике, чтобы CORS больше не нужен...   -  person user2010955    schedule 15.10.2019


Ответы (2)


Я решил добавить файл dispatch.yaml в службу по умолчанию.

dispatch:
- url: "*/api/*"
service: backend

где бэкэнд — мой бэкэнд-сервис. И я изменил свой бэкэнд, чтобы прослушивать адреса вроде /api/something.

Итак, теперь у браузера есть источник https://myservice.com и URL-адрес запросов ajax. в бэкенде, например, https://myservice.com/api/something. Поскольку теперь клиент и сервер имеют один и тот же источник, настройки CORS больше не нужны, а запрос OPTIONS браузером не выполняется.

Я не знаю, лучшее ли это решение, но для меня это сработало.

person user2010955    schedule 16.10.2019

Как уже упоминалось в этом сообщении Stackoverflow:

Запросы OPTIONS – это предварительные запросы при совместном использовании ресурсов между источниками (CORS).

Этот предварительный запрос выполняется некоторыми браузерами в качестве меры безопасности, чтобы убедиться, что сервер доверяет выполняемому запросу. Это означает, что сервер понимает, что метод, источник и заголовки, отправляемые в запросе, безопасны для действий.

Ваш сервер не должен игнорировать, а обрабатывать эти запросы всякий раз, когда вы пытаетесь выполнить запросы из разных источников.


Поддержка CORS для Google App Engine в вашем app.yaml:

Одним из важных применений этой функции является поддержка общего доступа к ресурсам из разных источников (CORS), например для доступа к файлам, размещенным в другом приложении App Engine.

Например, у вас может быть игровое приложение mygame.appspot.com, которое обращается к активам, размещенным на myassets.appspot.com. Однако, если mygame попытается отправить JavaScript XMLHttpRequest к myassets, это не удастся, если обработчик myassets не вернет заголовок ответа Access-Control-Allow-Origin:, содержащий значение http://mygame.appspot.com.

handlers:
- url: /images
  static_dir: static/images
  http_headers:
    Access-Control-Allow-Origin: http://mygame.appspot.com

Примечание: если вы хотите разрешить всем доступ к вашим активам, вы можете использовать подстановочный знак «*» вместо http://mygame.appspot.com.

person sllopis    schedule 15.10.2019
comment
спасибо, но опять же, я хочу предотвратить запросы OPTIONS, единственный известный мне способ предотвратить это — иметь клиент и сервер в одном и том же источнике, но как я могу иметь две службы в одном источнике в GAE? - person user2010955; 15.10.2019
comment
Вы пробовали это? Для запроса ajax должны быть выполнены следующие условия: Запрос не устанавливает пользовательские заголовки HTTP, такие как «application/xml» или «application/json» и т. д. Метод запроса должен быть одним из GET, HEAD или POST. При использовании POST тип содержимого должен быть одним из следующих: application/x-www-form-urlencoded, multipart/form-data или text/plain. Подробнее здесь - person sllopis; 15.10.2019
comment
Документация указывает, что веб-контент origin определяется схемой (протоколом), хостом (доменом) и портом URL-адреса, используемого для доступа к нему. Два объекта имеют одинаковое происхождение, только если схема, хост и порт совпадают. Некоторые операции ограничены содержимым того же происхождения, и это ограничение можно снять с помощью CORS. См. ссылку для примеров того же происхождения и разных источников. - person sllopis; 15.10.2019