CORS на AWS API-шлюзе и S3 - PullRequest
       2

CORS на AWS API-шлюзе и S3

0 голосов
/ 21 февраля 2020

Я вызываю AWS API, который использует лямбда-функцию. Я звоню со страницы HTML, размещенной на S3 (stati c веб-хостинг). При вызове API я получаю сообщение об ошибке CORS:

Доступ к XMLHttpRequest в '' from origin '' был заблокирован политикой CORS: в заголовке Access-Control-Allow-Origin нет заголовка запрашиваемый ресурс.

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

Дополнительная информация: я получаю следующую информацию в chrome инструмент разработчика

**Response Headers**
content-length: 42
content-type: application/json
date: Mon, 24 Feb 2020 04:28:51 GMT
status: 403
x-amz-apigw-id: IYmYgFQvoAMFy6Q=
x-amzn-errortype: MissingAuthenticationTokenException
x-amzn-requestid: 79b18379-383d-4ddb-a061-77f55b5727c3

**Request Headers**
authority: apiid-api.us-east-1.amazonaws.com
method: POST
path: /Prod
scheme: https
accept: application/json, text/javascript, */*; q=0.01
accept-encoding: gzip, deflate, br
accept-language: en-US,en;q=0.9,hi;q=0.8
access-control-allow-headers: Origin, X-Requested-With, Content-Type, Accept, Authorization
access-control-allow-methods: GET, OPTIONS
access-control-allow-origin: https://apiid.execute-api.us-east-1.amazonaws.com/Prod
content-length: 117
content-type: application/json; charset=UTF-8
origin: http://example.com
referer: http://example.com/
sec-fetch-mode: cors
sec-fetch-site: cross-site
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36

Лямбда-код функции:

var AWS = require('aws-sdk');
var ses = new AWS.SES();

var RECEIVER = 'example@gmail.com';
var SENDER = 'example@gmail.com';

var response = {
 "isBase64Encoded": false,
 "headers": { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*'},
 "statusCode": 200,
 "body": "{\"result\": \"Success.\"}"
 };

exports.handler = function (event, context) {
    console.log('Received event:', event);
    sendEmail(event, function (err, data) {
        context.done(err, null);
    });
};

function sendEmail (event, done) {
    var params = {
        Destination: {
            ToAddresses: [
                RECEIVER
            ]
        },
        Message: {
            Body: {
                Text: {
                    Data: 'name: ' + event.name + '\nphone: ' + event.phone + '\nemail: ' + event.email + '\ndesc: ' + event.desc,
                    Charset: 'UTF-8'
                }
            },
            Subject: {
                Data: 'Website Referral Form: ' + event.name,
                Charset: 'UTF-8'
            }
        },
        Source: SENDER
    };
    ses.sendEmail(params, done);
}

1 Ответ

1 голос
/ 21 февраля 2020

На запрошенном ресурсе отсутствует заголовок «Access-Control-Allow-Origin».

Это говорит о том, что запрошенный вами ресурс, ваш Lambda через API-шлюз, не является возвращая заголовок Access-Control-Allow-Origin в своем ответе; браузер ожидает заголовки CORS в ответе от API (возможно, из-за запроса OPTIONS), но в ответе их нет.

Вы не сказали так конкретно, но я предполагаю, что вы Вы используете интеграцию Lambda прокси на своем API-шлюзе. Чтобы решить вашу проблему, добавьте заголовок Access-Control-Allow-Origin: * к ответу, который возвращает Lambda. Вы не указали язык, на котором написана ваша лямбда, или не указали свой лямбда-код, но если бы он был в NodeJS, фрагмент того, что вы бы вернули, мог бы выглядеть примерно так:

    const result = {
        statusCode: 200,
        headers: {
            'Access-Control-Allow-Origin': '*',
            // other required headers
        },
        body: object_you_are_returning
    };

    return result;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...