2016-07-07 3 views
0

У меня есть несколько групп пользователей (у которых есть собственный пул идентификаторов в Cognito), которые имеют разные права на конечные точки в API Gateway. Я управляю правами доступа с помощью Ролей IAM. Например, у меня есть эта политика для одного пула идентификаторов:Управление мелким зерном с помощью AWS Cognito и API Gateway

{ 
    "Sid": "Stmt1467885818000", 
    "Effect": "Allow", 
    "Action": [ 
     "apigateway:Invoke" 
    ], 
    "Resource": [ 
     "arn:aws:execute-api:eu-central-1:891841139854:api-id/*/*/usergroup/*" 
    ] 
} 

Теперь я хочу иметь правила доступа, основанные на отдельных идентификаторах. Причина в том, что у меня есть ресурсы, которые меня могут изменить только пользователем, который «использует» ресурсы (или перечислены как имеющие доступ к ресурсу).

Могу ли я как-то использовать IAM для этого? Моя идея что-то вроде этого:

"Resource": [ 
     "arn:aws:execute-api:eu-central-1:891841139854:api-id/*/*/<my-user-name>/*" 
    ] 

Так таким образом, каждый пользователь может только Endpoints с его именем (а это имя пользователя может не быть переданы лямбда, которые могут быть уверены, что данный пользователь имеет право на выполните действие).

Возможно ли это? Если нет, как мне настроить мелкозернистый доступ?

+0

Какая интеграция вы используете с помощью API Gateway? HTTP-прокси, функции Lambda или служебный прокси AWS? –

+0

Различные. Но в основном лямбда. – Nathan

ответ

0

Для проверки личности пользователя вы можете использовать IAM conditions. Посмотрите еще один пример: this blog post. Это должно выглядеть так:

{ 
    "Effect": "Allow", 
    "Action": [ 
     "apigateway:Invoke" 
    ], 
    "Resource": [ 
     "arn:aws:execute-api:eu-central-1:891841139854:api-id/*/*/<my-user-name>/*" 
    ], 
    "Condition": { 
     "StringEquals": { 
      "cognito-identity.amazonaws.com:aud": "us-east-1:<identity-pool-id>", 
      "cognito-identity.amazonaws.com:sub": "us-east-1:<identity-id>" 
     } 
    } 
} 

Но я бы порекомендовал вам действовать по-другому.

В конфигурации интеграции шлюза API вы можете pass the Cognito pool and identity to the lambda. Затем, в Lambda, вы знаете личность вызывающего абонента (и вы можете позвонить Cognito API, если вам нужна дополнительная информация о личности пользователя).

Вы сможете создавать конечные точки, которые могут выглядеть как GET /user/me/my-resource и выполнять действия в зависимости от идентичности Cognito от API шлюза вызывающего. Вам не нужно создавать x конечных точек и политик для каждой личности в пуле идентификации Cognito.

Смежные вопросы