Быстрый доступ к iOS S3 запрещен при использовании конфигурации Mobile Hub

В настоящее время я использую Mobile Hub в своем приложении. Когда я попытался использовать S3 для загрузки фотографий в мое ведро, я дословно скопировал функцию из документации здесь для загрузки / выгрузки файлов: https://docs.aws.amazon.com/aws-mobile/latest/developerguide/add-aws-mobile-user-data-storage.html

Это мой код в Swift, пытающийся использовать S3TransferUtility:

func uploadData(data: Data, fileName: String) {

let expression = AWSS3TransferUtilityUploadExpression()
expression.progressBlock = {(task, progress) in
    DispatchQueue.main.async(execute: {
        // Do something e.g. Update a progress bar.
    })
}

var completionHandler: AWSS3TransferUtilityUploadCompletionHandlerBlock?
completionHandler = { (task, error) -> Void in
    DispatchQueue.main.async(execute: {
        // Do something e.g. Alert a user for transfer completion.
        // On failed uploads, `error` contains the error object.
    })
}

let transferUtility = AWSS3TransferUtility.default()

transferUtility.uploadData(data,
                           bucket: "my bucket name",
                           key: fileName,
                           contentType: "image/jpeg",
                           expression: expression,
                           completionHandler: completionHandler).continueWith {
                            (task) -> AnyObject? in
                            if let error = task.error {
                                print("Error: \(error.localizedDescription)")
                            }

                            if let res = task.result {
                                // Do something with uploadTask.
                                print(res)
                            }
                            return nil
}
}

Я получаю эту ошибку в консоли: Изображение ошибки в консоли

Я исследовал AWS S3 и предоставил файл awsconfiguration.json, и, похоже, все в порядке:

Консоль AWS IAM

Файл AWSConfiguration.json в моем проекте

Прямо сейчас я в замешательстве, потому что я думал, что Mobile Hub должен был позаботиться о конфигурации IAM и что не для всех.

Может кто-нибудь указать мне правильное направление, чтобы исправить это? Спасибо.

2 ответа

Решение

AWS Mobile Hub создает следующие папки в вашей корзине S3. Каждая папка имеет предварительно настроенные разрешения в IAM на основе статуса аутентификации Cognito пользователя вашего приложения.

  • общественного

    Любой аутентифицированный пользователь может читать или писать в эту папку

  • Частный

    Аутентифицированные пользователи могут только читать или писать из своей папки (например, private/{identityId})

  • защищенный

    Любой аутентифицированный пользователь может читать, но только владелец может писать в его папку (например, protected/{identityId})

  • Загрузки

    Любой аутентифицированный пользователь может писать, но только владелец может читать содержимое этой папки.

Этот предыдущий ответ также может быть полезен: как загрузить файл в защищенную корзину s3 из Swift, используя корзину s3, созданную мобильным концентратором AWS?

Хорошо, я столкнулся с той же ошибкой и продолжал думать, зачем мне делать ведро общедоступным, чтобы избавиться от этой ошибки. Потом я понял одну глупую ошибку, которую и сделал. Пока я добавлял это хранилище через Amplify CLI ($ampify add storage), есть опция, которая запрашивает "Auth users" или "Auth & Guest". После этого есть несколько вариантов, например

  1. Создать / обновить
  2. Читать
  3. удалять

Я выбрал только вариант 1, создать / обновить, предполагая, что все пользователи, которые могут создавать, по-прежнему смогут видеть. И это было ошибкой. Мне нужно было выбрать и вариант 1, и вариант 2. Какой сейчас имеет смысл.

Мне пришлось удалить свое хранилище и добавить обратно, чтобы отладить это. Затем он начал работать и для загрузки, и для загрузки. Пожалуйста, помните, что общедоступная защищенная папка также важна.

Надеюсь, это поможет кому-то, у кого такая же проблема.

Решение было связано с настройкой корзины, которую Mobile Hub выполняет автоматически, а также с кодом на внешнем интерфейсе.

Начиная с внешнего интерфейса, вам нужно вручную настроить свои учетные данные, например, так: // Настройка учетных данных let credentialsProvider = AWSMobileClient.sharedInstance(). GetCredentialsProvider()

//Setup the service configuration
let configuration = AWSServiceConfiguration(region: .USEast1, credentialsProvider: credentialsProvider)

//Setup the transfer utility configuration
let tuConf = AWSS3TransferUtilityConfiguration()
tuConf.isAccelerateModeEnabled = false


//Register a transfer utility object
AWSS3TransferUtility.register(
    with: configuration!,
    transferUtilityConfiguration: tuConf,
    forKey: "transfer-utility-with-advanced-options"
)


//Look up the transfer utility object from the registry to use for your transfers.
let transferUtility = AWSS3TransferUtility.s3TransferUtility(forKey: "transfer-utility-with-advanced-options")

Тип контента также должен быть image/png.

Наконец, при использовании мобильного концентратора в вашем ведре создаются четыре исходные папки. Вы должны указать, в какую папку вы хотите, чтобы ваш контент был загружен. Пока что я смог загрузить только публику. Вы можете указать это в параметре "ключ" в функции uploadData.

Во время прохождения корзины в личных и защищенных папках был файл readme, в котором говорилось: "Папки будут создаваться для каждого пользователя в этом каталоге. Пользователи мобильных приложений могут загружать, загружать и перечислять файлы только в своей собственной подпапке". но папки пусты, и я понятия не имею, как использовать эти папки. Может ли кто-нибудь помочь мне с этим? Спасибо

Другие вопросы по тегам