Как получить доступ к входу в AWS S3 с помощью Google и Cognito User / Identity Pool - PullRequest
0 голосов
/ 28 августа 2018

Я использую расширенный (упрощенный) поток 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 и иметь разрешение на чтение / запись в своем собственном каталоге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...