Amazon web services 403 API调用错误,可能存在身份验证问题?

Amazon web services 403 API调用错误,可能存在身份验证问题?,amazon-web-services,aws-lambda,amazon-cognito,Amazon Web Services,Aws Lambda,Amazon Cognito,我想哭,我真的想哭。我有这个问题已经三天了。我在aws lambda中有一个POST API,当我在aws lambda或cli中测试它时,它运行良好。但当从我的客户机调用API时就不是了。我得到以下错误POSThttps://sdigg5u4xb.execute-api.eu-west-1.amazonaws.com/prod/sites 403和未捕获(承诺中)错误:请求失败,状态代码403 在createError(createError.js:17) 结算时(结算js:19) 在XMLH

我想哭,我真的想哭。我有这个问题已经三天了。我在aws lambda中有一个POST API,当我在aws lambda或cli中测试它时,它运行良好。但当从我的客户机调用API时就不是了。我得到以下错误
POSThttps://sdigg5u4xb.execute-api.eu-west-1.amazonaws.com/prod/sites 403和未捕获(承诺中)错误:请求失败,状态代码403
在createError(createError.js:17)
结算时(结算js:19)
在XMLHttpRequest.handleLoad(xhr.js:78)

起初我以为这和CORS有关,但事实并非如此。因为它是403错误,所以它必须与权限有关,对吗? 我曾尝试给我的aws用户不同的策略和角色,以允许他们做任何事情,但我无法让它工作。请在我哭之前帮助我。如果有人需要我的aws信息,请询问

Lambda代码:

调用API:

从“aws放大”导入{API}

在my index.js中放大配置

Amplify.configure({
  Auth: {
    mandatorySignIn: true,
    region: config.cognito.REGION,
    userPoolId: config.cognito.USER_POOL_ID,
    identityPoolId: config.cognito.IDENTITY_POOL_ID,
    userPoolWebClientId: config.cognito.APP_CLIENT_ID
  },
  Storage: {
    region: config.s3.REGION,
    bucket: config.s3.BUCKET,
    identityPoolId: config.cognito.IDENTITY_POOL_ID
  },
  API: {
    endpoints: [
      {
        name: "sites",
        endpoint: config.apiGateway.URL,
        region: config.apiGateway.REGION
      },
    ]
  }
});
serverless.yml

functions:
  # Defines an HTTP API endpoint that calls the main function in create.js
  # - path: url path is /notes
  # - method: POST request
  # - cors: enabled CORS (Cross-Origin Resource Sharing) for browser cross
  #     domain api call
  # - authorizer: authenticate using the AWS IAM role
  createSite:
    handler: CreateSite.main
    events:
      - http:
          path: sites
          method: post
          cors: true
          authorizer: aws_iam

看起来您没有在POST请求中发送ID令牌

尝试将此添加到您的通话中:

{
    headers: {
       Authorization: cognitoUser.getIdToken().getJwtToken()
    },
    body: values
}

cognitoUser将是您分配给用户的cognitoUser的任何对象名称。

看起来您没有随POST请求一起发送ID令牌

尝试将此添加到您的通话中:

{
    headers: {
       Authorization: cognitoUser.getIdToken().getJwtToken()
    },
    body: values
}


cognitoUser将是您分配给用户的cognitoUser的任何对象名称。

您需要发布Lambda代码。承诺正在返回,但有一个未处理的异常。这可能是权限问题,但除非您处理异常并
console.log
It(登录到Cloudwatch),否则您将无法了解真正的问题。@Annjawn感谢您的回复!我添加了lambda代码。我使用pastebin是因为它相当长,并且希望保持可读性。我们需要您用来调用API的代码。确保您发送的是带有id令牌的授权标头。@我已在调用apiYour
authorizer
is
aws\u iam
的地方插入了代码。因此,您需要一个
密钥
访问密钥
令牌
来根据您的API进行身份验证,而不是
Cognito用户池
jwt
令牌。你是如何认证的?你需要发布你的Lambda代码。承诺正在返回,但有一个未处理的异常。这可能是权限问题,但除非您处理异常并
console.log
It(登录到Cloudwatch),否则您将无法了解真正的问题。@Annjawn感谢您的回复!我添加了lambda代码。我使用pastebin是因为它相当长,并且希望保持可读性。我们需要您用来调用API的代码。确保您发送的是带有id令牌的授权标头。@我已在调用apiYour
authorizer
is
aws\u iam
的地方插入了代码。因此,您需要一个
密钥
访问密钥
令牌
来根据您的API进行身份验证,而不是
Cognito用户池
jwt
令牌。您是如何进行身份验证的?我收到错误“cognitoUser未定义”。我应该提到,我的网站还没有登录系统。在此之前,我想让它正常工作,我还从index.js中添加了我的放大配置。有没有办法在api调用中,将用户api键硬编码到头中?好的,那么,您的api是否使用授权程序?它应该在API的方法请求部分。我似乎找不到你在说什么,是在我的代码中还是在aws上?我刚刚在问题中插入了我的代码中定义api的部分,我得到了错误“cognitoUser未定义”。我应该提到,我的网站还没有登录系统。在此之前,我想让它正常工作,我还从index.js中添加了我的放大配置。有没有办法在api调用中,将用户api键硬编码到头中?好的,那么,您的api是否使用授权程序?它应该在API的方法请求部分。我似乎找不到你在说什么,是在我的代码中还是在aws上?我刚刚在问题中插入了定义api的代码部分