У меня есть федеративный идентификатор 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򧴼
Похоже, что то, что я пытаюсь сделать, возможно ... Iне могу найти опцию «учетные данные вызывающего абонента» на панели запросов на интеграцию.
Это мое отображение интеграции:
"TableName": "TABLE_NAME",
"Item": {
"userid": {
"S": "$context.identity.cognitoIdentityId"
},
Когда я отключаю условие роли IAM, заполняетсятаблица, как и ожидалось ... Основной ключ раздела - идентификатор пользователя ...