Ошибка 403 при вызове API, возможно проблема с аутентификацией? - PullRequest
0 голосов
/ 03 апреля 2019

Я хочу плакать, я действительно хочу плакать.У меня была эта проблема в течение 3 дней.У меня есть POST API в AWS Lambda, когда я тестирую его в AWS Lambda или в Cli, он работает нормально.Но не тогда, когда API вызывается из моего клиента.Я получаю следующую ошибку POST https://sdigg5u4xb.execute-api.eu-west-1.amazonaws.com/prod/sites 403 и Uncaught (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, просто спросите

Лямбда-код: https://pastebin.com/vWNUQH0T

Вызов API:

import {API} из "aws-ampify";

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

1 Ответ

0 голосов
/ 03 апреля 2019

Похоже, вы не отправляете токен ID вместе с запросом POST.

Попробуйте добавить это к вашему вызову:

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

cognitoUser будет любым именем объекта, которое выназначить вашему пользователю CognitoUser.

...