AWS API Gateway с Angular

Кто-нибудь заставил AWS API Gateway работать с интерфейсом Angular.js? У меня есть лямбда-функция, которая отображается с помощью метода POST в API-шлюзе. Я установил заголовки, как указано в этом документе: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

Я тестировал его в Postman, и он отлично работает. Мне не нужно было делать ничего особенного, но когда я выполняю вызов $http.post(), я получаю только заголовок No 'Access-Control-Allow-Origin' в запрошенном ресурсе. Следовательно, Origin http://localhost:9000 не имеет доступа. В ответе было HTTP status code 500..


person dudemonkey    schedule 02.10.2015    source источник
comment
Какой у вас URL-адрес конечной точки? Если это не localhost, вы не сможете отправить запрос из-за CORS (en. wikipedia.org/wiki/Cross-origin_resource_sharing) ограничения. Вам нужно будет либо проксировать ваши запросы, либо запрашивать с того же URL-адреса, что и ваш пункт назначения.   -  person show-me-the-code    schedule 02.10.2015
comment
Какое значение имеет Access-Control-Allow-Origin в API-шлюзе (как сообщение, так и параметры)   -  person Luc    schedule 02.10.2015
comment
'*', как в связанном мной документе. То же самое для методов OPTIONS и POST   -  person dudemonkey    schedule 02.10.2015
comment
@dudemonkey У вас нет никаких успехов в этом вопросе?   -  person U r s u s    schedule 08.10.2015
comment
Еще нет. Надеюсь, я доберусь до лофта AWS, чтобы спросить экспертов, и опубликую здесь решение, если оно у меня получится.   -  person dudemonkey    schedule 08.10.2015
comment
@dudemonkey Вы где-нибудь публиковали сообщения на форумах AWS?   -  person Eric Francis    schedule 16.10.2015
comment
Ага. Не полезно. Мне просто сказали, что это ошибка в моем коде, несмотря на то, что он успешно работает в тестовой консоли и через Postman. На данный момент я отказываюсь от этой идеи.   -  person dudemonkey    schedule 16.10.2015
comment
Можете ли вы опубликовать как запрос, отправленный почтальоном, так и запрос, отправленный Angular?   -  person c4k    schedule 17.10.2015
comment
Может ли эта ошибка Chrome быть связана с code.google.com/p/chromium/ issues / detail? id = 67743?   -  person Gonfva    schedule 30.10.2015


Ответы (5)


Команда Api Gateway здесь.

Надеюсь, вы уже ознакомились с новой функцией «Включить CORS» в консоли. Даже если ваш рабочий процесс разработки находится за пределами консоли, вы можете быстро настроить тестовый API и посмотреть конфигурации заголовков, которые консоль устанавливает для вас, а затем скопировать их в свой Swagger def или любое другое решение, которое вы придумали.

Руководство по документации должно применяться в любом случае. Вам понадобятся 3 заголовка: Access-Control-Allow-Methods, Access-Control-Allow-Origin и Access-Control-Allow-Headers. Их значения будут зависеть от вашего API.

Если вы хотите отправить мне ресурс API, который вы пытаетесь вызвать, я могу взглянуть с нашей стороны.

person jackko    schedule 18.12.2015
comment
Я просто потратил час, пытаясь выяснить, почему ваш документ не работает, и на самом деле это не была ошибка вашего документа, а то, что я не развернул API после этого. Можете ли вы включить это в свой документ: docs.aws .amazon.com / apigateway / latest / developerguide / - person turiyag; 01.06.2016
comment
Черт побери, спасибо, дружище, спасибо! Был на этом уже несколько часов ... оказывается, мне пришлось РАЗВЕРТАТЬ api. Странно, что мне не пришлось этого делать при внесении других изменений! : / - person rex; 04.10.2016
comment
ха-ха. забавно, но в последнее время я несколько раз помогал устранять именно эту проблему. нам еще нужно не забыть развернуть код :) - person Dave Maple; 03.01.2017

В настоящее время у меня есть функция POST, работающая через API Gateway и Lambda, доступ к которой осуществляется из клиента Angular с CORS. Хотя я не знаю, какова ваша конфигурация, я могу поделиться всеми своими соответствующими настройками в надежде, что, возможно, вы найдете что-то, что вы пропустили. Включение CORS на данный момент является довольно сложной задачей (и, надеюсь, это то, что Amazon работает над исправлением), требуя множества небольших шагов во многих областях с довольно плохой документацией.

У меня есть 2 метода (OPTIONS и POST) для моего ресурса, и я поделюсь соответствующими настройками для каждого:

POST:
Запрос метода: ничего особенного. В случае моей конечной точки у меня есть опция в разделе «Пути запроса» для одного из моих параметров маршрута. Я не использую строку запроса, поэтому строка запроса URL пуста. Заголовки HTTP-запроса также пусты.

Запрос на интеграцию:
Тип интеграции: Шаблоны лямбда-сопоставления: у меня есть один (application / json) с шаблоном для передачи соответствующих значений из тела запроса и параметров маршрута в мою лямбда-функцию.

Ответ метода:
Разверните поле кода состояния 200. Добавьте заголовок для «Access-Control-Allow-Origin» и нажмите кнопку с галочкой, чтобы сохранить его. Возможно, вам придется сделать это для любых других кодов состояния, которые могут у вас быть.

Ответ интеграции:
Разверните поле состояния ответа 200. В разделе «Сопоставления заголовков» измените значение сопоставления, чтобы оно содержало «*». Обязательны одинарные кавычки. Возможно, вам придется сделать это для любых других ответов на интеграцию, которые могут у вас возникнуть.

ВАРИАНТЫ:
Запрос метода:
Ничего особенного, как и метод POST.

Запрос на интеграцию:
Я настроил имитацию интеграции. Согласно Amazon, это не имеет значения, поэтому я просто установил имитацию, поскольку все, что нам действительно нужно сделать, это ответить 200 с соответствующими заголовками. Нет шаблонов сопоставления.

Ответ метода:
Разверните поле кода состояния 200. Добавьте следующие 3 заголовка ответа и сохраните их, установив флажок: Access-Control-Allow-Headers, Access-Control-Allow-Methods, Access-Control. -Allow-Origin. Других кодов состояния нет.

Ответ интеграции:
Разверните поле состояния ответа 200. Регулярное выражение пусто (установлено по умолчанию), и этот метод имеет только ответ 200. Разверните сопоставления заголовков и установите для заголовков следующие значения сопоставления:

Access-Control-Allow-Headers: 'Content-Type,X-Amz-Date,Authorization,X-Requested-With'
Access-Control-Allow-Methods: 'GET,POST,OPTIONS'    
Access-Control-Allow-Origin:  '*'

Нет шаблонов сопоставления.

Затем разверните свой API. Надеюсь, теперь он разрешает запросы CORS. Я столкнулся с той же проблемой, что и вы, и я почти уверен, что проблема заключалась в отсутствии значения X-Requested-With в Access-Control-Allow-Headers.

person Akshay Dhalwala    schedule 03.11.2015
comment
Этот ответ идеален. Кнопка Enable CORS в консоли отменяет все, что было сохранено в данный момент. У меня есть билет в службу поддержки, но пока это не будет исправлено, это работает. - person Chalise; 11.01.2016
comment
Если вы сделаете видеоурок по этому поводу, я дам вам 20 долларов в биткойнах. - person Mike; 21.02.2016
comment
@Akshay Dhalwala С вашими изменениями я могу решить проблему CORS, но теперь получаю 401 - Несанкционированная ошибка. Сервис API Gateway интегрирован с сервисом AWS Cognito, где я включил авторизацию для метода GET. Я также добавил параметр X-Requested-With в 'Access-Control-Allow-Headers' и повторно развернул его. Пожалуйста, дайте мне знать, как я могу решить проблему 401. - person Avinash; 18.02.2020

Вы можете «Включить CORS» в AWS API Gateway. Войдите в свою учетную запись AWS и перейдите в API Gateway. Выберите ресурс в разделе Ресурсы и выберите включить CORS в раскрывающемся меню действий. Это включит CORS для всех методов ресурса. Пожалуйста, проверьте ссылку ниже для получения подробной информации

https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

person Sanjeev Chauhan    schedule 19.04.2018

TL; DR; Это не проблема CORS, проблема исходит из шлюза API, проверьте проблему в обработчике API на шлюзе API. Убедитесь, что ваш API может работать с Postman, прежде чем использовать его в своем проекте пользовательского интерфейса.

Вы можете следовать этому руководству как использовать CORS . Но похоже, что вы уже сделали это действие.

Давайте сначала поговорим о CORS: это механизм, который поможет вам защитить ваших клиентов, когда они используют ваше веб-приложение, и позволит вам настроить заголовки ответов таким образом, чтобы:

  • Другие хосты могут получить доступ к ресурсам вашего веб-приложения. Например: Access-Control-Allow-Origin: abc.com, когда вы возвращаете ответ с этим заголовком. Это разрешит запросы от хоста abc.com.
  • Ограничьте доступные для специфики методы HTTP. Например: Access-Control-Allow-Methods: GET, PUT, разрешить источнику доступ к ресурсам только с помощью метода GET или PUT, не разрешать POST, DELETE или любые другие методы.
  • Заголовки разрешенных запросов совпадают с заданным вами списком. Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token, некоторые из этих заголовков определены Amazon, вы можете указать свои собственные заголовки.

Вам следует подумать об установке значения для этого атрибута. На мой взгляд, просто используйте * (Access-Control-Allow-Origin: *) при разработке и измените значение на конкретный домен или подстановочный знак (Access-Control-Allow-Origin: *.abc.com) при публикации вашего API.

А вот как работает CORS:

введите описание изображения здесь

Как вы можете видеть здесь, перед тем, как ваш фактический запрос был отправлен на API-шлюз, ваш браузер отправил запрос OPTIONS на API-шлюз, чтобы убедиться, что ваш запрос разрешен для отправки на API-шлюз. Если запрос OPTIONS вернет 200, ваш фактический запрос будет отправлен в API Gateway.

  1. Если ваш запрос OPTIONS не удался. Тогда ваш запрос не может быть отправлен на API Gateway. В инструментах разработчика вы увидите что-то вроде No 'Access-Control-Allow-Origin' is present on the requested resource..., но сообщений об ошибке больше нет. Запрос вернет статус 0 -> Вам необходимо настроить CORS.

  2. Еще один случай - это то же самое, что вы объясняете в своем вопросе. Получил HTTP Status Code 500, а также кое-что о CORS. Это не проблема CORS, я думаю, проблема браузера. В этом случае OPTIONS запрашивает код состояния возврата 200. Фактический код состояния возврата запроса 500 означает, что ваш API уже сломан. Браузер по-прежнему отправляет No 'Access-Control-Allow-Origin' is present on the requested resource... ошибку. В этом случае вам нужно отладить свой API, чтобы увидеть проблему.

Надеюсь, это поможет!

person Toan Quoc Ho    schedule 02.02.2019

Поскольку ваша ошибка говорит: «На запрошенном ресурсе нет заголовка 'Access-Control-Allow-Origin'». похоже, что когда вы пытаетесь вызвать API из Angular, он не получает заголовок Access-Control-Allow-Origin, который был настроен, когда вы следовали документам Amazon.

Во-первых, я бы дважды проверил, что вы вызываете правильный URL-адрес для API. Amazon отображает это на экране этапов, но вы должны добавить сценическое имя к URL-адресу, который они вам показывают. Итак, если вы развернулись на стадии "прод", и они отображают

https://xyz.execute-api.us-west-2.amazonaws.com/my-api

Вам нужно позвонить

https://xyz.execute-api.us-west-2.amazonaws.com/my-api/prod

Затем я бы попробовал вызвать метод OPTIONS в вашем API от почтальона. После изменения метода POST на OPTIONS и вызова API проверьте заголовок в разделе результатов Postman. Вы хотите видеть там следующее:

Access-Control-Allow-Methods → POST,OPTIONS
Access-Control-Allow-Origin → *

Если вы не видите их в ответе, дважды проверьте ответ метода под методом OPTIONS в вашем API. Убедитесь, что эти заголовки добавлены для ответа 200.

В качестве последнего результата вы можете попробовать использовать кнопку «Включить CORS», которую недавно добавила Amazon. Выберите свой ресурс в дереве слева и найдите кнопку «Включить CORS» в правом верхнем углу. Щелкните по нему, и AWS воссоздает все методы, связанные с CORS.

Я надеюсь, что некоторые из этих шагов помогут!

person kennbrodhagen    schedule 21.11.2015