Спасибо! Потребовалось полдня, чтобы понять, что «sub» не соответствует «sub» в атрибутах моего пользователя Cognito. И был противоположностью одному посту в проблемах GitHub.

аюсь загрузить файл из AWS S3 в мое мобильное приложение iOS из папки, специфичной для пользователя, с помощью Transfer Manager, например так:

@IBAction func download() {
    let transferManager = AWSS3TransferManager.default()!
    let downloadingFileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("disney1.jpg")
    let downloadRequest = AWSS3TransferManagerDownloadRequest()!
    downloadRequest.bucket = "sidestreamx"
    // user's UUID/disney1
    downloadRequest.key = "631d121f-b294-4318-b3cd-36b3b74ebdff/disney1"
    downloadRequest.downloadingFileURL = downloadingFileURL

    transferManager.download(downloadRequest).continue(with: AWSExecutor.mainThread(), with: {
        (task: AWSTask<AnyObject>) -> Any? in
        if let error = task.error as? NSError {
            // handle error
            return nil
        }
        self.imageView.image = UIImage(contentsOfFile: downloadingFileURL.path)
        return nil
    })
}

Моя политика разрешений роли IAM следующая, полученная отэтот документ AWS:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetBucketListIfRequestIsForUser",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::sidestreamx"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "${cognito-identity.amazonaws.com:sub}/*"
                    ]
                }
            }
        },
        {
            "Sid": "S3GetObjects",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::sidestreamx/${cognito-identity.amazonaws.com:sub}/*"
            ]
        }
    ]
}

Ответ я получаю

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code>
   <Message>Access Denied</Message>    
   <RequestId>E1F205B58EF4A670</RequestId>
   <HostId>dUWI8PfVZL3mJmykjhXRqvFd1yt/CqDFNlwgwD3kmLk2vrMBP6JvVgezMYSROt3KyE3dx0+3eDE=</HostId>
</Error>

Проверка подлинности пользователя осуществляется с помощью AWS Cognito User Pool и федеративных идентификаторов Cognito. Я отладил и извлек токен JWT и увидел, чтоsub = "631d121f-b294-4318-b3cd-36b3b74ebdff", Я даже использовалЧарльз чтобы увидеть запрос / ответ.

Этоработает, если Я заменяю${cognito-identity.amazonaws.com:sub} в последнем утвержденииS3GetObjects с631d121f-b294-4318-b3cd-36b3b74ebdff получитьarn:aws:s3:::sidestreamx/631d121f-b294-4318-b3cd-36b3b74ebdff/*, Первый оператор может продолжать иметь переменную политики, и он все еще будет работать. Это сработает, если я вообще уберу первое утверждение! Это когда я добавляю переменную политики к последнему утверждению, где она начинает разбиваться.

Я проверил этоПереполнение стека вопрос иэтот, но безрезультатно. Так что да, я не знаю. Я занимаюсь этим более 9 человеко-часов, поэтому любая помощь будет искренне оценена.

Ответы на вопрос(1)

Ваш ответ на вопрос