2

Ich versuche, eine Datei von AWS S3 auf meine iOS-Mobilanwendung mithilfe von Transfer von einem benutzerspezifischen Ordner herunterzuladen Manager, etwa so:

{ 
    "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}/*" 
      ] 
     } 
    ] 
} 

Antwort, die ich erhalten

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

@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 
    }) 
} 

Meine IAM Rolle Berechtigungsrichtlinie wird die folgende, von this AWS doc bekommen

Der Benutzer wird über den AWS Cognito-Benutzerpool & Cognito Federated Identities authentifiziert. Ich habe den JWT-Token debuggt und extrahiert und gesehen, dass der sub = "631d121f-b294-4318-b3cd-36b3b74ebdff". Ich habe sogar Charles verwendet, um die Anfrage/Antwort zu sehen.

Es funktioniert, wenn ich ${cognito-identity.amazonaws.com:sub} in der letzten Anweisung S3GetObjects mit 631d121f-b294-4318-b3cd-36b3b74ebdff ersetzen arn:aws:s3:::sidestreamx/631d121f-b294-4318-b3cd-36b3b74ebdff/* zu bekommen. Die erste Anweisung kann weiterhin die Richtlinienvariable haben und funktioniert weiterhin. Es wird funktionieren, wenn ich die erste Anweisung vollständig entferne! Es ist, wenn ich die Richtlinienvariable der letzten Anweisung hinzufüge, wo sie zusammenbricht.

Ich habe diese Stack Overflow Frage ausgecheckt und this one, vergeblich. Also ja, ich weiß es nicht. Ich bin seit fast 9 Mannstunden hier, also würde jede Hilfe aufrichtig geschätzt werden.

Antwort

2

Problem gelöst. Stellt sich heraus, ${cognito-identity.amazonaws.com:sub} bezieht sich nicht wirklich auf die sub in der JWT-Token. Er bezieht sich vom credentialsProvider IdentityID:

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

ich manuell einen Ordner in meinem Eimer mit dem Namen gleich task.result! (die im Format von us-east-1:XXXXXXXXXXXXXXXXXX FYI ist) gemacht, und es funktionierte.

+1

Entschuldigung für die Verwirrung. Ja, die Richtlinienvariablen beziehen sich trotz der zugegebenermaßen verwirrenden Terminologieüberlappung auf die Identitäts-ID der Cognito Federated Identity, nicht auf ein Benutzerpool-Feld. –

+0

Vielen Dank! Das dauerte einen halben Tag, um zu erkennen, dass das 'Sub' in den Attributen meines Cognito-Benutzers nicht mit dem 'Sub' übereinstimmte. Und war das Gegenteil von einem Beitrag in den GitHub-Ausgaben. – PeterB

Verwandte Themen