【问题标题】:AWS S3 Transfer Manager ${cognito-identity.amazonaws.com:sub} Policy Variable Access DeniedAWS S3 Transfer Manager ${cognito-identity.amazonaws.com:sub} 策略变量访问被拒绝
【发布时间】:2017-07-25 03:07:25
【问题描述】:

我正在尝试使用 Transfer Manager 从特定于用户的文件夹将文件从 AWS S3 下载到我的 iOS 移动应用程序,如下所示:

@IBAction func download() {
    let transferManager = AWSS3TransferManager.default()!
    let downloadingFileURL = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent("disney1.jpg")
    let downloadRequest = AWSS3TransferManagerDownloadRequest()!
    downloadRequest.bucket = "sidestreamx"
    // user's UUID/disney1
    downloadRequest.key = "631d121f-b294-4318-b3cd-36b3b74ebdff/disney1"
    downloadRequest.downloadingFileURL = downloadingFileURL

    transferManager.download(downloadRequest).continue(with: AWSExecutor.mainThread(), with: {
        (task: AWSTask<AnyObject>) -> Any? in
        if let error = task.error as? NSError {
            // handle error
            return nil
        }
        self.imageView.image = UIImage(contentsOfFile: downloadingFileURL.path)
        return nil
    })
}

我的 IAM 角色权限策略如下,来自this AWS doc:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "GetBucketListIfRequestIsForUser",
            "Action": [
                "s3:ListBucket"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::sidestreamx"
            ],
            "Condition": {
                "StringLike": {
                    "s3:prefix": [
                        "${cognito-identity.amazonaws.com:sub}/*"
                    ]
                }
            }
        },
        {
            "Sid": "S3GetObjects",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Effect": "Allow",
            "Resource": [
                "arn:aws:s3:::sidestreamx/${cognito-identity.amazonaws.com:sub}/*"
            ]
        }
    ]
}

我得到的回应是

<?xml version="1.0" encoding="UTF-8"?>
<Error><Code>AccessDenied</Code>
   <Message>Access Denied</Message>    
   <RequestId>E1F205B58EF4A670</RequestId>
   <HostId>dUWI8PfVZL3mJmykjhXRqvFd1yt/CqDFNlwgwD3kmLk2vrMBP6JvVgezMYSROt3KyE3dx0+3eDE=</HostId>
</Error>

用户通过 AWS Cognito 用户池和 Cognito 联合身份进行身份验证。我已经调试并提取了 JWT 令牌,并看到了 sub = "631d121f-b294-4318-b3cd-36b3b74ebdff".我什至使用Charles 来查看请求/响应。

如果我用631d121f-b294-4318-b3cd-36b3b74ebdff 替换最后一条语句S3GetObjects 中的${cognito-identity.amazonaws.com:sub} 来获得arn:aws:s3:::sidestreamx/631d121f-b294-4318-b3cd-36b3b74ebdff/*,它确实有效。第一条语句可以继续使用策略变量,它仍然可以工作。如果我完全删除第一个语句,它会起作用!当我将策略变量添加到它开始崩溃的最后一个语句时。

我已经检查了这个Stack Overflow 问题和this one,但无济于事。所以是的,我不知道。我已经在这工作了将近 9 个工时,因此我们真诚地感谢任何帮助。

【问题讨论】:

    标签: swift amazon-web-services amazon-s3 amazon-cognito amazon-iam


    【解决方案1】:

    问题解决了。事实证明,${cognito-identity.amazonaws.com:sub} 并没有真正引用 JWT 令牌中的 sub。它指的是来自 credentialsProvider 的 IdentityID:

        (AWSServiceManager.default().defaultServiceConfiguration.credentialsProvider
            as! AWSCognitoCredentialsProvider).getIdentityId()
            .continue({task -> Any? in
            print("Credentials ID is \(task.result!)")
            return nil
        })
    

    我在我的存储桶中手动创建了一个名称等于task.result!(格式为us-east-1:XXXXXXXXXXXXXXXXXX fyi)的文件夹,并且它有效。

    【讨论】:

    • 很抱歉给您带来了困惑。是的,策略变量指的是 Cognito Federated Identity 的身份 id,而不是用户池字段,尽管公认的术语重叠令人困惑。
    • 谢谢!花了半天时间才意识到“子”与我的认知用户属性中的“子”不匹配。与 GitHub 问题中的一篇文章相反。
    • 两年后,几乎完全一样。花了我一天中最好的时间撞到墙上,你的帖子终于解决了这个问题!
    猜你喜欢
    • 2018-01-10
    • 2019-04-28
    • 2018-09-07
    • 1970-01-01
    • 2021-03-28
    • 2021-09-03
    • 2020-09-30
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多