我按照第一步here来配置凭据和S3存储桶。然后,在我的代码中,我有:
func setupCredentialsProvider() {
let credentialsProvider = AWSCognitoCredentialsProvider(regionType:.USEast1, identityPoolId:identityPoolIdStr)
let configuration = AWSServiceConfiguration(region:.USEast1, credentialsProvider:credentialsProvider)
AWSServiceManager.defaultServiceManager().defaultServiceConfiguration = configuration
AWSServiceConfiguration(region: AWSRegionType.USEast1, credentialsProvider: credentialsProvider)
}
func listObjects() {
let s3 = AWSS3.defaultS3()
let listObjectsRequest = AWSS3ListObjectsRequest()
listObjectsRequest.bucket = S3BucketName
s3.listObjects(listObjectsRequest).continueWithBlock { (task) -> AnyObject! in
if let error = task.error {
print("listObjects failed: [\(error)]")
}
if let exception = task.exception {
print("listObjects failed: [\(exception)]")
}
}
当我运行应用程序并调用listObjects()
时,我收到此错误:
listObjects failed:[Error Domain = com.amazonaws.AWSServiceErrorDomain Code = 11“(null)”UserInfo = {HostId =,Message = Access Denied,Code = AccessDenied,RequestId =}]
我错过了什么?
答案 0 :(得分:0)
如果它与我遇到的问题类似,那么经过身份验证的Cognito用户无权访问特定的S3存储桶。阅读Understanding Amazon Cognito Authentication Part 3: Roles and Policies给了我所需的线索,特别是:
当您通过Cognito控制台创建身份池时,它将为您创建两个角色,一个用于经过身份验证的用户,另一个用于未经身份验证的用户,但您可以访问IAM控制台并创建更多角色而不仅仅是这些角色。您还可以修改现有角色,以根据您的使用情况添加对Amazon S3或Amazon DynamoDB等其他服务的支持。
所以我决定修改已认证用户的创建角色,以允许访问我的S3存储桶:
xxxx_auth_yyy
- auth
子字符串是其中的重要部分
将角色标识为经过身份验证的用户的角色。 示例政策(第3步):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::BUCKET_NAME*"
]
}
]
}