Безсерверная структура AWS REST API Gateway - ошибка 403 CORS - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь создать функцию с включенным CORS. Функция работает должным образом с использованием Postman (присутствуют заголовки cors), но я получаю ошибку CORS при попытке из браузера (без заголовка cors).

const getTicket = async event => {
    var ticketNumber = Date.now();
    return {
        headers: {
            'Content-Type': 'application/json',
            'Access-Control-Allow-Methods': '*',
            'Access-Control-Allow-Origin': '*',
        },
        statusCode: 200,
        body: JSON.stringify({"ticketNumber": ticketNumber})
    };
};
functions:
  getTicket:
    handler: code/common/ticket.getTicket
    runtime: nodejs12.x
    events:
      - http:
          method: get
          path: getTicket
          cors: true
          authorizer: 
            arn: ${self:custom.auth0.authorizer_arn}

Я также попробовал еще несколько способов написания файл serverless.yaml, но ни один из них не работал, единственное различие между ними заключается в методах, созданных в моем API-шлюзе. Иногда я получал методы GET + OPTIONS, иногда только GET, но никогда не работал с CORS.

Я получаю сообщение об ошибке: «Доступ к XMLHttpRequest по адресу« https://...amazonaws.com/prod/getTicket »из источника» http://localhost: 8080 'заблокировано политикой CORS: в запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin». "

1 Ответ

3 голосов
/ 30 марта 2020

Вероятно, вы видите, что сервер возвращает ошибку до того, как достигнет ваших операторов возврата. Другими словами, API-шлюз возвращает 502 или 403 (так как это наиболее распространенные ошибки), и эти указанные c возвраты не имеют заголовков CORS по умолчанию в API-шлюзе. Я бы порекомендовал использовать CloudWatch для проверки заданных c Lambda-вызовов, чтобы определить, происходит ли ошибка в самой функции Lambda, и исправить это.

Вы также можете заставить свой API-шлюз возвращать заголовки CORS для всех ответов. В разделе resources файла serverless.yml вы можете сделать следующее и добавить любые дополнительные записи для других кодов состояния:

resources:

  Resources:

    GatewayResponseDefault4XX:

      Type: 'AWS::ApiGateway::GatewayResponse'

      Properties:

        ResponseParameters:

          gatewayresponse.header.Access-Control-Allow-Origin: "'*'"

          gatewayresponse.header.Access-Control-Allow-Headers: "'*'"

        ResponseType: DEFAULT_4XX

        RestApiId:

          Ref: 'ApiGatewayRestApi'
...