Подтвердить что ты не робот

Конечная точка AWS API Gateway дает ошибку CORS при отправке POST с статического сайта на S3

Я создал конечную точку API с сервером без сервера (serverless.com), который я просматриваю через API-шлюз. Я получаю следующую ошибку, хотя я включил CORS из

XMLHttpRequest не может загрузить https://xxxxxxxxx.execute-api.us-west-2.amazonaws.com/development/signup. Нет заголовка "Access-Control-Allow-Origin" в запрошенном ресурс. происхождения 'http://yyyyyyyyy.com.s3-website-us-east-1.amazonaws.com', поэтому не разрешен доступ.

Параметры шлюза AWS API для конечной точки

Я не получаю никаких ошибок, когда я использую Postman для выполнения запросов, несмотря на то, что я установил заголовок origin или нет. Как я могу исправить эту проблему?

4b9b3361

Ответ 1

У нас есть ошибка прямо сейчас, когда неудавшиеся запросы к API Gateway не будут включать соответствующие заголовки CORS, которые маскируют фактическую ошибку в запросе.

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

Ответ 2

Как отметил Джек Кон, консоль AWS не добавляет заголовки CORS для ответа не 200, и, по-видимому, не позволяет добавлять какой-либо пользовательский заголовок.

Мне удалось включить заголовки CORS при неудачном запросе, экспортировав их в swagger и вручную отредактировав файл (просто скопировав ответ 200) и импортировав его обратно.

Ответы должны выглядеть так:

  responses:
    200:
      description: "200 response"
      schema:
        $ref: "#/definitions/Empty"
      headers:
        Access-Control-Allow-Origin:
          type: "string"
    401:
      description: "401 response"
      schema:
        $ref: "#/definitions/Empty"
      headers:
        Access-Control-Allow-Origin:
          type: "string"
  x-amazon-apigateway-integration:
    responses:
      default:
        statusCode: "200"
        responseParameters:
          method.response.header.Access-Control-Allow-Origin: "'*'"
        responseTemplates:
          application/json: "__passthrough__"
      Authentication Failed.*:
        statusCode: "401"
        responseParameters:
          method.response.header.Access-Control-Allow-Origin: "'*'"
        responseTemplates:
          application/json: "__passthrough__"

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

Ответ 3

Я бы начал устранение неполадок, проверив ваш API в консоли AWS, чтобы убедиться, что серверный сервер не зарегистрировал все так, как вы ожидаете.

  • Загрузите консоль AWS и перейдите к службе шлюза API.
  • Щелкните API, чтобы открыть его.
  • Найдите свой/регистрационный ресурс
  • Убедитесь, что вы видите метод OPTIONS под /signup
  • Выберите каждый ресурс, включая параметры, и проверьте следующее:

    а. Нажмите "Интеграционный ответ", щелкните стрелку в первой строке таблицы на 200, чтобы открыть ее.

    б. Нажмите стрелку, чтобы открыть сопоставления заголовков

    с. Убедитесь, что вы видите Access-Control-Allow-Origin, сопоставленный с '*'

Если вы обнаружите, что этот заголовок отсутствует в одном из методов, быстрым решением является щелчок по ресурсу /signup Resource и нажмите кнопку "Включить CORS". AWS будет создавать OPTIONS и сопоставления заголовков для всех методов для вас. Конечно, вам все равно нужно выяснить, почему серверный сервер не настроил для вас ничего, но это, по крайней мере, приведет вас к работе.

Еще одна заметка о кнопке "Включить CORS", если вы добавите другой метод позже, вам придется снова щелкнуть ее, чтобы повторно запустить инструмент, чтобы настроить новый метод с помощью CORS.

Ответ 4

Я боролся с той же проблемой, когда "POST" для API Gateway. Но я нашел исправление проблемы.

После включения CORS для ресурса метода и после добавления необходимых заголовков, например. "Подход-Контроль-Разрешить-Происхождение" = '*', и он все еще терпит неудачу.

Перейдите к ОПЦИЯм этого ресурса, который вы вызываете, "GET", "POST" и т.д. щелкните панель "Запрос метода" этого ресурса, установите API Key = FALSE, НЕ присваивайте API-ключу true, Это приведет к ошибке CORS.

Причина, ОПЦИИ технически не метод, это функция браузера для выполнения запроса предварительной проверки, поэтому во время предполетного просмотра браузер не знает, какой ключ API отправляется, он будет знать только после того, как ответ вернется в браузер из "Access-Control-Allow-Origin" = '*', то он будет искать код для HTTP req для setHeaders X-Api-Key = некоторое значение.

Примечание: сам метод вызова, "POST" и т.д. может иметь API-ключ = True, что отлично.

Надеюсь, что это поможет тем, кто борется, как я это делал какое-то время:)

Ответ 5

Ответ должен иметь, если вы используете AWS lamda, установите заголовки ответов следующим образом. Конфигурация только в интерфейсе API не будет работать

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

Ответ 6

У меня была почти та же проблема, что и в другом вопросе, мне нужно было добавить следующие заголовки к моему ответу:

headers: {
            'Access-Control-Allow-Origin' : '*',
            'Access-Control-Allow-Headers':'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
            'Access-Control-Allow-Credentials' : true,
            'Content-Type': 'application/json'
        }

И, согласно этой документации:

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

Когда вы используете прокси для лямбда-функций в конфигурации API-шлюза, методы post или get не имеют добавленных заголовков, но только метод options. Вы должны сделать это вручную в ответе (сервер или лямбда-ответ).

Кроме того, мне нужно отключить параметр "API-ключ" в моем почтовом методе шлюза API, как уже говорилось здесь.

Ответ 7

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

это потому, что после набора CORS вы должны ОТКЛЮЧИТЬ API. Я заработал API, и все отлично работает.