Разрешения AWS Cognito для доступа к S3 на Android - PullRequest
3 голосов
/ 21 мая 2019

Я занимаюсь разработкой приложения для Android и продолжаю испытывать проблемы с доступом к корзине S3 "через" Cognito.Мне удается соединиться с моим пулом Cognito, используя имя пользователя и пароль определенного пользователя из моего пула:

AWSMobileClient auth = AWSMobileClient.getInstance();
auth.signIn("username", "password", new HashMap<String, String>());
if (auth.isSignedIn()) {
        ActivityUtils.startActivity(this, MyActivity.class);
}

Мой пользователь в пуле назначен группе с ролью S3 присоединения:

Role ARN    arn:aws:iam::<my account number>:role/Cognito_S3_Full_Access

Который содержит эти разрешения:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": "*"
        }
    ]
}

Когда я пытаюсь использовать «AmazonS3Client», который я создал с использованием учетных данных из «AWSMobileClient», я получаю ошибки.Я создаю его следующим образом:

AWSMobileClient awsMobileClient =AWSMobileClient.getInstance();
AmazonS3Client s3Client = new AmazonS3Client(awsMobileClient);

И полученная ошибка :

2019-05-20 17:56:21.645 27019-27019/com.mycomp.mypackage E/S3Uploader: Error upload file to S3 bucket : Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 375C07384A904483)

Когда я создаю "AmazonS3Client", используя HARD-CODED accessKey и secretKey нового пользователя "IAM", которого я создал, и прикрепляют к нему ту же политику, что и выше, и работают как положено.Я использую это следующим образом:

BasicAWSCredentials credentials = new BasicAWSCredentials("myAccessKey_hsjgfhjsdg", "mySecretKey_asdhasjkdha");
AmazonS3Client s3Client = new AmazonS3Client(credentials);

Но я не хочу заполнять свое приложение жестко закодированным паролем, тем более, что мне уже удается подключиться, используя вводимые пользователем имя пользователя и пароль

  • Некоторые примечания: когда я пытаюсь получить секретный ключ и ключ доступа после входа в систему с помощью Cognito, я вижу, что при каждом входе в систему я получаю разные токены, поэтому я полагаю, что эта часть работает.

Итак, мой вопрос: что я делаю не так?

Как настроить AmazonS3Client на использование разрешения сеанса и роли пользователя, вошедшего в систему и назначенной ему группы?

1 Ответ

0 голосов
/ 03 июня 2019

У меня все настроено правильно, и я получаю то же самое Доступ запрещен (Сервис: Amazon S3; Код состояния: 403; Код ошибки: AccessDenied; Идентификатор запроса: 8D650E2CCCD58E34)

ЧтоЯ пропустил условие в шаблоне S3:

"Condition": {
    "StringLike": {
        "s3:prefix": [
            "public/",
            "public/*",
            "protected/",
            "protected/*",
            "private/${cognito-identity.amazonaws.com:sub}/",
            "private/${cognito-identity.amazonaws.com:sub}/*"
        ]
    }
}

В основном ваши ключи должны начинаться с этих префиксов, в зависимости от политики.Я не особо задумывался над примером public / s3Key.txt в документах Amplify.

private val transferUtility = TransferUtility.builder()
    .context(context)
    .s3Client(AmazonS3Client(AWSMobileClient.getInstance(), Region.getRegion(Regions.EU_WEST_1)))
    .awsConfiguration(AWSMobileClient.getInstance().configuration) // use the generated s3 template
    .build()

transferUtility.upload("public/$key/${file.name}", file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...