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"。之后有一些选择,例如
- Create/Update
- 阅读
- 删除
我只选择了选项 1,create/update 假设所有可以创建的用户仍然可以看到。那是错误的。我需要 select 选项 1 和 2。哪种现在有意义。
我不得不删除我的存储并重新添加以进行调试。然后它也开始用于下载和上传。请记住 public,受保护的文件夹也很重要。
希望这对遇到同样问题的人有所帮助。
我目前正在我的应用程序中使用 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"。之后有一些选择,例如
- Create/Update
- 阅读
- 删除
我只选择了选项 1,create/update 假设所有可以创建的用户仍然可以看到。那是错误的。我需要 select 选项 1 和 2。哪种现在有意义。
我不得不删除我的存储并重新添加以进行调试。然后它也开始用于下载和上传。请记住 public,受保护的文件夹也很重要。
希望这对遇到同样问题的人有所帮助。