Ресурс заблокирован политикой CORS в Serverless API Gateway Lambda, даже если он настроен - PullRequest
0 голосов
/ 10 июля 2020

Я использую Serverless, и у меня есть лямбда, доступная через API Gateway. Как и во многих вопросах COR, в которых упоминается аналогичный стек, при вызове из браузера я получаю следующую ошибку (обычное локальное тестирование Postman / curl работает нормально):

Access to XMLHttpRequest at 'https://<gatewayUrl>/dev/login/?userType=userA' from origin 'http://localhost:3000' has been blocked by CORS policy: Request header field z-client-timezone is not allowed by Access-Control-Allow-Headers in preflight response
  • Тип запроса интеграции: Lambda_Proxy

  • Cors был включен, добавлен метод параметров

  • Обработчик лямбда-выражения возвращает ожидаемые заголовки

  • Запрос ax ios отправляет один настраиваемый заголовок Z-Client-Timezone, который также разрешен в Lambda

  • Я пробовал все, включая все здесь , но не повезло.

Я очень расстроен, поэтому любая помощь будет потрясающей. Еще одна вещь, когда я делаю curl -i -X OPTIONS https://<gatewayUrl>/dev/login, я получаю этот результат, который, кажется, отсутствует Z-Client-Timezone:

HTTP/2 200
content-type: application/json
content-length: 0
date: Fri, 10 Jul 2020 04:00:10 GMT
x-amzn-requestid: <aws_requestId>
access-control-allow-origin: *
access-control-allow-headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
x-amz-apigw-id: <apigw-id>
access-control-allow-methods: OPTIONS,POST
via: 1.1 <id>.cloudfront.net (CloudFront), 1.1 <id>.cloudfront.net (CloudFront)
x-amz-cf-pop: DFW50-C1
x-cache: Miss from cloudfront
x-amz-cf-pop: DFW55-C1
x-amz-cf-id: <cf-id>

Моя лямбда:

export async function login(event) {

    const headers = {
      'Content-Type': 'application/json',
      'Access-Control-Allow-Origin': '*',
      'Access-Control-Allow-Credentials': true
    }

    ....
    return {
      statusCode: 200,
      headers,
      body: JSON.stringify(session)
    };
}

Мой Serverless.yml:

login:
  handler: dist/src/handlers/auth.login
  events:
    - http:
        path: login
        method: post
        cors: 
          origin: '*'
          headers:
           - Access-Control-Allow-Credentials

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'

Я хотел бы получить любую помощь, которую вы можете оказать. Я пропустил некоторый код, так как все остальное работает, за исключением материала cors, поэтому я только что включил его, но если необходимы дополнительные разъяснения, я с радостью предоставлю.

1 Ответ

1 голос
/ 10 июля 2020

В то время как ваша лямбда-функция разрешает заголовок Z-Client-Timezone, метод встроенных параметров AWS - нет.

Чтобы разрешить это, вы можете сделать следующее -

login:
  handler: dist/src/handlers/auth.login
  events:
    - http:
        path: login
        method: post
        cors: 
          origin: '*'
          headers:
           - Access-Control-Allow-Credentials
           - Z-Client-Timezone

Затем добавьте любые другие заголовки, которые вы также отправляете.

...