如何允许 API Gateway 代理与 Cognito Authorizer 集成以进行 POST 请求?
Posted
技术标签:
【中文标题】如何允许 API Gateway 代理与 Cognito Authorizer 集成以进行 POST 请求?【英文标题】:How to allow API Gateway Proxy Integration with Cognito Authorizer for POST requests? 【发布时间】:2019-09-09 05:06:45 【问题描述】:我正在尝试使用 Cognito 用户池为 Lambda 代理集成资源授权 API Gateway 请求。
从客户端,所有请求都可以在没有授权者的情况下正常工作。当我添加授权者时,GET 请求在获得授权时工作,但 POST/PUT/DELETE 请求给我这个错误:
401 从源 [client] 访问 [Endpoint] 的 XMLHttpRequest 已被 CORS 策略阻止:请求的资源上不存在“Access-Control-Allow-Origin”标头
我已经为资源选择了'Enable CORS'
,但它仍然不起作用。
js 请求:
const jwt = this.$store.state.user
.getSignInUserSession()
.getIdToken()
.getJwtToken();
const config =
headers:
authorization: jwt,
,
id: generatedID,
name: 'generatedName',
;
axios.post(endpoint, config)
.then((val) => this.info = val; )
.catch(err => console.log(err));
身份验证配置: authorizer config
如果我将请求类型从 POST
更改为 GET
,它会起作用。如果我从 API Gateway 中删除授权者,它会起作用。对于 POST/PUT/etc,我缺少什么?
我想获得 200/201 响应并让请求通过 API 网关授权。
【问题讨论】:
对于 Lambda 代理集成,您需要在 Lambda 响应中手动添加 CORS 标头。请参考此documentation。 @lightyagami lambda 函数已经这样做了,但日志表明 lambda 函数甚至没有被命中。只有 API 显示了 cloudwatch 中的任何活动,并且它仅表明请求是“未经授权的”并停止在那里。 ***.com/questions/38987256/… 【参考方案1】:可以通过向 API 网关添加预检“OPTIONS”来解决此问题,如本文档中所述。
添加预检条目后,api 网关应如屏幕截图所示。
https://enable-cors.org/server_awsapigateway.html
【讨论】:
【参考方案2】:如果我将请求类型从 POST 更改为 GET,它会起作用。
这可能是因为当您这样做时,它会变成一个“简单请求”,并且它不会执行飞行前 OPTIONS 请求,在您的情况下由于授权方而失败。
如果我从 API 网关中删除授权者,它会起作用。对于 POST/PUT/etc,我缺少什么?
OPTIONS 请求无法通过 Authorizer 控件,如果你删除 Authorizer 就可以了。
您的问题的完整解决方案可以在这里找到
Vue & Axios + AWS API Gateway & Lambda - CORS + POST not working
总结。如果你有一个
route verb Authentication integration
/private POST/GET yes lambda-private
那么你需要创建一个额外的
route verb Authentication integration
/private POST/GET yes lambda-private
/private OPTIONS no lambda-CORS-response
因此,您的飞行前请求将得到很好的响应,并且 POST/GET 请求将到达您想要的目的地。
【讨论】:
以上是关于如何允许 API Gateway 代理与 Cognito Authorizer 集成以进行 POST 请求?的主要内容,如果未能解决你的问题,请参考以下文章
AWS Api Gateway CORS“访问控制允许来源”正则表达式与 Cloudformation
AWS API Gateway - Lambda 代理(集成请求) - 内部服务器错误
如何允许API网关代理与POST请求的Cognito Authorizer集成?