swift iOS 使用 Mobile Hub 配置时 S3 访问被拒绝

swift iOS S3 access denied while using Mobile Hub configuration

我目前正在我的应用程序中使用 Mobile Hub。当我尝试使用 S3 将照片上传到我的存储桶时,我将函数从此处的文档逐字复制到 download/upload 文件: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
}
}

我在控制台中收到此错误: Image of Error in Console

我调查了 AWS S3 和提供的 awsconfiguration.json 文件,一切似乎都井井有条:

AWS IAM Console

AWSConfiguration.json file in my project

现在我很困惑,因为我认为 Mobile Hub 应该负责 IAM 配置,而不是处理所有事情。

有人可以指出正确的方向来解决这个问题吗?谢谢。

解决方案与 Mobile Hub 自动执行的存储桶设置以及前端的一些代码有关。

从前端开始,您需要像这样手动配置您的凭据: //设置凭据 让 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。

最后,使用移动中心时,会在您的存储桶内创建四个初始文件夹。您必须指定要将内容上传到哪个文件夹。到目前为止,我只能上传到 public。您可以在函数 uploadData 的 "key" 参数下指定它。

在浏览存储桶时,在私有和受保护的文件夹中有一个自述文件说 "Folders will be generated for each user in this directory. Mobile App users can upload, download and list files only in their own sub-folder.",但是文件夹是空的,我不知道如何使用这些文件夹。有人可以帮我吗?谢谢

AWS Mobile Hub 在您的 S3 存储桶中创建以下文件夹。根据应用程序用户的 Cognito 身份验证状态,每个文件夹在 IAM 中都有预配置的权限。

  • Public

    任何经过身份验证的用户都可以读取或写入此文件夹

  • 私人

    经过身份验证的用户只能从他们的文件夹中读取或写入(例如 private/{identityId})

  • 受保护

    任何经过身份验证的用户都可以读取,但只有所有者可以写入他们的文件夹(例如 protected/{identityId})

  • 上传

    任何经过身份验证的用户都可以写入,但只有所有者可以读取此文件夹中的内容

之前的回答可能也有帮助:How do I upload a file into a protected s3 bucket from Swift using the s3 bucket created by AWS mobile hub?

好吧,我遇到了同样的错误并且一直在想为什么我应该制作桶 public 来摆脱这个错误。然后我意识到我犯了一个愚蠢的错误。当我通过 Amplify CLI ($amplify add storage) 添加此存储时,有一个选项要求 "Auth users" 或 "Auth & Guest"。之后有一些选择,例如

  1. Create/Update
  2. 阅读
  3. 删除

我只选择了选项 1,create/update 假设所有可以创建的用户仍然可以看到。那是错误的。我需要 select 选项 1 和 2。哪种现在有意义。

我不得不删除我的存储并重新添加以进行调试。然后它也开始用于下载和上传。请记住 public,受保护的文件夹也很重要。

希望这对遇到同样问题的人有所帮助。