Как настроить Cognito Amplify для мелкозернистого доступа к DynamoDB через API-шлюз - PullRequest
0 голосов
/ 09 марта 2019

У меня есть федеративный идентификатор Cognito, использующий пул идентификаторов Cognito, настроенный с помощью Amplify.

У меня есть конечная точка шлюза API, авторизованная через IAM.Роль Cognito Auth позволяет вызывать эту конечную точку.

Ресурс конечной точки API Gateway интегрирован с DynamoDB (PutItem) и принимает роль выполнения, которая обеспечивает доступ к определенной таблице DynamoDB и DynamodB: PutItem.

Это все работает плавно, и аутентифицированный пользователь может помещать элементы в таблицу.

Теперь я хочу включить мелкозернистый доступ, чтобы пользователь Cognito мог только читать / записывать элементы в таблице DynamoDB, которыеопределяется их Idity Id.

У меня это работает с использованием модуля S3 Storage.

Я добавляю это условие к ExecutionRole, которое API-шлюз принимает:

"Condition": {
    "ForAllValues:StringEquals": {
      "dynamodb:LeadingKeys":  "${cognito-identity.amazonaws.com:sub}"
    }
}

И тело запроса содержит Идентификационный токен пользователя в качестве ключа хеша / раздела для элемента.

Auth.currentAuthenticatedUser({ bypassCache: false  })
      .then(user => {

        // Set the credentials necessary for making API calls
        Auth.currentCredentials()
          .then(creds => {
            state.identityId = credentials.identityId
            state.accessKey = credentials.accessKeyId
            state.secretKey = credentials.secretAccessKey
            state.sessionToken = credentials.sessionToken
        })

let body = {
    userid: state.identityId,
    name: username,
    load_date: now
  }

Чтобы было ясно, все работает, как ожидалось, пока я не добавлю условие в политику IAM.

Я следил за этой статьей, но в ней отсутствует компонент API Gateway, вместо этого я помещаю политику IAM непосредственно вРоль Cognito Auth и прямой вызов Dynamo.

https://aws.amazon.com/blogs/mobile/building-fine-grained-authorization-using-amazon-cognito-user-pools-groups/

Почему не работает моя настройка?

Редактировать: Я начинаю думать, что это невозможнои что мне нужно использовать лямбда-функцию между ними или переходить непосредственно к DynamoDB ... однако этот комментарий от BobK:

Детальный контроль доступа работает, если вы вызываете DynamoDB напрямую с вашими учетными данными Cognitoили если вы настроили прокси-сервер службы AWS для DynamoDB с включенным «использовать учетные данные вызывающего абонента»

https://forums.aws.amazon.com/thread.jspa?messageID=687420&#687420

Похоже, что то, что я пытаюсь сделать, возможно ... Iне могу найти опцию «учетные данные вызывающего абонента» на панели запросов на интеграцию.

Это мое отображение интеграции:

"TableName": "TABLE_NAME",
    "Item": {
        "userid": {
                "S": "$context.identity.cognitoIdentityId"
            },

Когда я отключаю условие роли IAM, заполняетсятаблица, как и ожидалось ... Основной ключ раздела - идентификатор пользователя ...

...