AWS API 网关和 Lambda 函数出现 CORS 预检响应错误

问题描述 投票:0回答:2

我设置了一个 AWS lambda 函数,它返回一些数据,然后设置一个 API 网关和一个 POST 方法,然后设置指向它的 API 网关(无授权)。

我想允许来自任何来源的访问。我相信我已经正确设置了 CORS 标头和 api 网关,但我仍然收到预检响应错误。

我已将标头添加到 lambda 函数中:

exports.handler = async (event) => {


return   { 
    statusCode: 200, 
    headers: { 
        "Access-Control-Allow-Headers": "*",
        "Access-Control-Allow-Origin": "*",
        "Access-Control-Allow-Methods": "*",
        "Access-Control-Allow-Credentials": true,
        'Content-Type': 'application/json' 
    }, 
    body: JSON.stringify({})
}

};

在 API 网关中,我启用了 CORS,它使用 MOCK 集成类型为预检响应创建了 OPTIONS 方法。

CORS enabled

我已确认我的 POST 请求在邮递员中有效。

但是,在客户端我收到预检请求错误:

Access to fetch at '[API Gateway URL]' from origin 'MY WEBSITE' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: It does not have HTTP ok status.

检查网络日志,OPTIONS 端点返回 HTTP 500 错误,我无法弄清楚 API 网关中的配置有什么问题。当我在API网关中测试端点时,端点返回200。我是否缺少一些配置 CORS 的配置步骤?

enter image description here

amazon-web-services aws-lambda cors aws-api-gateway
2个回答
3
投票

最后,从AWS API网关文档中找到了实现步骤。我集成了相同的内容,它按预期工作。

根据文档,当我们在 API 网关中配置 CORS 时,我们必须创建专用路由来管理预检请求。

以下是“为 HTTP API 配置 CORS”的高级步骤

  1. 通过“OPTIONS”方法创建专用路线
  2. 路由名称应为“/{proxy+}”
  3. 确保其他路由没有配置“ANY”方法。否则优先选择配置为“ANY”方法的路由
  4. 不要在上述路由中附加任何身份验证
  5. 为路由创建专用的 lambda 函数以返回 200 响应代码并将其附加到路由的集成中(请参阅下面的屏幕截图)
  6. 在 lambda 函数中添加如下代码

export const handler = async (event) => {
    const response = {
        statusCode: 200,
        headers: {
            "Access-Control-Allow-Headers" : "Content-Type",
            "Access-Control-Allow-Origin": "https://www.example.com",
            "Access-Control-Allow-Methods": "OPTIONS,POST,GET"
        },
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

请参阅此处了解有关标题的更多信息。

FYR,附API网关路由截图

enter image description here

预检请求处理程序(Lambda 函数)

enter image description here

应用程序中预检请求成功

enter image description here

有关实施的更多详细信息,请参阅此处

关于API路由请参考这里


0
投票

raheem.unr 我花了 2 天的时间才让它在 SAM 模板中正常工作,这终于帮助了我。 谢谢!

© www.soinside.com 2019 - 2024. All rights reserved.