У меня есть пул пользователей Cognito и шлюз API, использующий авторизатор Cognito User Pool.Каждый пользователь в пуле назначается группе с ролью IAM.С этой настройкой клиент аутентифицируется с помощью Cognito, а затем отправляет идентификатор токена на шлюз API, который авторизует запрос и передает его в функцию Lambda.Затем лямбда выполняет другие службы (DynamoDB и S3).У меня вопрос, какие учетные данные мне нужно использовать в лямбде?
Одним из вариантов является использование идентификатора токена, переданного в лямбду из шлюза API, для получения временных учетных данных из STS.Это в основном позволяет мне использовать групповую роль IAM пользователя для доступа к другим ресурсам AWS и выглядит следующим образом:
var credentials = new CognitoAWSCredentials(
"us-east-1:...", // Identity pool ID
RegionEndpoint.USEast1 // Region
);
credentials.AddLogin(
"cognito-idp.us-east-1.amazonaws.com/us-east-...", // User pool ID
"eyJraWQiOiJi..." // ID token
);
// use credentials to access AWS services
Другой вариант заключается в использовании роли выполнения, назначенной функции Lambda, но это выглядит таклучше подходит для других сценариев ... может быть, те, где лямбда выполняется как часть события?Я также, кажется, не понимаю, как получить эти учетные данные в самой лямбде.
Есть ли что-то еще, что я пропускаю?Какой подход лучше использовать здесь?
Обновление
То, что у меня было выше, было почти правильным, но не совсем.Прежде всего, выясните, нужен ли вашим пользователям несанкционированный доступ.Если это так, перейдите в свой пул удостоверений и включите несанкционированный доступ.
Чтобы получить доступ / секретные ключи для неавторизованных пользователей, вы должны сделать что-то вроде этого (используя C # SDK, но следующие принципы применимы к другим языкам):
var client = new AmazonCognitoIdentityClient(
new AnonymousAWSCredentials(), // We're making public API calls
RegionEndpoint.USEast1); // Your Region
var identityId = await client.GetIdAsync(new GetIdRequest
{
AccountId = "****", // AWS account ID
IdentityPoolId = "us-east-1:****" // Identity Pool ID
});
var credentials = await client.GetCredentialsForIdentityAsync(new GetCredentialsForIdentityRequest()
{
IdentityId = identityId.IdentityId
});
// Use credentials.Credentials when calling AWS services
Вышеприведенная проблемаучетные данные с разрешениями, определенными неаутентифицированной ролью IAM , определенной в вашем пуле удостоверений.
Чтобы получить учетные данные для аутентифицированных пользователей, вы сделаете следующее:
var client = new AmazonCognitoIdentityClient(
new AnonymousAWSCredentials(), // We're making public API calls
RegionEndpoint.USEast1); // Your region
var getIdentityIdRequest = new GetIdRequest
{
AccountId = "****", // AWS Account ID
IdentityPoolId = "us-east-1:****" // Identity Pool ID
};
getIdentityIdRequest.Logins.Add(
"cognito-idp.us-east-1.amazonaws.com/us-east-1****", // User Pool ID
idToken); // ID Token
var identityId = await client.GetIdAsync(getIdentityIdRequest);
var getCredentialsRequest = new GetCredentialsForIdentityRequest()
{
IdentityId = identityId.IdentityId
};
getCredentialsRequest.Logins.Add(
"cognito-idp.us-east-1.amazonaws.com/us-east-1****",
idToken);
var credentials = await client.GetCredentialsForIdentityAsync(getCredentialsRequest);
// Use credentials.Credentials when calling AWS services
You 'Для этого понадобится идентификационный токен, поэтому сначала выполните аутентификацию и извлеките идентификационный токен из ответа.Если пользователь, имеющий маркер идентификатора, принадлежит к группе в Cognito с назначенной ролью IAM, учетные данные, возвращенные из приведенного выше кода, будут для этой роли.Если пользователь не назначен в группу или группа не имеет роли, вы получите учетные данные для роли IAM аутентифицированного пользователя , назначенной для пула идентификаторов.
Также, как было предложено@thomasmichaelwallace, вышеупомянутое может быть сделано или из Lambda или из внешнего интерфейса API Gateway / Lambda, но только если вы используете AWS_IAM Authorizer, потому что это единственный, который принимает секретные ключи и ключи доступа для авторизации.Если вы просто используете Cognito Authorizer, как и я, вам нужно будет передать идентификационный токен в вашу лямбду и получить, чтобы ваша лямбда получила учетные данные.