如何允许API网关代理与Cognito Authorizer集成以进行POST请求?

时间:2019-04-18 20:17:16

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

我正在尝试使用Cognito用户池授权对Lambda代理集成资源的API网关请求。

在没有授权者的情况下,来自客户端的所有请求都可以正常工作。当我添加一个Authorizer时,GET请求在获得授权时可以工作,但是POST / PUT / DELETE请求给我这个错误:

  

401   从起始点[客户端]到[端点]的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网关中删除了授权者,它将起作用。 POST / PUT / etc我缺少什么?

我想获得200/201响应并请求通过API网关授权。

2 个答案:

答案 0 :(得分:0)

可以按照本文档中的说明向API网关添加预检“选项”来解决此问题。

添加预检条目后,api网关应类似于屏幕截图。

https://enable-cors.org/server_awsapigateway.html

答案 1 :(得分:0)

<块引用>

如果我将请求类型从 POST 更改为 GET,它会起作用。

那可能是因为当您这样做时,它会变成一个“简单的请求”,并且它不会执行因授权方而在您的情况下失败的飞行前 OPTIONS 请求。

<块引用>

如果我从 API Gateway 中删除 Authorizer,它就可以工作。我在 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 请求将到达您想要的目的地。