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 Function带Use 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)