首页 > 解决方案 > 如何允许 API Gateway 代理与 Cognito Authorizer 集成以进行 POST 请求?

问题描述

我正在尝试使用 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));

授权配置: 授权配置

如果我将请求类型从 更改POSTGET,它可以工作。如果我从 API Gateway 中删除授权者,它会起作用。我对 POST/PUT/etc 缺少什么?

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

标签: amazon-web-servicesaws-lambdaaws-api-gatewayamazon-cognito

解决方案


如果我将请求类型从 POST 更改为 GET,它可以工作。

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

如果我从 API Gateway 中删除授权者,它会起作用。我对 POST/PUT/etc 缺少什么?

OPTIONS 请求无法通过 Authorizer 控件,如果您删除 Authorizer 它可以工作。

您的问题的完整解决方案可以在这里找到

Vue & Axios + AWS API Gateway & Lambda - CORS + POST 不工作

总结。如果你有一个

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 请求将到达您想要的目的地。


推荐阅读