Доступ к appsync через lambda производит несанкционированный доступ даже с соответствующей ролью - PullRequest
0 голосов
/ 09 октября 2019

Я пытаюсь вызвать appsync из лямбда-функции, которую я настроил с помощью aws-усиления. Я могу сказать, что у моей лямбда-функции есть разрешение на чтение / запись для appsync, но когда я делаю запрос POST от lambda к appsync, я получаю ошибку Unable to parse JWT token. Странная вещь в том, что когда я смотрю на заголовок, я не вижу авторизации jwt, которую я вижу, когда запрашиваю из веб-приложения, поэтому, возможно, именно поэтому я вижу эту ошибку. Вместо этого я вижу x-amz-security-token и строку авторизации другого типа, которую вы видите на изображении ниже.

enter image description here

Мой код извлечен изблог, который я нашел в Адриан Холл :

const env = require('process').env
const fetch = require('node-fetch')
const URL = require('url')
const AWS = require('aws-sdk')

AWS.config.update({
  region: env.AWS_REGION,
  credentials: new AWS.Credentials(
    env.AWS_ACCESS_KEY_ID,
    env.AWS_SECRET_ACCESS_KEY,
    env.AWS_SESSION_TOKEN
  ),
})

exports.handler = (event, context, callback) => {
  const ListCourses = `query ListCourses(
    $filter: ModelTodoFilterInput
    $limit: Int
    $nextToken: String
  ) {
    listCourses(filter: $filter, limit: $limit, nextToken: $nextToken) {
      items {
        id
      }
      nextToken
    }
  }`

  // const details = {
  //   userId: event.request.userAttributes.sub,
  //   userDetails: {
  //     name: event.request.userAttributes.name,
  //   },
  // }

  const post_body = {
    query: ListCourses,
    operationName: 'ListCourses',
    variables: details,
  }
  console.log(env)
  console.log(`Posting: ${JSON.stringify(post_body, null, 2)}`)

  // POST the GraphQL mutation to AWS AppSync using a signed connection
  const uri = URL.parse(env.API_GRAPHQLAPIENDPOINTOUTPUT)
  const httpRequest = new AWS.HttpRequest(uri.href, env.REGION)
  httpRequest.headers.host = uri.host
  httpRequest.headers['Content-Type'] = 'application/json'
  httpRequest.method = 'POST'
  httpRequest.body = JSON.stringify(post_body)

  AWS.config.credentials.get(err => {
    const signer = new AWS.Signers.V4(httpRequest, 'appsync', true)
    signer.addAuthorization(AWS.config.credentials, AWS.util.date.getDate())

    const options = {
      method: httpRequest.method,
      body: httpRequest.body,
      headers: httpRequest.headers,
    }

    console.log('here is the uri and options')
    console.log(uri.href)
    console.log(options)

    fetch(uri.href, options)
      .then(res => res.json())
      .then(json => {
        console.log(`JSON Response = ${JSON.stringify(json, null, 2)}`)
        callback(null, event)
      })
      .catch(err => {
        console.error(`FETCH ERROR: ${JSON.stringify(err, null, 2)}`)
        callback(err)
      })
  })
}

Кто-нибудь знает, почему методы проверки учетных данных разрешают их использование и как я могу исправить эту ошибку UnauthorizedException? Просто чтобы проверить, в порядке ли я, я добавил, что хочу, чтобы эта лямбда-функция имела доступ для чтения / записи, и я могу видеть в шаблоне CF, что:

                "PolicyDocument": {
                    "Version": "2012-10-17",
                    "Statement": [
                        {
                            "Effect": "Allow",
                            "Action": [
                                "appsync:Create*",
                                "appsync:StartSchemaCreation",
                                "appsync:GraphQL",
                                "appsync:Get*",
                                "appsync:List*"
                            ],
                            "Resource": [
                                {
                                    "Fn::Join": [
                                        "",
                                        [
                                            "arn:aws:appsync:",
                                            {
                                                "Ref": "AWS::Region"
                                            },
                                            ":",
                                            {
                                                "Ref": "AWS::AccountId"
                                            },
                                            ":apis/",
                                            {
                                                "Ref": "apiGraphQLAPIIdOutput"
                                            },
                                            "/*"
                                        ]
                                    ]
                                }
                            ]
                        }
                    ]
                }

1 Ответ

1 голос
/ 09 октября 2019

Вам придется использовать AWS_IAM в качестве режима авторизации для вашего API, если вы хотите вызвать его из лямбды. Судя по ошибке, ваш API настроен на использование AMAZON_COGNITO_USER_POOLS в качестве авторизации. Если вы хотите смешать 2 в своем API, вы можете посмотреть следующий блог:

https://aws.amazon.com/blogs/mobile/using-multiple-authorization-types-with-aws-appsync-graphql-apis/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...