AWS API Gateway поддерживает CORS для ОПЦИЙ только при использовании SAM (без интеграции Lambda-прокси) - PullRequest
2 голосов
/ 12 марта 2019

Я использую AWS Serverless для создания небольшого сайта с 15 лямбда-функциями.Мой стек Cloudformation полностью построен с использованием SAM.

Я НЕ использую Lambda-прокси-интеграцию.

Раздел Api в конфигурации шаблона SAM yaml выглядитнапример:

AppApi:
    Type: AWS::Serverless::Api
    Properties:
        Cors:
            AllowMethods: "'*'"
            AllowHeaders: "'Content-Type'" 
            AllowOrigin: "'*'"
    ...........More Stuff..........

При развертывании этого шаблона SAM yaml я вижу, что мой ApiGateway создал глагол OPTIONS для всех методов, и когда я снимаю запрос с помощью глагола OPTIONS, я вижу CORS заголовки правильно.

Проблема в том, что другие глаголы (например, POST) не добавляют эти заголовки к своему ответу, как это сделал запрос OPTIONS, и когда я запускаю свой API из браузера, я получаю перекрестное происхождение.ошибка политики в моей консоли.

Поэтому мой текущий обходной путь - добавить заголовок CORS, используя интегрированные ответы на конкретные коды состояния, но я не могу и не хочу обрабатывать это для 15 методов, и я хочу поддерживать все состояния ответакоды (например, 4xx \ 5xx и т. д.).

Мои вопросы:

  1. Я что-то здесь не так делаю или это SAM ошибка?
  2. Если это ошибка, есть ли другой способ, кроме добавления заголовков с использованием встроенных ответов (или из моего кода)?
  3. Есть ли способ добавить заголовки «глобально» из шлюза Api?Или поддерживать какие-то глобальные интегрированные ответы?

1 Ответ

1 голос
/ 12 марта 2019

Если вы используете Lambda с интеграциями прокси, вам необходимо указать CORS Origin в вашем HTTP-ответе.

Для интеграции Lambda или HTTP-прокси вы все равно можете установить требуемые заголовки ответа OPTIONSв шлюзе API.Однако вы должны полагаться на серверную часть для возврата заголовков Access-Control-Allow-Origin, поскольку ответ интеграции отключен для интеграции прокси.https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html

Все ответы от Lambda должны иметь эти заголовки и код состояния, но вы можете извлечь их в общую библиотеку, чтобы уменьшить дублирование кода.Для ошибок, обрабатываемых API-G, заголовки будут добавляться автоматически.

Возможно, у вас это уже есть, но шаблон NodeJS выглядит следующим образом:

var response = {
    statusCode: 200,
    headers: {
        "Access-Control-Allow-Origin" : "*"
    },
    body: JSON.stringify({
        someReturnData
    })
};
callback(null, response);

Если вы действительно не хотитеСделав это, вы можете отключить интеграцию Lambda-Proxy, но это означает, что все полезные нагрузки ответа на запросы должны обрабатываться в API-G, а не в Lambda.ИМО обеспечивает гораздо меньшую гибкость и большую конфигурацию, необходимую для достижения тех же результатов.

Здесь представляет интересное сравнение двух подходов.

...