Я использую расширенный (упрощенный) поток AWS Cognito для получения учетных данных Cognito Identity, предоставляющих idToken, полученный после входа в систему с помощью API входа в Google:
export function getAWSCredentialWithGoogle(authResult) {
if (authResult['idToken'] != null) {
AWS.config.region = 'eu-central-1';
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: 'eu-central-1:xxxxxxxxxxxxxxxxxxxxxxxx',
Logins: {
'accounts.google.com': authResult['idToken']
}
})
return AWS.config.credentials.getPromise()
.then(
function(){
return getAWSCredentials(AWS.config.credentials);
},
function(err) {
}
)
} else {
console.log('no auth code found!');
}
}
Я получаю:
accessKeyId: "ASIAXXXXXX",
secretAccessKey: "ta4eqkCcxxxxxxxxxxxxxxxxxxx",
sessionToken: "XXXXXXXXX ... и т.д ..."
Затем я пытаюсь загрузить изображение в корзину S3, передавая полученные выше accessKeyId и secretAccessKey.
Но я получаю этот результат ошибки:
InvalidAccessKeyId
Идентификатор ключа доступа AWS, который вы указали, не существует в наших записях .ASIAXXXXXXXXXXXXXXXX
Вот как я настраивал политику AWS S3 (управляемую) (политика ресурсов для корзины - это политика по умолчанию) для прогамматического доступа к корзине:
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::xxxxxxxxxx",
"arn:aws:s3:::xxxxxxxxxx/users"
],
"Condition": {
"StringLike": {
"s3:prefix": [
"${cognito-identity.amazonaws.com:sub}/*"
]
}
}
},
{
"Action": [
"s3:PutObject",
"s3:GetObjectAcl",
"s3:GetObject",
"s3:PutObjectVersionAcl",
"s3:DeleteObject",
"s3:PutObjectAcl",
"s3:GetObjectVersion"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::xxxxxxxxx/users/${cognito-identity.amazonaws.com:sub}",
"arn:aws:s3:::xxxxxxxxx/users/${cognito-identity.amazonaws.com:sub}/*"
]
}
]
}
эта политика была присоединена к роли IAM со следующими доверительными отношениями:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "eu-central-1xxxxxxxxxxx"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
}
]
}
Я правильно настроил Федеративный пул удостоверений для использования этой роли и добавил Google в качестве поставщика OpenID Connect.
Я также настроил свой Cognito Identity Pool на прием пользователей, интегрированных с моим Cognito User Pool, указав идентификатор пула пользователей и идентификатор клиента приложения.
Я хотел бы предоставить любому аутентифицированному пользователю входа в Google доступ к корзине S3 и иметь разрешение на чтение / запись в своем собственном каталоге.