AWS API Gateway - CORS"access-control-allow-origin" - 多个条目

Wes*_*Wes 8 lambda amazon-s3 amazon-web-services cors aws-api-gateway

我有一个AWS Lambda实例,它连接到定义的AWS API网关.如果我启用CORS并给出access-control-allow-origin定义http://example.com,那么我可以从中访问Lambda实例http://example.com.但是,如果我使用https://example.com它,它不起作用.

那么在AWS中,如何在access-control-allow-origin不使用通配符的情况下定义使用多个值?我尝试使用类似的东西*.example.com,但这不起作用.

编辑:如果我'*'在API网关上使用我的值,但在我的S3存储桶上设置CORS规则,那会安全吗?存储桶规则示例:

<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
    <CORSRule>
        <AllowedOrigin>http://example.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>https://example.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
    <CORSRule>
        <AllowedOrigin>https://www.example.com</AllowedOrigin>
        <AllowedMethod>GET</AllowedMethod>
        <AllowedMethod>POST</AllowedMethod>
        <AllowedMethod>PUT</AllowedMethod>
        <MaxAgeSeconds>3000</MaxAgeSeconds>
        <AllowedHeader>*</AllowedHeader>
    </CORSRule>
</CORSConfiguration>
Run Code Online (Sandbox Code Playgroud)

Rav*_*car 20

如果您想启用多个Origins,这一直是CORS的烦恼.

其他系统中的常见解决方法(例如express/nginx等)是:

  • 检查Origin浏览器发送的标头
  • 检查原始白名单
  • 如果匹配,则返回Origin作为Access-Control-Allow-Origin标题的传入,否则返回占位符(默认原点)

使用AWS-Gateway的自动装配CORS支持使用模拟集成是不可能的,但是如果您编写自己的代码来处理OPTIONS请求,则是可能的.

下面是使用lambda代理集成编写的示例代码:

const allowedOrigins = [
    "http://example.com",
    "http://example.com:8080",
    "https://example.com",
    "https?://[a-z]*.?myapp.com",
    "http://localhost:[0-9]*"
];

exports.handler = (event, context) => {
    const origin = event.headers.Origin || event.headers.origin;
    var goodOrigin = false;

    if (origin) {
        allowedOrigins.forEach( allowedOrigin => {
            if (!goodOrigin && origin.match(allowedOrigin)) {
                goodOrigin = true;
            }
        });
    }

    context.succeed({
        headers: {
            "Access-Control-Allow-Headers": "Accept,Accept-Language,Content-Language,Content-Type,Authorization,x-correlation-id",
            "Access-Control-Expose-Headers": "x-my-header-out",
            "Access-Control-Allow-Methods": "DELETE,GET,HEAD,OPTIONS,PATCH,POST,PUT",
            "Access-Control-Allow-Origin": goodOrigin ? origin : allowedOrigins[0]
        },
        statusCode: 204
    });
};
Run Code Online (Sandbox Code Playgroud)

将其保存为lambda函数.要在API-Gateway中进行设置,请添加一个OPTIONS方法,并Integration Request选择Lambda FunctionUse Lambda Proxy integration勾选的方法.

当然,这样做的缺点是你要支付lambda函数,并且调用lambda函数可能比模拟集成延迟50ms.


Dhi*_*wal 17

为什么不使用 Velocity Template 语言映射模板来检查允许的域列表并设置源头

$input.json("$")
#set($domains = ["https://www.example.com", "https://www.abcd.com"])
#set($origin = $input.params("origin"))
#if($domains.contains($origin))
#set($context.responseOverride.header.Access-Control-Allow-Origin="$origin")
#end
Run Code Online (Sandbox Code Playgroud)

  • AWS Api Gateway 控制台中的@RajanSharma,选项和发布方法的响应集成 -&gt; 内容类型:application/json -&gt; 映射模板 (4认同)

Bob*_*ney 6

不幸的是,今天这是不可能的.CORS规范不允许部分通配符,并且当前API网关仅允许标头的单个静态值.

您可以重载OPTIONS方法,以根据传入的主机头动态返回此值.