AWS APIGateway CORS для Lambda Proxy не применяется

Я настроил ресурс APIGateway с методом POST Lambda Proxy и методом OPTIONS для заголовков CORS.

Метод OPTIONS возвращает следующие заголовки:

$ curl -i -X OPTIONS https://xxxxxxxxx.execute-api.eu-central-1.amazonaws.com/dev/endpoint1

HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 0
Connection: keep-alive
Date: Sat, 18 Feb 2017 17:07:17 GMT
x-amzn-RequestId: xxxx
Access-Control-Allow-Origin: *
Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
Access-Control-Allow-Methods: POST,OPTIONS
X-Cache: Miss from cloudfront
Via: 1.1 xxxx.cloudfront.net (CloudFront)
X-Amz-Cf-Id: xxxx==

Тем не менее, когда я вызываю конечную точку POST со сгенерированным Javascript SDK, консоль браузера Chrome показывает эту ошибку:

XMLHttpRequest cannot load https://xxxx.execute-api.eu-central-1.amazonaws.com/dev/endpoint1.
No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:8080' is therefore not allowed access.

а также Firefox:

Cross-Origin Request Blocked: 
The Same Origin Policy disallows reading the remote resource at https://xxxx.execute-api.eu-central-1.amazonaws.com/dev/endpoint1.
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing).

Почему мой заголовок CORS не учитывается? Требуются ли дополнительные изменения в настройках метода POST?


person Appleshell    schedule 18.02.2017    source источник
comment
Вы не можете ожидать, что CORS будет работать с локальным хостом, по-видимому, потому что это подделка, и ваш браузер знает об этом. Протестируйте свой сайт, используя http://lvh.me или http://www.127.0.0.1.xip.io. Это псевдонимы для localhost, но ваш браузер этого не знает.   -  person Michael - sqlbot    schedule 18.02.2017


Ответы (3)


Кажется, требуется добавить заголовки вручную в лямбда-функцию.

В случае NodeJS скрипт будет выглядеть так:

context.succeed({
    "statusCode": 200,
    "headers": {
        "X-Requested-With": '*',
        "Access-Control-Allow-Headers": 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with',
        "Access-Control-Allow-Origin": '*',
        "Access-Control-Allow-Methods": 'POST,GET,OPTIONS'
    },
    "body": JSON.stringify(response)
})
person Appleshell    schedule 18.02.2017
comment
@asdfasdfads Вы также установили ответ заголовка OPTIONS в шлюзе? Это определенно сработало для меня, и, учитывая голоса за этот ответ, это, должно быть, сработало и для других людей. - person Appleshell; 31.08.2018
comment
сработало для меня спасибо. сводил меня с ума! Я использую API-шлюз для запуска прокси-лямбда. я только добавил заголовок Access-Control-Allow-Origin: '*' в свой лямбда-ответ, и это сработало! - person Clive Sargeant; 11.06.2019
comment
Иметь прокси-сервер API GW для интеграции Lambda. У меня были проблемы с работой CORS. Поэтому мое решение состояло в том, чтобы отправлять заголовки CORS из бэкэнда и удалять параметры и коры в шаблоне Cloudformation. После этого он, наконец, начал работать. - person nekman; 23.08.2020

Лучшим подходом было бы использование шлюза API для обогащения полезной нагрузки вашей лямбды заголовками, связанными с CORS, как описано здесь: https://kennbrodhagen.net/2015/12/02/how-to-access-http-headers-using-aws-api-gateway-and-lambda/

Это гораздо более масштабируемый и менее подверженный ошибкам подход.

person JTango18    schedule 22.06.2018
comment
Этот метод не будет работать, когда API находится в режиме прокси. - person David B; 31.05.2020

Пожалуйста, проверьте пункты ниже.

  1. Вы развернули обновленный API?
  2. Вы создали метод OPTIONS для своего ресурса API?
  3. Did you add response headers for Method Response of OPTIONS method like below?
    • Access-Control-Allow-Headers
    • Access-Control-Allow-Methods
    • Access-Control-Allow-Origin
  4. Вы выполнили действие «Включить CORS» для своего ресурса API?
  5. После завершения вышеуказанной проверки проверьте запрос метода метода GET/POST вашего ресурса API. Возможно, HTTP-заголовок Access-Control-Allow-Origin был автоматически добавлен шлюзом API.

Спасибо, Даниэль

person Daniel Jihoon Oh    schedule 12.05.2017