2016-11-27 6 views
1

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!

+1

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

+1

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

+0

@ Michael-sqlbot - Ich verwende einen Root-Zugangsschlüssel und nicht einen bestimmten IAM-Benutzer. – TGuimond

Antwort

0

Vielen Dank an @ Michael-sqlbot für das herauszufinden für mich.

Es stellte sich heraus, ich zwang die gesamte URL Kleinbuchstaben bei der Ausgabe der vorzeichneten URL auf der Seite, so dass AWS einen Zugriff verweigert Fehler aufgrund der Tatsache, dass die Ressource technisch nicht vorhanden war.

+1

Nun, technisch gesehen wurde der Zugriff verweigert Fehler durch S3 übersehen die Kleinbuchstaben 'x-amz- *' Query-String-Parameter, und zu dem Schluss, dass Sie tatsächlich keine Anmeldeinformationen, die es versuchen sollte zu validieren. Sie können dies im Wesentlichen beweisen, indem Sie * nur einen von ihnen in Kleinbuchstaben ändern. S3 wird sich plötzlich mit einer neuen Fehlermeldung beschweren, die Ihnen sagt, dass es fehlt.Ändern Sie sie alle auf "Niedrig", und diese Nachricht geht verloren, weil S3 davon ausgeht, dass es sich um eine anonyme Anfrage handelt, die keine Anmeldeinformationen enthält. –