API Gateway CORS: нет заголовка Access-Control-Allow-Origin

Хотя CORS был настроен через API Gateway и установлен заголовок Access-Control-Allow-Origin, я все равно получаю следующую ошибку при попытке вызвать API из AJAX в Chrome:

XMLHttpRequest не может загрузить http://XXXXX.execute-api.us-west-2.amazonaws.com/beta/YYYYY. На запрошенном ресурсе отсутствует заголовок Access-Control-Allow-Origin. Следовательно, к источнику 'null' доступ не разрешен. Ответ имел код состояния HTTP 403.

Я попытался ПОЛУЧИТЬ URL-адрес через Postman, и он показывает, что указанный выше заголовок успешно передан:

Пропущенные заголовки

И из ответа OPTIONS:

Заголовки ответов

Как я могу вызвать свой API из браузера, не возвращаясь к JSON-P?


person Tyler    schedule 04.02.2016    source источник
comment
У вас он настроен на S3? Если да, не могли бы вы поставить Bucket Policy? Убедитесь, что у вас есть метод в вашей политике   -  person iSkore    schedule 04.02.2016
comment
Нет @iSkore, он настроен на другом сервере для тестирования. Я также пробовал это при доступе к файлу локально со своего ПК и через другие серверы. Есть ли что-то, что мне нужно настроить на сервере хостинга страниц, чтобы разрешить использование CORS? Насколько я понимаю, настройки для CORS должны быть изменены только для сервера API.   -  person Tyler    schedule 04.02.2016
comment
Итак, добавили ли вы политику CORS в свой API? А что значит «сервер хостинга страниц»? Обычный сервер или статический сервер   -  person iSkore    schedule 04.02.2016
comment
Да, с помощью параметров Включить CORS в AWS API Gateway   -  person Tyler    schedule 04.02.2016
comment
Попался, а вы включали в это политику?   -  person iSkore    schedule 04.02.2016
comment
Это может помочь, а может и не помочь, но я нашел эту ссылку: stackoverflow.com/questions/10636611/   -  person iSkore    schedule 04.02.2016
comment
Успешен ли вызов OPTIONS? Можете ли вы опубликовать результаты звонка OPTIONS? Это результат, который вы увидите, если вызов OPTIONS завершится неудачно из-за аутентификации или других ошибок.   -  person RyanG    schedule 04.02.2016
comment
Я добавил результат OPTIONS к вопросу   -  person Tyler    schedule 04.02.2016
comment
Так что именно вы пытаетесь сделать? ПОЛУЧИТЕ данные или узнайте, какие ОПЦИИ подключения доступны. Также, если вы используете CloudFront, иногда им требуется время, чтобы доставить ваши файлы в CDN. Это применимо только в том случае, если вы настроили CloudFront за последние час или два.   -  person iSkore    schedule 04.02.2016
comment
Эй, проверь это тоже. Этот парень тоже использует AJAX. stackoverflow.com/questions/20035101/   -  person iSkore    schedule 04.02.2016
comment
Команда API Gateway здесь ... Если вы используете функцию «Включить CORS» в консоли, конфигурация должна быть правильной. Я могу предположить, что вы не вызываете правильный путь к ресурсу в своем API в JavaScript, который выполняет браузер. Если вы попытаетесь выполнить вызов API к несуществующему методу / ресурсу / этапу, вы получите общий 403 без заголовков CORS. Я не понимаю, как браузер может пропустить заголовок Access-Control-Allow-Origin, если вы вызываете правильный ресурс, поскольку вызов OPTIONS в Postman явно содержит все правильные заголовки CORS.   -  person jackko    schedule 04.02.2016
comment
@JackKohn Я проверил, что путь к ресурсу правильный, и смог успешно получить доступ к методу напрямую через URL-адрес в Chrome. Также в ошибке явно упоминается отсутствие заголовка Access-Control-Allow-Origin.   -  person Tyler    schedule 04.02.2016
comment
В большинстве случаев это вводящее в заблуждение сообщение об ошибке возникает из-за сбоя GET с ошибкой 404 или 403. В этих случаях заголовки CORS не возвращаются службой. Подписывает ли клиент запрос с учетными данными, и разрешена ли политика IAM для этих учетных данных для вызова этого API / метода? Можете ли вы подтвердить, что URL-адрес, используемый клиентом, правильный?   -  person RyanG    schedule 05.02.2016
comment
@ RyanG-AWS клиент не подписывает запрос, потому что API аутентифицируется ресурсом, который он вызывает, с использованием пользовательского токена, поэтому учетные данные не имеют значения. Я могу вызвать API, посетив URL-адрес прямо в браузере, и получу соответствующий ответ.   -  person Tyler    schedule 05.02.2016
comment
@makinbacon: Вы нашли решение этой проблемы? Здесь я сталкиваюсь с той же проблемой.   -  person Nirmal    schedule 21.04.2016
comment
@Nirmal Я думаю, что удалил API и снова добавил его, затем включил CORS, и это сработало для меня. Я до сих пор не уверен, что именно изменилось, заставив его работать.   -  person Tyler    schedule 21.04.2016
comment
@makinbacon: Ах, я только что попробовал, и это работает по каким-то странным причинам. У меня есть сотни ресурсов и методов, и воссоздать их все будет адской задачей. Этого также можно добиться, указав вручную заголовок в интеграционном ответе. В любом случае, это большая работа. Спасибо за помощь.   -  person Nirmal    schedule 21.04.2016
comment
Мои методы и этап были автоматически сгенерированы Lambda. Я включил CORS постфактум. Те же ошибки, что и OP. Я убрал автоматически сгенерированный материал, создал новый API и методы, развернул на новом этапе, и все заработало.   -  person scald    schedule 01.05.2016
comment
просто попробовал это, безуспешно :(   -  person Stephen Tetreault    schedule 03.10.2016
comment
См. Мой ответ здесь, это может быть связано с проблемой ключа API, stackoverflow.com/questions/34325009/   -  person Michael Tung    schedule 12.10.2016
comment
Нам нужно увидеть заголовки в ответе на фактический запрос ajax, который вызывает указанную ошибку. Результаты почтальона на самом деле не так уж и полезны. В сообщении об ошибке указано, что указанный заголовок не существует, я более склонен полагать, что он не существует, чем выдается ошибка, в которой говорится, что чего-то не существует, хотя это действительно так.   -  person Kevin B    schedule 14.02.2017
comment
The response had HTTP status code 403 конкретно намекает, что вы получаете ответ об ошибке, и ответ об ошибке, скорее всего, не содержит указанного заголовка cors.   -  person Kevin B    schedule 14.02.2017
comment
Мое решение было удалить API Gateway и создать новый, enble cors. Спасибо!!!   -  person Kent V    schedule 25.04.2018
comment
Удаление и воссоздание ресурса мне не помогло. У меня есть ресурс с GET и OPTIONS, и только OPTIONS получает заголовки, хотя на экране CORS проверяются оба метода.   -  person user763648    schedule 16.07.2020


Ответы (22)


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

https://serverless.com/framework/docs/providers/aws/events/apigateway/

// handler.js

'use strict';

module.exports.hello = function(event, context, callback) {

const response = {
  statusCode: 200,
  headers: {
    "Access-Control-Allow-Origin" : "*", // Required for CORS support to work
    "Access-Control-Allow-Credentials" : true // Required for cookies, authorization headers with HTTPS 
  },
  body: JSON.stringify({ "message": "Hello World!" })
};

callback(null, response);
};
person riseres    schedule 26.03.2017
comment
Исправлена ​​и моя проблема. Спасибо за ваш ответ! - person Eric Brown; 12.09.2018
comment
Я не использую бессерверные, но это решило мою проблему. Думаю, вам нужно передать эти заголовки из фактического источника. - person Costa Michailidis; 26.10.2018
comment
К вашему сведению, в представленном здесь примере есть проблема. Если у вас есть Access-Control-Allow-Credentials: true, у вас не может быть подстановочного знака * для Access-Control-Allow-Origin. Это правило применяется браузером. См. здесь и здесь - person Kevin; 07.11.2018
comment
Это не работает. Опять же, отображается та же ошибка. Поле заголовка запроса access-control-allow-credentials не разрешено Access-Control-Allow-Headers в предполетном ответе. - person mitesh7172; 21.01.2019
comment
как это можно сделать с помощью класса java RequestHandler ‹RequestClass, ResponseClass›? - person Snedden27; 24.02.2019
comment
Для всех, кому интересно, вот официальные документы, в которых это упоминается: docs.aws.amazon.com/apigateway/latest/developerguide/ ›Для интеграции Lambda или HTTP-прокси вы по-прежнему можете настроить необходимые› заголовки ответов OPTIONS в API Gateway. Однако вы должны полагаться на ›серверную часть, чтобы вернуть заголовки Access-Control-Allow-Origin, поскольку ответ интеграции› отключен для интеграции с прокси. - person Leonid Usov; 27.02.2019
comment
установка только Access-Control-Allow-Origin: * из лямбда решила проблему - person Priyanka V; 13.03.2019
comment
Дайте этому человеку медаль! Я тоже боролся с этим. Вы спасаете жизнь. - person sanky; 27.07.2020

Если кто-то еще сталкивается с этим, я смог отследить основную причину в моем приложении.

Если вы используете API-Gateway с настраиваемыми авторизаторами, API-Gateway отправит 401 или 403 обратно, прежде чем он действительно попадет на ваш сервер. По умолчанию - API-шлюз НЕ настроен для CORS при возврате 4xx из настраиваемого авторизатора.

Также - если вы получаете код состояния 0 или 1 из запроса, проходящего через API Gateway, вероятно, это ваша проблема.

Чтобы исправить - в конфигурации шлюза API - перейдите в «Ответы шлюза», разверните «По умолчанию 4XX» и добавьте туда заголовок конфигурации CORS. т.е.

Access-Control-Allow-Origin: '*'

Не забудьте повторно развернуть шлюз - и вуаля!

person Gabriel Doty    schedule 19.02.2018
comment
@ efong5 рад, что кому-то помог! - person Gabriel Doty; 03.05.2018
comment
Для тех, кто хочет сделать это с помощью интерфейса командной строки AWS, используйте: aws apigateway update-gateway-response --rest-api-id "XXXXXXXXX" --response-type "DEFAULT_4XX" --patch-operations op="add",path="/responseParameters/gatewayresponse.header.Access-Control-Allow-Origin",value='"'"'*'"'"' - person Will; 05.06.2018
comment
Я не использую пользовательские авторизаторы, и они все еще нужны, так как в моем запросе был плохой JSON - спасибо! - person Force Hero; 05.01.2019
comment
на заметку - не забудьте потом развернуть API :) - person danieln; 15.01.2019
comment
Странно, у меня это сработало, но передислоцировать не пришлось. Я пробовал перераспределить раньше. Не уверен, почему это сработало для меня. - person Michael; 09.06.2019
comment
Добавление заголовка CORS в 4XX позволяет видеть фактическое сообщение об ошибке вместо ошибки CORS. - person DeepFreez; 15.08.2019
comment
К вашему сведению, способ сделать это из консоли AWS - щелкнуть метод (например, POST, затем включить CORS, затем отметить параметры 4XX, затем развернуть. - person James Shapiro; 09.03.2020
comment
Просто попробовал это, но в браузере появилась эта ошибка: Ответ на предполетный запрос не проходит проверку контроля доступа: у него нет статуса HTTP ok. Любые идеи? Я знаю, что могу установить код состояния для всех запросов 4XX (скажем, до 200), но это не очень хорошая практика. - person thenewpotato; 14.07.2021

Если вы попробовали все, что касалось этой проблемы, безрезультатно, вы окажетесь там же, где и я. Оказывается, существующие в Amazon инструкции по настройке CORS работают нормально ... просто убедитесь, что вы не забыли выполнить повторное развертывание! Мастер редактирования CORS, даже со всеми его красивыми маленькими зелеными галочками, не обновляет ваш API в реальном времени. Возможно, очевидно, но это озадачило меня на полдня.

введите описание изображения здесь

person lase    schedule 03.12.2018
comment
Это было. Буквально двое суток над этим работали. Не уверен, что логика хотя бы в предложении повторного развертывания после редактирования шлюза. - person Chris Christensen; 04.11.2019
comment
@ChrisChristensen рад, что вы это выяснили - всегда есть что-то настолько успокаивающее, но невероятно побеждающее в подобных проблемах - person lase; 04.11.2019
comment
Это ответ, который действителен в 2020 году. Спасибо - person Rahul Khanna; 26.05.2020
comment
ПОВТОРНОЕ РАЗВЕРТЫВАНИЕ, ПОВТОРНОЕ РАЗВЕРТЫВАНИЕ, ПОВТОРНОЕ РАЗВЕРТЫВАНИЕ - person Surjith S M; 18.07.2020

1) Мне нужно было сделать то же самое, что и @riseres, и некоторые другие изменения. Это мои заголовки ответов:

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'
        }

2) И

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

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

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

3) И

Кроме того, мне нужно было отключить параметр «Требуется ключ API» в моем методе публикации шлюза API.

person Carlos Alberto Schneider    schedule 06.04.2017
comment
Да, я думаю, что тонкость, которую многие из нас изначально упускают, заключается в том, что как только вы настроите интеграцию шлюза API для функции Lambda с использованием интеграции прокси-сервера Lambda, тогда вы должны сделать то, что вы и другие заявляете, и убедиться, что заголовки добавляются программно в ответ вашей лямбды. Автоматическая генерация, которая создается путем включения CORS на шлюзе API и создания ответчика OPTIONS, великолепна, но не поможет вам полностью, если вы установили интеграцию с использованием прокси-сервера Lambda в запросе интеграции в API-шлюз. - person ; 13.04.2018
comment
Это сработало для меня ... после правильного прочтения руководства: Важно! При применении приведенных выше инструкций к ЛЮБОМУ методу в интеграции прокси никакие применимые заголовки CORS не будут установлены. Вместо этого ваш бэкэнд должен возвращать соответствующие заголовки CORS, такие как Access-Control-Allow-Origin. docs.aws.amazon.com/apigateway/latest/ руководство разработчика / - person BennyHilarious; 08.12.2019

Мой образец заработал: я только вставил 'Access-Control-Allow-Origin': '*', внутри заголовков: {} в сгенерированная функция nodejs лямбда. Я не внес никаких изменений в слой API, созданный лямбда-выражением.

Вот мой NodeJS:

'use strict';
const doc = require('dynamodb-doc');
const dynamo = new doc.DynamoDB();
exports.handler = ( event, context, callback ) => {
    const done = ( err, res ) => callback( null, {
        statusCode: err ? '400' : '200',
        body: err ? err.message : JSON.stringify(res),
        headers:{ 'Access-Control-Allow-Origin' : '*' },
    });
    switch( event.httpMethod ) {
        ...
    }
};

Вот мой вызов AJAX

$.ajax({
    url: 'https://x.execute-api.x-x-x.amazonaws.com/prod/fnXx?TableName=x',
    type: 'GET',
    beforeSend: function(){ $( '#loader' ).show();},
    success: function( res ) { alert( JSON.stringify(res) ); },
    error:function(e){ alert('Lambda returned error\n\n' + e.responseText); },
    complete:function(){ $('#loader').hide(); }
});
person MannyC    schedule 17.04.2017
comment
Я обнаружил, что большая часть документации Amazon устарела, даже с фрагментом пути ../latest/ ... После того, как примерно неделю назад все было убрано, кнопка CORS внезапно заявила, что работает правильно. API создал ЛЮБОЙ метод автоматически, а кнопка CORS автоматически создала метод OPTIONS - я ничего не добавил в API. Приведенный выше GET работает, и с тех пор я добавил ajax POST, который также работает без моего касания API. - person MannyC; 08.05.2017
comment
Я потратил почти два часа, пытаясь выяснить, как добавить Access-Control-Allow-Origin в ответ метода с помощью консоли AWS, но это было единственное, что у меня сработало. - person Shn_Android_Dev; 02.03.2019

Я просто добавил заголовки в свой ответ лямбда-функции, и он работал как шарм

exports.handler = async (event) => {
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hey it works'),
        headers:{ 'Access-Control-Allow-Origin' : '*' }
    };
    return response;
};
person Vishal Shetty    schedule 26.04.2020

Для сотрудников Google:

Вот почему:

  • Простой запрос или _1 _ / _ 2_ без файлов cookie не запускает предпечатную проверку
  • Когда вы настраиваете CORS для пути, API Gateway создает только OPTIONS метод для этого пути, а затем отправляет Allow-Origin заголовки, используя фиктивные ответы, когда пользователь вызывает OPTIONS, но GET / POST не получит Allow-Origin автоматически.
  • Если вы попытаетесь отправить простые запросы с включенным режимом CORS, вы получите сообщение об ошибке, потому что этот ответ не имеет заголовка Allow-Origin.
  • Вы можете придерживаться передовой практики, простые запросы не предназначены для отправки ответа пользователю, отправьте аутентификацию / файл cookie вместе с вашими запросами, чтобы сделать его «непростым», и предварительная проверка запустит
  • Тем не менее, вам придется самостоятельно отправлять заголовки CORS для запроса, следующего за OPTIONS

Подвести итог:

  • Только безобидные OPTIONS будут сгенерированы API Gateway автоматически
  • OPTIONS используются браузером только в качестве меры предосторожности для проверки возможности CORS на пути
  • Принятие CORS зависит от фактического метода, например. GET / POST
  • Вы должны вручную отправить соответствующие заголовки в своем ответе.
person theaws.blog    schedule 28.11.2019

Для меня ответ, который НАКОНЕЦ Сработал, был комментарием Джеймса Шапиро из ответа Alex R (второй по количеству голосов). Я столкнулся с этой проблемой API-шлюза в первую очередь, пытаясь получить статическую веб-страницу, размещенную в S3, для использования лямбда-выражения для обработки страницы контактов и отправки электронного письма. Простая проверка [] Default 4XX исправила сообщение об ошибке.

введите описание изображения здесь

person Jason    schedule 14.07.2020
comment
Где вы найдете это меню? Я этого нигде не вижу. - person Nick H; 29.10.2020
comment
@NickH, взгляни на фотографию Рави Рама. В разделе «Действия» должен быть пункт «Включить CORS», и когда вы его выберете, появится меню. - person Jason; 30.10.2020

Я нашел простое решение в

API Gateway> Выберите конечную точку API> Выберите метод (в моем случае это был POST)

Теперь есть выпадающий список ДЕЙСТВИЯ> Включить CORS .. выберите его.

Теперь снова выберите раскрывающийся список ДЕЙСТВИЯ> Развернуть API (повторно развернуть)

введите описание изображения здесь

Это сработало !

person Ravi Ram    schedule 07.06.2019
comment
Почему за этот ответ проголосовали против, но есть другие похожие ответы ниже? - person Dinesh Kumar; 27.11.2019
comment
Для вызова шлюза API на основе AWS это решение работает - person ewalel; 25.02.2020

Я начал свою работу после того, как понял, что авторизатор лямбда не работает и по какой-то неизвестной причине это переводится в ошибку CORS. Простое исправление для моего авторизатора (и некоторые тесты авторизатора, которые я должен был добавить в первую очередь), и это сработало. Для меня требовалось действие шлюза API «Включить CORS». Это добавило все заголовки и другие настройки, которые мне нужны в моем API.

person RodP    schedule 15.07.2018
comment
и повторно развернуть! :) - person Robin C Samuel; 26.05.2019

После изменения функции или кода Выполните следующие два шага.

Сначала включайте CORS, затем каждый раз развертывайте API.

person Ankit Kumar Rajpoot    schedule 03.01.2020
comment
Спасибо за это. Не заметил Enable CORS в ресурсе. Заставил меня потерять рассудок. - person Shlomi Bazel; 05.07.2020

Развертывание кода после включения CORS для POST и OPTIONS сработало для меня.

person Ziaur Rahman    schedule 13.01.2020
comment
Спасибо за ваш вклад, но можете ли вы объяснить, почему это сработало для вас? Я предлагаю вам прочитать это руководство, чтобы улучшить свой ответ: Как я могу написать здесь хороший ответ: stackoverflow.com/help/how- ответить - person Guillaume Raymond; 13.01.2020

Я использую aws-serverless-express, и в моем случае нужно отредактировать simple-proxy-api.yaml.

До того, как CORS был настроен на https://example.com, я просто заменил имя своего сайта и повторно развернул его через npm run setup, и он обновил мой существующий лямбда / стек.

#...
/:
#...
method.response.header.Access-Control-Allow-Origin: "'https://example.com'"
#...
/{proxy+}:
method.response.header.Access-Control-Allow-Origin: "'https://example.com'"
#...
person James L.    schedule 07.12.2018

В моем случае, поскольку я использовал AWS_IAM в качестве метода авторизации для шлюза API, мне нужно было предоставить разрешения моей роли IAM для попадания в конечную точку.

person CamHart    schedule 21.04.2019
comment
Я рад, что оставил этот комментарий. Со мной такое происходит: D. - person CamHart; 22.11.2019
comment
Мне нравится находить собственное решение повторяющейся проблемы в будущем. - person Zac Grierson; 12.12.2019

Для меня, поскольку я использовал довольно стандартные вызовы React fetch, это можно было исправить с помощью некоторых из исправлений AWS Console и Lambda, описанных выше, но моя Lambda вернула правильные заголовки (я также использовал режим прокси), и мне нужно было упаковать мои приложение в шаблон SAM, поэтому я не мог тратить время, щелкая по консоли.

Я заметил, что все элементы CORS работали нормально, ПОКА я не поставил Cognito Auth в свое приложение. Я просто очень медленно выполнял развертывание пакета SAM / SAM со все большим количеством конфигураций, пока он не сломался, и он не сломался, как только я добавил Auth в свой API-шлюз. Я провел целый день, просматривая замечательные дискуссии, подобные этой, в поисках простого решения, но в конце концов мне пришлось прочитать о том, что делает CORS. Я сохраню вам чтение и дам вам еще одно легкое решение (по крайней мере, для меня).

Вот пример окончательно сработавшего шаблона шлюза API (YAML):

Resources:
  MySearchApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: 'Dev'
      Cors:
        AllowMethods: "'OPTIONS, GET'"
        AllowHeaders: "'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token'"
        AllowOrigin: "'*'"
      Auth:
        DefaultAuthorizer: MyCognitoSearchAuth
        Authorizers:
          MyCognitoSearchAuth:
            UserPoolArn: "<my hardcoded user pool ARN>"
            AuthType: "COGNITO_USER_POOLS"
        AddDefaultAuthorizerToCorsPreflight: False

Обратите внимание на AddDefaultAuthorizerToCorsPreflight внизу. По умолчанию это True, если у вас НЕТ в вашем шаблоне, насколько я могу судить из моего чтения. И, когда True, он как бы блокирует нормальное поведение OPTIONS, чтобы объявить, что ресурс поддерживает с точки зрения разрешенного происхождения. Как только я явно добавил его и установил значение False, все мои проблемы были решены.

Подразумевается, что если у вас возникла эта проблема и вы хотите диагностировать ее более полно, вам следует посетить свои ресурсы в API-шлюзе и проверить, содержит ли ваш метод OPTIONS какую-либо форму аутентификации. Вашему GET или POST требуется Auth, но если в ваших OPTIONS включен Auth, вы можете оказаться в этой ситуации. Если вы щелкаете по консоли AWS, попробуйте удалить из OPTIONS, повторно развернуть, а затем протестировать. Если вы используете SAM CLI, попробуйте мое исправление, указанное выше.

person CDixon    schedule 25.01.2021

Убедитесь, что вы звоните по правильному пути.

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

Благодаря комментарию @ jackko к первоначальному вопросу. Это была моя проблема. Звучит глупо, но может случиться с кем угодно.

person 10110    schedule 25.05.2021
comment
Сразу после просмотра этого комментария я проверил свой URL. АХ! и это действительно была проблема с моим URL. Был добавлен дополнительный параметр '/', из-за которого я получал ошибку CORS. Этот комментарий меня буквально спас! Большое спасибо за указание на это !! - person Alisha Raju; 21.07.2021

Другой основной причиной этой проблемы может быть разница между HTTP / 1.1 и HTTP / 2.

Симптом. Некоторые пользователи, не все из них, сообщали об ошибке CORS при использовании нашего Программного обеспечения.

Проблема: заголовок Access-Control-Allow-Origin отсутствовал иногда.

Контекст. У нас есть лямбда-выражение, предназначенное для обработки OPTIONS запросов и ответов с соответствующими заголовками CORS, например Access-Control-Allow-Origin, совпадающими с Origin из белого списка.

Решение. Похоже, что шлюз API переводит все заголовки в нижний регистр для вызовов HTTP / 2, но сохраняет заглавные буквы для HTTP / 1.1. Это привело к сбою доступа к event.headers.origin.

Проверьте, не возникает ли у вас тоже эта проблема:

Предположим, что ваш API расположен по адресу https://api.example.com, а ваш интерфейс - по адресу https://www.example.com. Используя CURL, сделайте запрос по HTTP / 2:

curl -v -X OPTIONS -H 'Origin: https://www.example.com' https://api.example.com

Выходные данные ответа должны включать заголовок:

< Access-Control-Allow-Origin: https://www.example.com

Повторите тот же шаг, используя HTTP / 1.1 (или с заголовком Origin в нижнем регистре):

curl -v -X OPTIONS --http1.1 -H 'Origin: https://www.example.com' https://api.example.com

Если заголовок Access-Control-Allow-Origin отсутствует, вы можете проверить чувствительность к регистру при чтении заголовка Origin.

person Michael Seibt    schedule 17.05.2019

Помимо других комментариев, стоит обратить внимание на статус, возвращаемый вашей базовой интеграцией, и если для этого статуса возвращается заголовок Access-Control-Allow-Origin.

Выполнение функции «Включить CORS» устанавливает только статус 200. Если у вас есть другие на конечной точке, например 4xx и 5xx, вам нужно добавить заголовок самостоятельно.

person Nigel Atkinson    schedule 30.10.2019

В моем случае я включил все методы и ответы шлюза. Тогда это сработало как шарм. Не забудьте развернуть.

введите описание изображения здесь

person vijayraj34    schedule 12.04.2021

Тем, кто использует авторизаторы Cognito в API Gateway, на самом деле нет необходимости устанавливать собственные ответы шлюза. API Gateway блокирует предполетный запуск, потому что они не авторизованы по умолчанию логикой AWS.

К счастью, есть встроенный параметр, чтобы исправить это. Просто добавьте AddDefaultAuthorizerToCorsPreflight: False в свой API Authorizer, и API Gateway отключит аутентификацию для предполетных запросов. Вот документация и пример настройки:

MyApi:
Type: AWS::Serverless::Api
Properties:
  StageName: Prod
  Cors: 
    AllowHeaders: "'*'"
    AllowMethods: "'*'"
    AllowOrigin: "'*'"
  Auth:
    DefaultAuthorizer: MyCognitoAuthorizer
    AddDefaultAuthorizerToCorsPreflight: False
    Authorizers:
      MyCognitoAuthorizer:
        UserPoolArn: !GetAtt MyCognitoUserPool.Arn
person thenewpotato    schedule 14.07.2021

В моем случае я просто неправильно написал URL-адрес запроса на выборку. На serverless.yml вы устанавливаете cors на true:

register-downloadable-client:
    handler: fetch-downloadable-client-data/register.register
    events:
      - http:
          path: register-downloadable-client
          method: post
          integration: lambda
          cors: true
          stage: ${self:custom.stage}

а затем в обработчике лямбда вы отправляете заголовки, но если вы сделаете запрос на выборку неправильно во внешнем интерфейсе, вы не получите этот заголовок в ответе, и вы получите эту ошибку. Итак, дважды проверьте URL-адрес вашего запроса на передней панели.

person Ericson Willians    schedule 29.01.2019

В Python вы можете сделать это, как показано в коде ниже:

{ "statusCode" : 200,
'headers': 
    {'Content-Type': 'application/json',
    'Access-Control-Allow-Origin': "*"
     },
"body": json.dumps(
    {
    "temperature" : tempArray,
    "time": timeArray
    })
 }
person Mukesh Arya    schedule 16.08.2019