2

我試圖從一個特定於該用戶的文件夾中使用Transfer將文件從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來查看請求/響應。

如果我在最後的陳述S3GetObjects631d121f-b294-4318-b3cd-36b3b74ebdff取代${cognito-identity.amazonaws.com:sub}得到arn:aws:s3:::sidestreamx/631d121f-b294-4318-b3cd-36b3b74ebdff/*確實工作。第一條語句可以繼續保留策略變量,它仍然可以工作。如果我完全刪除第一個語句,它會起作用!當我將策略變量添加到開始崩潰的最後一條語句時。

我檢查了這個Stack Overflow問題和this one,無濟於事。所以是的,我不知道。我已經在這裏工作了近9個多小時,所以任何幫助都會真誠地被讚賞。

回答

2

問題解決了。事實證明,${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僅供參考格式)創建的文件夾,和它的工作。

+1

對不起,我感到困惑。是的,儘管公認的混淆術語重疊,但策略變量指向Cognito聯合身份的身份標識,而不是用戶池字段。 –

+0

謝謝!這花了半天的時間才意識到'sub'與我的cognito用戶屬性中的'sub'不匹配。在GitHub的一個帖子中,這是一個帖子的對立面。 – PeterB