it-roy-ru.com

Шлюз API AWS Нет заголовка "Access-Control-Allow-Origin"

Я застрял в проблеме с API-шлюзом, и я просмотрел все другие SO ответы на этом, форумах AWS и просматривал их документы, но все еще не рад.

Я пытаюсь настроить API, используя шлюз AWS API, который вызывает функцию Lambda, которая читает/записывает данные в таблицу в DynamoDB.

Лямбда-функция для DynamoDB работает. Я создал API в AWS и создал для него методы GET и OPTIONS. Я прочитал, что AWS не применяет OPTIONS только для GET/POST, но я получал ошибку preflight в моем вызове ajax, когда не было метода OPTIONS, поэтому я добавил его.

Пока просто для прогресса я не использую ключ API или Авторизацию . Я могу успешно вызвать свой метод GET, используя POSTMAN, который возвращает содержимое таблицы DynamoDB.

Но когда я пытаюсь использовать вызов JQuery AJAX, я получаю

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'null' is therefore not allowed access.

Я вижу использование инструментов разработчика Chrome на вкладке сети, метод OPTIONS возвращает статус 200, а GET возвращает статус 200, но с указанной выше ошибкой.

Я попытался включить CORS для обоих методов OPTIONS и GET, переустанавливал API после каждого изменения, пробовал следующее ( http://enable-cors.org/server_awsapigateway.html ), но всегда получал та же ошибка в консоли.

Я выполняю вызов ajax из файла на моем рабочем столе, поэтому Origin имеет нулевое значение, поскольку страница будет развернута на S3 как отдельное веб-приложение в JS.

Когда я включил CORS в GET и OPTIONS, я вижу, что Access-Control-Allow-Headers - 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token', а Access-Control-Allow-Origin * - '*'

Мой Ajax-вызов выглядит следующим образом. Я также попытался скопировать точные заголовки, которые использует POSTMAN, с установленным заголовком Authorization (который я сейчас отключил в AWS), но всегда получаю ту же ошибку выше 

var awsHeaders = {};
awsHeaders['X-Amz-Date'] = '20161127T171734';

$('#add, #cloud').click(function() {

    $.ajax({

        type: 'GET',
        headers: awsHeaders,
        dataType : "json",
        url: '...',
        success: function (res) {

            console.log('response in GET:');
            console.log(res);

        },
        error: function(data) {
            console.log('in error');
            console.log(data);
        }

    });

});

Кто-нибудь может пролить свет на то, чего мне не хватает?

Большое спасибо

Update См. Ответ ниже относительно того, как я решил эту проблему согласно комментариям DigitalKapteain - установив заголовок 'Access-Control-Allow-Origin': '*' в ответе от моей функции Lambda. Я искал это в документах AWS, но не смог найти это. Эта ссылка описывает разницу между Lambda и Lambda Proxy и объясняет, что делать при использовании CORS https://serverless.com/framework/docs/providers/aws/events/apigateway/

21
user12345

Ответ на запрос GET к функции Lambda также должен содержать заголовок Access-Control-Allow-Originheader.

43
Digitalkapitaen

Digitalkapitaen ответ правильный; вот код, чтобы избавить кого-то от необходимости искать как установить заголовок ответа HTTP в Lambda :

exports.handler = function(event, context, callback) {
    callback(null, {
        "statusCode": 200,
        "headers": { 
            "Access-Control-Allow-Origin": "*" 
        }
    });
};
21
Words Like Jared

Если это все еще не работает для вас, не забудьте JSON.stringify () ваш объект json, если вы используете $ .ajax. Если нет, вам все равно будет возвращена ошибка, которая считается ошибкой, связанной с CORS. Но если вы отправите тот же объект json, используя Postman, запрос будет выполнен успешно. Попробуйте это ...

5
rickfarina

Для тех, кто хочет интегрировать решение @ Digitalkapitaen во Flask, вот код ниже:

app = Flask(__name__)
cors = CORS(app, resources={r"/*": {"origins": "*"}})

@app.route("/")
def helloWorld():
  return "Hello, cross-Origin-world!"

Установите модуль колбы-корс, выполнив:

pip install -U flask-cors
0
captainblack