首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AWS网关和S3上的CORS

AWS网关和S3上的CORS
EN

Stack Overflow用户
提问于 2020-02-21 10:14:56
回答 1查看 1.2K关注 0票数 1

我正在调用一个使用lambda函数的API。我是从S3 (静态网络托管)中托管的HTML页面调用它的。在调用API时,我得到了CORS错误:

CORS策略阻止

访问“从源”到XMLHttpRequest :请求的资源上不存在“访问控制-允许-原产地”标题。

我在API上启用了CORS之后,在S3桶上指定了CORS,但是它不起作用。似乎,我错过了指定CORS头的正确位置。

附加信息:我在chrome developer工具中获得以下信息

代码语言:javascript
复制
**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

Lambda函数代码:

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

发布于 2020-02-21 13:47:57

没有“访问-控制-允许-原产地”标题存在于请求的资源上。

这就是说,您请求的资源,您通过API的Lambda,在其响应中没有返回Access-Control-Allow-Origin头;浏览器期望响应中的CORS头来自API (可能是因为选项请求),但是响应没有它们。

您还没有这么具体地说过,但我假设您正在使用API网关上的Lambda代理集成。要解决您的问题,请在Lambda返回的响应中添加一个Access-Control-Allow-Origin: *头。您没有指定您的Lambda是用哪种语言编写的,也没有提供您的Lambda代码,但是如果它是用NodeJS编写的,那么返回内容的代码片段可能如下所示:

代码语言:javascript
复制
    const result = {
        statusCode: 200,
        headers: {
            'Access-Control-Allow-Origin': '*',
            // other required headers
        },
        body: object_you_are_returning
    };

    return result;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60336435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档