Ich erstelle eine Pre-Signed-URL, um Benutzern das Herunterladen von Dateien aus einem S3-Bucket zu ermöglichen. Ich erzeuge die URL über das PHP SDK mit dem folgenden Code:Zugriff verweigert - S3-Ressource mit Pre-Signed-URL - PHP SDK
public static function get_content_link($bucket, $key) {
//check response code from AWS
require_once 'aws/aws-autoloader.php';
$s3 = new Aws\S3\S3Client([
'version' => 'latest',
'region' => 'eu-west-1',
'credentials' => [
'key' => 'MY-KEY',
'secret' => 'MY-SECRET',
],
]);
$cmd = $s3->getCommand('GetObject', [
'Bucket' => $bucket,
'Key' => $key
]);
$request = $s3->createPresignedRequest($cmd, '+500 minutes');
// Get the actual presigned-url
$presignedUrl = (string) $request->getUri();
return $presignedUrl;
}
die URLs wie erwartet zurückgegeben werden, zum Beispiel:
https://s3-eu-west-1.amazonaws.com/MY-BUCKET-NAME/product/3166_1480009917388.mov?x-amz-content-sha256=unsigned-payload&x-amz-algorithm=aws4-hmac-sha256&x-amz-credential=akiaiqrmkn276hcpjkaq%2f20161127%2feu-west-1%2fs3%2faws4_request&x-amz-date=20161127t145603z&x-amz-signedheaders=host&x-amz-expires=30000&x-amz-signature=98eaef504f053ca56908ac49c6539c4a8b8e250d7d3a4a12460f4a806ec41c19
Wenn ich versuche, eine der zurück Links zu öffnen, in der Browser ich einen Zugriff verweigern Fehler von S3 bin immer:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>A37839BB23186F72</RequestId>
<HostId>
yvKTN+CN1TTNk2tqoxxm3MPOGTUSMaRYtbbEFeCzGP7ou5IYf37Z9uBESwUQWDIUR1GUuPbZyuM=
</HostId>
</Error>
die Dateien, die ich Zugang bieten will in einem Eimer ist die Ordner den Zugangs der Öffentlichkeit, durch den Ordner enthält ich versuche, Zugriff ist privat (genannt/Produkt /). Unsere Eimer Politik sieht wie folgt aus:
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "AllowPublicReadProxies",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::MY-BUCKET-NAME/proxies*"
},
{
"Sid": "AllowPublicReadThumbs",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::MY-BUCKET-NAME/thumbs*"
}
]
}
Es ist mein Verständnis, dass der Zweck eine Pre Unterzeichnung URL zu erstellen ist nicht authentifizierten Benutzern temporären Zugriff auf geschützte Dateien zu ermöglichen, ohne dass die Eimer oder Ordnerberechtigungen zu ändern.
Hat jemand irgendwelche Ideen, was ich verpasst oder falsch gemacht habe?
Danke!
Wo haben Sie dem IAM-Benutzer, der mit dieser AWS-Zugriffsschlüssel-ID verknüpft ist, die erforderliche Berechtigung zum Ausführen von 's3: GetObject' erteilt? –
Können Sie versuchen, die vorzeichenbehaftete URL mithilfe der [AWS Command-Line Interface (CLI)] (http://aws.amazon.com/cli/) zu generieren, um zu bestätigen, dass die Berechtigungen funktionieren? Der zu verwendende Befehl ist ['aws s3 presign '] (http://docs.aws.amazon.com/cli/latest/reference/s3/presign.html). Vergleichen Sie dann die URLs, um sicherzustellen, dass alle Elemente übereinstimmen (die Werte sind jedoch unterschiedlich). Ihre Verfallszeit scheint in der von Ihnen angegebenen URL falsch zu sein. Die vorzeichenbehaftete URL ist nicht auf Bucket-Richtlinien angewiesen - es ist eine alternative Möglichkeit, Zugriff bereitzustellen. –
@ Michael-sqlbot - Ich verwende einen Root-Zugangsschlüssel und nicht einen bestimmten IAM-Benutzer. – TGuimond