【问题标题】:403 error on API call, possible authentication issue?API 调用时出现 403 错误,可能存在身份验证问题?
【发布时间】:2019-08-24 08:35:56
【问题描述】:

我想哭,我真的想哭。我已经有这个问题3天了。我在 aws lambda 中有一个 POST API,当我在 aws lambda 或 cli 中测试它时,它工作正常。但不是从我的客户端调用 API 时。我收到以下错误 POST https://sdigg5u4xb.execute-api.eu-west-1.amazonaws.com/prod/sites 403Uncaught (in promise) Error: Request failed with status code 403 at createError (createError.js:17) at settle (settle.js:19) at XMLHttpRequest.handleLoad (xhr.js:78)

起初我以为这与 CORS 有关,但事实并非如此。由于这是一个 403 错误,它必须与权限有关吗? 我尝试为我的 aws 用户提供不同的策略和角色以有权执行所有操作,但我无法使其正常工作。在我哭之前请帮助我。如果有人需要我的任何 aws 信息,请询问

Lambda 代码:https://pastebin.com/vWNUQH0T

调用 API:

从“aws-amplify”导入 { API };

export default (async function submitSite(values) {
  console.log(values);
  return API.post("sites", "/sites", {
    body: values
  })
});

在我的 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

【问题讨论】:

  • 您需要发布您的 Lambda 代码。承诺返回一个未处理的异常。这可能是权限问题,但除非您处理异常并 console.log 它(登录 Cloudwatch),否则您将无法知道真正的问题。
  • @Annjawn 感谢您的回复!我添加了 lambda 代码。我使用 pastebin 是因为它很长并且希望保持可读性。
  • 我们需要您用来调用 API 的代码。确保发送带有 id 令牌的 Authorization 标头。
  • @cmaronchick 我已经在我调用 api 的地方插入了代码
  • 您的authorizeraws_iam。因此,您需要 secret keyaccess keytoken 来针对您的 API 进行身份验证 - 而不是 Cognito user pooljwt 令牌。你是如何认证的?

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


【解决方案1】:

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

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

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

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

【讨论】:

  • 我收到错误“cognitoUser 未定义”。我应该提一下,我的网站上还没有登录系统。我想在我这样做之前让它工作
  • 我还从我的 index.js 添加了我的放大配置
  • 有什么办法可以在用户 api 键中硬编码到 api 调用中的标头?
  • 好的,在这种情况下,您的 API 是否使用了授权者?它应该在 API 的方法请求部分。
  • 我似乎找不到您在说什么,是在我的代码中还是在 aws 中?我刚刚在问题中插入了定义 api 的代码部分
猜你喜欢
  • 1970-01-01
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 2015-12-16
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多