如何允许 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集成?

只允许 AWS API Gateway 访问 EC2 实例

使用 Cloudformation 的 AWS Api Gateway 代理资源?

不使用 API Gateway 代理集成无法调用后端服务