Amazon S3 указывает папку c для аутентифицированного пользователя через Cognito, возвращает 403 для listObjects - PullRequest
0 голосов
/ 02 марта 2020

Я пытаюсь создать указанную c папку пользователя в s3. Все пользователи аутентифицированы через Cognito (провайдер Google). У меня есть такие политики для Cognito Role

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "cognito-identity:*",
                "mobileanalytics:PutEvents",
                "cognito-sync:*"
            ],
            "Resource": "*"
        },
        {
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::fake-youtube-videos"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "${accounts.google.com:sub}/*"
                    ]
                }
            }
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::fake-youtube-videos/${accounts.google.com:sub}/*"
            ]
        }
    ]
}

И политики для корзины

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:ListBucket",
            "Resource": "arn:aws:s3:::fake-youtube-videos",
            "Condition": {
                "StringLike": {
                    "s3:prefix": "${accounts.google.com:sub}/*"
                }
            }
        },
        {
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::fake-youtube-videos/${accounts.google.com:sub}/*"
        }
    ]
}

Когда я получаю аутентификацию с внешнего интерфейса

var id_token = googleUser.getAuthResponse().id_token;

var profile = googleUser.getBasicProfile();
AWS.config.apiVersions = '2012-10-17'
AWS.config.region = 'us-east-1'; // Region
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'us-east-1:c1f4182d-4598-4c83-80ff-896b6bff632f',
    Logins: {
          'accounts.google.com': id_token
      }
});



var identityId = AWS.config.credentials.identityId;
var s3 = new AWS.S3();

s3.listObjects({Bucket: 'fake-youtube-videos'}, function (err, url) {
  console.log('The URL is', url);
  console.log('The error', err);
})

Также Disabled policies все отключено Я получил 403 за список объектов Access denied. Я застрял. Что я делаю не так?

1 Ответ

0 голосов
/ 02 марта 2020

Для тех, кто застрял с той же проблемой:

var identityId = AWS.config.credentials.identityId не совпадает с accounts.google.com:sub

Поскольку https://developers.google.com/identity/protocols/OpenIDConnect#obtainuserinfo sub уникально ID пользователя.

Вы должны использовать

var sub = profile.getId() //Which you can get from a google
s3.listObjects({Bucket: 'fake-youtube-videos', Prefix: sub}, function (err, url) {
  console.log('The URL is', url);
  console.log('The error', err);
})

В вопросе я допустил ошибку, я попытался получить список объектов на root корзины, но когда вы пытаясь сделать с указанным c префиксом, вы получите список. @JohnRotenstein спасибо за указание на меня

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