适用于OPTIONS的AWS API Gateway CORS,POST失败

时间:2016-10-20 08:54:51

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

我已经看过关于SO的其他相关问题,但这似乎有所不同。 事实上,我的问题与this one非常相似,除了我没有400状态问题。

设置:

  • 通过API网关的lambda函数
  • 授权:无,API KEY必需:false
  • 部署到阶段:test

  • 1个资源,1个集成lambda的POST方法。

  • 直接调用POST端点,例如curl总是返回200(有/无负载,有效负载等) - 这与引用的问题不同。

我已经使用了"启用CORS"选项 - 我已尝试在资源和POST请求(以及之后部署API)上应用此选项。

在API GW中,我可以在POST方法 - 方法响应区域下的200个响应标题中看到Access-Control-Allow-Origin

结果:在Chrome中通过客户端代码调用端点,OPTIONS会通过,但由于缺少Access-Control-Allow-Origin标头而导致POST失败。

在卷曲中:OPTIONS调用

curl -X OPTIONS -H "Access-Control-Request-Method: POST" \
     -H "Access-Control-Request-Headers: Content-Type" \
     -H "Origin: http://example.com" --verbose <endpoint>

回复是:

< HTTP/1.1 200 OK
< Content-Type: application/json
...
< Access-Control-Allow-Headers: Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token
< Access-Control-Allow-Methods: POST,OPTIONS
< Access-Control-Allow-Origin: *
...

但是使用POST:

curl -X POST -d '{}' -H "Content-Type: application/json" \
     -H "Origin: http://example.com" --verbose <endpoint>

它返回:

< HTTP/1.1 200 OK
< Content-Type: application/json
...

和响应json正文 - 但没有Access-任何标题。

我还能检查什么?

3 个答案:

答案 0 :(得分:18)

问题是API网关使用选中的"Lambda Proxy Integration"选项调用了我的lambda函数。

我相信在向新创建的lambda函数添加API网关触发器时默认激活它。

当进入API网关 - 资源 - 方法视图时,&#34;集成响应&#34;框是灰色的,似乎没有办法(即使是启用CORS功能)在那里添加Access-Control-Allow-Origin标题,根据@Abhigna_Nagaraja是必需的。

解决方案: 如果使用&#34; Lambda代理集成&#34;,请将'Access-Control-Allow-Origin': '*'标头添加到lambda函数中。

更好:在同一视图中 - 集成请求,关闭&#34; Lambda代理集成&#34;并再次启用CORS(之后部署)。

(然后,在回调中,您必须只返回有效负载json而不是{ statusCode, headers, body }对象。)

<强>更新

如果您不确定是否在http状态代码或json有效负载中返回请求响应状态信息,请执行一些有用的读取:

http status vs json status

json status standards

答案 1 :(得分:2)

&#39;启用CORS&#39; option是一个方便的工具,可以设置所有集成/方法响应头映射。如果您点击了“启用CORS&#39;然后添加了一个新资源,它不具备所需的设置。您可以点击“启用CORS&#39;再次或您可以手动将其设置为

  • 添加&#39; Access-Control-Allow-Origin&#39; POST方法的方法响应标头
  • 添加&#39; Access-Control-Allow-Origin&#39;集成响应标头映射到POST方法

另外,在使用curl测试更改之前,不要忘记部署API。

答案 2 :(得分:0)

如果您愿意使用 serverless-express 在 Lambda 中包装一个简单的 Express 应用程序,Express cors package 可以让 Lambda 代理非常简单且高度可配置。无需在 API 网关级别配置 CORS。

index.js

const app = express();
app.use(cors());
// ...your backend implementation

lambda.js

const serverlessExpress = require('@vendia/serverless-express')
const app = require('./app')
exports.handler = serverlessExpress({ app })