2

転送を使用して、ユーザーに固有のフォルダからAWS S3からiOSモバイルアプリにファイルをダウンロードしようとしていますManagerは、そのよう:

@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 User Pool & Cognito Federated Identitiesで認証されます。デバッグしてJWTトークンを抽出し、sub = "631d121f-b294-4318-b3cd-36b3b74ebdff"を確認しました。私も、要求/応答を見るためにCharlesを使用しました。私はarn:aws:s3:::sidestreamx/631d121f-b294-4318-b3cd-36b3b74ebdff/*を取得するために631d121f-b294-4318-b3cd-36b3b74ebdffで最後の文S3GetObjects${cognito-identity.amazonaws.com:sub}を交換あれば

は動作しません。最初のステートメントは引き続きポリシー変数を持つことができ、それでも動作します。私は最初のステートメントを完全に削除すればうまくいくでしょう!それは、ポリシー変数を最後のステートメントに追加するときです。

私はこの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 
    }) 

私は手動で(FYI us-east-1:XXXXXXXXXXXXXXXXXXの形式である)task.result!に等しい名前と私のバケツにフォルダを作って、それが働きました。

+1

混乱して申し訳ありません。はい、ポリシー変数は、Cognito Federated IdentityのアイデンティティIDを参照します。ユーザープールのフィールドではなく、間違った用語が重複しています。 –

+0

ありがとうございました!それは私のCognitoユーザーの属性の 'サブ'と一致しなかった 'サブ'を認識するのに半日かかりました。そして、GitHubの問題の1つの記事の反対だった。 – PeterB

関連する問題