【问题标题】:Configure CORS response headers on AWS Lambda?在 AWS Lambda 上配置 CORS 响应标头?
【发布时间】:2015-11-01 21:58:08
【问题描述】:

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

问题在于 AWS API Gateway 不提供配置 CORS 标头的本地方式。

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

【问题讨论】:

标签: amazon-web-services cors aws-lambda aws-api-gateway


【解决方案1】:

我有一个使用 ANY 方法的 HTTP API 网关解决方案。 如果您在任何方法上使用授权方,您的授权方将拒绝 OPTIONS 请求,因为它不包含授权/不记名令牌。 解决方法很简单: 在 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)
}

这对我有用。

【讨论】:

    【解决方案2】:

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

    ...
        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

    【讨论】:

      【解决方案3】:

      如果您使用 {proxy+} 端点,则必须在 Lambda 函数中处理 CORS HTTP 请求。实现取决于您使用的框架。对于 Express,最简单的解决方案是简单地使用 Express CORS middleware。

      如果您不想处理Lambda 的CORS 请求,请尝试将Lambda Method 的设置更改为在API Gateway 级别处理CORS。

      这里有CORS setup on AWS API Gateway的详细官方教程。

      在Access-Control-Allow-Headers 中允许标头X-Api-Key 也很重要,否则身份验证将不起作用并且您会收到错误。

      编辑:2015 年 11 月,API Gateway 团队添加了一项新功能来简化 CORS 设置。

      【讨论】:

      • 如果您的 api 网关配置为 lambdaproxy,则在 api 网关中启用 CORS 设置还不够
      • @Chandru 我同意,aws 文档说对于代理设置,响应必须来自 http 后端,这对于 node/express 应该是什么样的?
      • 尝试创建一个{proxy+} 端点并将所有请求转发到 Lambda 函数。
      • 这个答案不正确,如上所述。应标记以下一项。
      • 这个答案是正确的。但是,{proxy+} 端点需要 Lambda 级别的配置,因为所有请求都只是从 API Gateway 传递过来的。
      【解决方案4】:

      如果您启用了 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

      【讨论】:

        【解决方案5】:

        如果您使用的是 JQuery $.ajax,它将在 OPTIONS 请求之后发送带有 POST 的 X-Requested-With,因此您需要确保在 AWS 上设置您的 OPTIONS access-control-accept-headers包含该标头的 API:X-Requested-With 以及其他。

        【讨论】:

        • 您在哪里发现的?有记录吗?您是如何在 API Gateway 资源“启用 CORS”表单中添加标头的?
        猜你喜欢
        • 1970-01-01
        • 2017-08-28
        • 2016-01-13
        • 1970-01-01
        • 2021-04-06
        • 2020-02-21
        • 1970-01-01
        • 2018-06-15
        • 2021-12-20
        相关资源
        最近更新 更多