在 AWS Lambda 上配置 CORS 响应 headers?
Configure CORS response headers on AWS Lambda?
我正在尝试使用 AWS API 网关创建新服务,但我发现浏览器会自动调用 OPTIONS 方法来获取 CORS 信息。
问题是 AWS API 网关不提供配置 CORS headers 的本机方法。
是否可以创建 Lambda 脚本以响应 OPTIONS 方法?
如果您使用 {proxy+}
端点,则必须在 Lambda 函数中处理 CORS HTTP 请求。实现取决于您使用的框架。对于 Express,最简单的解决方案是简单地使用 Express CORS middleware.
如果您不想处理 Lambda
的 CORS
请求,请尝试更改 Lambda Method
的设置以处理 [=15= 上的 CORS
]级。
CORS setup on AWS API Gateway.
官方有详细教程
在 Access-Control-Allow-Headers
中允许 header X-Api-Key
也很重要,否则身份验证将无法工作,您会收到错误消息。
编辑: 2015 年 11 月,API 网关团队添加了一项新功能以简化 CORS 设置。
如果您使用 JQuery $.ajax,它将在 OPTIONS 请求之后发送 X-Requested-With 和 POST,因此您需要确保在 AWS API 上设置您的选项 access-control-accept-headers 以包括 header: X-Requested-With 以及其他选项。
如果启用了 lambda-proxy,则需要手动设置 CORS headers:
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
这是一个示例,希望对您有所帮助:
...
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)
}
}
有关详细信息,请查看此 link:
https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
我有任何方法的 HTTP API 网关解决方案。
如果您在 ANY 方法上使用授权方,您的授权方将拒绝 OPTIONS 请求,因为它不包含 Authorization/Bearer 令牌。
解决方法很简单:
在 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)
}
这对我有用。
我正在尝试使用 AWS API 网关创建新服务,但我发现浏览器会自动调用 OPTIONS 方法来获取 CORS 信息。
问题是 AWS API 网关不提供配置 CORS headers 的本机方法。
是否可以创建 Lambda 脚本以响应 OPTIONS 方法?
如果您使用 {proxy+}
端点,则必须在 Lambda 函数中处理 CORS HTTP 请求。实现取决于您使用的框架。对于 Express,最简单的解决方案是简单地使用 Express CORS middleware.
如果您不想处理 Lambda
的 CORS
请求,请尝试更改 Lambda Method
的设置以处理 [=15= 上的 CORS
]级。
CORS setup on AWS API Gateway.
官方有详细教程在 Access-Control-Allow-Headers
中允许 header X-Api-Key
也很重要,否则身份验证将无法工作,您会收到错误消息。
编辑: 2015 年 11 月,API 网关团队添加了一项新功能以简化 CORS 设置。
如果您使用 JQuery $.ajax,它将在 OPTIONS 请求之后发送 X-Requested-With 和 POST,因此您需要确保在 AWS API 上设置您的选项 access-control-accept-headers 以包括 header: X-Requested-With 以及其他选项。
如果启用了 lambda-proxy,则需要手动设置 CORS headers:
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
这是一个示例,希望对您有所帮助:
...
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)
}
}
有关详细信息,请查看此 link: https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-cors.html
我有任何方法的 HTTP API 网关解决方案。 如果您在 ANY 方法上使用授权方,您的授权方将拒绝 OPTIONS 请求,因为它不包含 Authorization/Bearer 令牌。 解决方法很简单: 在 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)
}
这对我有用。