Быстрый доступ к 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, и, похоже, все в порядке:
Файл 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, создать / обновить, предполагая, что все пользователи, которые могут создавать, по-прежнему смогут видеть. И это было ошибкой. Мне нужно было выбрать и вариант 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, в котором говорилось: "Папки будут создаваться для каждого пользователя в этом каталоге. Пользователи мобильных приложений могут загружать, загружать и перечислять файлы только в своей собственной подпапке". но папки пусты, и я понятия не имею, как использовать эти папки. Может ли кто-нибудь помочь мне с этим? Спасибо