在SAM / CloudFormation / Swagger中为API网关配置CORS

时间:2017-08-26 04:24:34

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

我按照here中的示例进行了操作,其中包含一个用于配置CORS + SAM的swagger文件。看起来我仍然会收到CORS错误,除非我手动将CORS标头添加到每个函数中:

callback(null, {
    statusCode: '200',
    headers: {
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Headers': 'Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token',
        'Access-Control-Allow-Methods': 'OPTIONS,GET,POST,PUT,PATCH,DELETE'
    },
    body: JSON.stringify({message: "Hello world"})
});

这是对的吗?或者我做错了什么?

3 个答案:

答案 0 :(得分:3)

所有AWS文档建议您需要在每个API网关资源中指定这3个标头,并在每个支持CORS的功能响应中返回它们,您可以看到他们必须将这3个标头添加到2 API网关示例项目的swagger.yaml文件中定义的端点。

您提到的Github示例正在proxy resource中使用所谓的API Gateway,它基本上是API Gatewaty路由,它将匹配对api的任何请求并触发代理lambda函数请求的部分,方法......等等。您可以了解有关其工作原理的更多信息here

您是否愿意尝试像serverless那样可以帮助您更好地组织您的lambda函数,就像SAM一样。它还support CORS

答案 1 :(得分:0)

当我们在Allow-Origin中使用*时,我们遇到了类似的问题。

当凭证标志为真时,无法在Access-Control-Allow-Origin中使用通配符。

替换

 'Access-Control-Allow-Origin': '*',

根据您的请求网址,

请求
 'Access-Control-Allow-Origin': 'http://localhost:8000',

或者你的网址是什么。

您还需要在返回标头中包含端口号。它还包括http或https。

如果您想自动化,请获取您可以列入白名单的引荐网址,并传递引荐来源的协议,主机,端口部分。

希望它有所帮助。

答案 2 :(得分:0)

我知道将所有这些添加到所有方法的Swagger JSON中是一项繁琐的工作。

            "headers": {
            "Access-Control-Allow-Origin": {
                "type": "string"
            },
            "Access-Control-Allow-Methods": {
                "type": "string"
            },
            "Access-Control-Allow-Headers": {
                "type": "string"
            }
        }

我在Java中创建了一个实用程序,它会自动将这些标头添加到您的Swagger JSON中。您可以在将其导入API网关之前运行它。

https://github.com/anandlalvb/SwaggerToAPIGateway