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.
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. –
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