如何在AWS Lambda上配置CORS响应头?

34

我正在尝试使用AWS API Gateway创建新的服务,但我发现浏览器会自动调用OPTIONS方法以获取CORS信息。

问题是AWS API Gateway没有提供本地配置CORS标头的方式。

是否可以创建Lambda脚本以响应OPTIONS方法?


你看过在API Gateway中为方法启用CORS了吗?那个方法不起作用吗? - James
5个回答

55

如果您启用了 lambda-proxy,您需要手动设置 CORS 标头:

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);
};

https://serverless.com/framework/docs/providers/aws/events/apigateway#enabling-cors


10
如果您正在使用 {proxy+} 端点,则必须在 Lambda 函数中处理 CORS HTTP 请求。实现取决于您使用的框架。对于 Express 框架,最简单的解决方案是直接使用 Express CORS 中间件
如果您不想通过 Lambda 处理 CORS 请求,请尝试更改您的 Lambda 方法 设置来处理 API Gateway 层面上的 CORS
这里有一个详细的官方教程,介绍如何在 AWS API Gateway 上设置 CORS
此外,重要的是您允许在 Access-Control-Allow-Headers 中包含标头 X-Api-Key ,否则认证将无法正常工作并且会出现错误。 编辑: 在2015年11月,API Gateway团队添加了一个新功能,以简化CORS设置。

21
如果你的API网关配置为Lambda代理,仅启用CORS设置是不够的。 - Chandru
@Chandru 我同意,AWS文档表示对于代理设置,响应必须来自于http后端。那么在node/express中,这应该是什么样子的呢? - chrismarx
尝试创建一个 {proxy+} 端点,并将所有请求转发到 Lambda 函数。 - adamkonrad
1
上面所述的答案不正确。 应该标记下面的答案。 - drogon
这个答案是正确的。然而,对于{proxy+}端点,需要Lambda级别的配置,因为所有请求都只是从API Gateway中传递过来的。 - adamkonrad
@Alisson,你应该在你的API Gateway资源中看到{proxy+} - adamkonrad

4

这里是一个示例,希望这可以对您有所帮助:

...
    return {
        statusCode: 200,
        headers: {
            "Access-Control-Allow-Headers" : "Content-Type",
            "Access-Control-Allow-Origin": "*", // Allow from anywhere 
            "Access-Control-Allow-Methods": "GET" // Allow only GET request 
        },
        body: JSON.stringify(response)
    }
}

更多信息请查看此链接: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html


2
如果您正在使用JQuery $.ajax,它将在OPTIONS请求后随POST发送X-Requested-With。因此,在设置AWS API的OPTIONS访问控制接受标头时,请确保包括该标头:X-Requested-With以及其他标头。

1
你是从哪里发现这个的?有文档记录吗?你是如何在API Gateway资源的“启用CORS”表单中添加头信息的? - nelsonic

0

我有一个适用于任何方法的HTTP API网关解决方案。 如果您在任何方法上使用授权器,您的授权器将拒绝OPTIONS请求,因为它不包含Authorization/Bearer令牌。 解决方案很简单: 在ANY路由旁边,创建具有完全相同路径且没有授权器的OPTIONS路由,指向lambda函数。然后在lambda中添加

const headers = {
    "Content-Type": "application/json",
    "Access-Control-Allow-Origin": "*",
    "Cache-Control": "max-age=0, no-store, must-revalidate",
    Pragma: "no-cache",
    Expires: 0
};
data = {
        multiValueHeaders: {},
        isBase64Encoded: false,
        statusCode: 200,
        headers: headers,
        body: ""
    }
if (event.httpMethod == "OPTIONS") {
    return context.done(undefined, data)
}

这对我有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接