AWS API网关设置为Lambda电子邮件功能持久403在选项预取

时间:2018-02-11 20:45:00

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

我一直在试图让API Gateway成为前门并触发Lambda功能。

我设置了一个名为“ContactFormLambda”的Lambda,它接受一个POST,详细信息如下:

{
  "subject": "Enquiry from ZenithWebFoundry",
  "name": "contact.name",
  "number": "contact.number",
  "email": "*******@gmail.com",
  "comment": "this is a test"
}

现在,在API网关中,我创建了一个名为“contact”的新API并创建了一个名为“contactformlambda”的新资源,将其设置为lambda的代理并定义了一个POST方法(因为这就是我所有的正在做。

我通过网关对此进行了测试,但它确实有效。

这是Lambda下的API网关设置(来自上述工作): enter image description here

然后我希望能够从表单POST到网关,所以我意识到我需要CORS,所以我在资源上启用了CORS。这创建了一个OPTIONS方法,上面有三个标题:

access-control-allow-headers
access-control-allow-methods
access-control-allow-origin

然后我尝试提交表单,但是预取的选项失败了403.我已按照说明here执行所有操作。我尝试过很多变化,似乎没什么用。

话虽如此,有一次,它确实有效,但它让一切都不仅仅是我在Access-Control-Allow-Origin字段中指定的域。我无法在这看到我做的不同。感觉就像每次我设置它,它做了不同的事情。我显然对此无能为力,有人可以清楚这一点吗?

1 个答案:

答案 0 :(得分:0)

我把它带到了工作的某个地方。基本上,忽略API网关中“操作”菜单中的“启用CORS”操作:它不起作用,instead follow this guide

另外,我的持久性403是由资源的url区分大小写引起的。我试图点击:

https://ovo5xmxf7e.execute-api.ap-southeast-2.amazonaws.com/prod/ContactFormLambda

但实际网址是:

https://ovo5xmxf7e.execute-api.ap-southeast-2.amazonaws.com/prod/contactformlambda

疯了吧?

我说,“在工作的某个地方”,因为基本上CORS工作得太好了。我指定:

Access-Control-Allow-Origin:'http://zenithwebfoundry.com'

尽管回复了POST回复:

一般

Request URL:https://ovo5xmxf7e.execute-api.ap-southeast-2.amazonaws.com/prod/contactformlambda
Request Method:POST
Status Code:200 
Remote Address:54.230.243.227:443
Referrer Policy:no-referrer-when-downgrade

响应标头

access-control-allow-headers:Content-Type,X-Amz-Date,Authorization,X-Api-Key,x-requested-with
access-control-allow-methods:POST,OPTIONS
access-control-allow-origin:http://zenithwebfoundry.com
content-length:0
content-type:application/json
date:Mon, 12 Feb 2018 10:36:17 GMT
status:200
via:1.1 fda24eb25587b7e25d4fa1c50a862ba0.cloudfront.net (CloudFront)
x-amz-cf-id:b7DscV6b6qWl_mHUsEi77nRjICECZD3bd2iXiFv89A1d_xrDvfBQ0Q==
x-amzn-requestid:8d5578fc-0fe0-11e8-9e16-65a7dc0a72e4
x-amzn-trace-id:sampled=0;root=1-5a816e1f-aeeb63ef8590ed3868fe4149
x-cache:Miss from cloudfront
x-requested-with:*

请求标题

:authority:ovo5xmxf7e.execute-api.ap-southeast-2.amazonaws.com
:method:POST
:path:/prod/contactformlambda
:scheme:https
accept:application/json, text/plain, */*
accept-encoding:gzip, deflate, br
accept-language:en-US,en;q=0.9
cache-control:no-cache
content-length:147
content-type:text/plain
origin:http://localhost:4200
pragma:no-cache
referer:http://localhost:4200/contact
user-agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.140 Safari/537.36

即使我的出身显然不是http://zenithwebfoundry.com,它仍然完成了动作。

为什么呢?
access-control-allow-origin:http://zenithwebfoundry.com

设置被忽略?

另外,另一个观察,我注意到预取不再发生了。我已经跟踪了这样一个事实:我不再发送任何CORS不允许的标题(我发送了Access-Control-Allow-Origin错误地认为我必须在请求中发送它)。我现在开始发送“x-requested-with:*”,它现在强制进行预检检查以查看是否允许发送“x-requested-with”。

我希望飞行前检查也会阻止从localhost执行帖子,但事实并非如此。