Ich möchte eine so genannte "vor-signierte" URL zum Hochladen eines bestimmten Objekts (PUT) in Amazon S3 Bucket erstellen.
So weit, so gut. Ich benutze die Python-Bibliothek boto , um eine URL, die alle notwendigen Dinge enthält (Ablauf, Unterschrift usw.). Die URL sieht folgendermaßen aus:
https://<bucketname>.s3.amazonaws.com/<key>?Signature=<sig>&Expires=<expires>&AWSAccessKeyId=<my key id>&x-amz-acl=public-read
Beachten Sie den letzten Parameter.
Dies beschränkt zumindest, wie ich es verstehe, jeden, der diese URL verwendet, um ein Objekt auf einen bestimmten Schlüssel in einem bestimmten Bucket hochzuladen, und begrenzt auch die vordefinierte ACL für das Objekt auf "public-read".
Meine letzte Aussage ist jedoch ziemlich falsch.
Wenn Sie diese URL verwenden, können Sie Folgendes mit der Kopfzeile x-amz-acl durchführen (im Gegensatz zum Abfragezeichenfolgenparameter ) mit dem gleichen Namen, den Sie setzen müssen , damit die Signaturprüfung erfolgreich ist):
So scheint es, dass
x-amz-acl=public-read
angeben, können Sie den x-amz-acl
-Kopf auf authenticated-read
setzen und anstelle eines öffentlich lesbaren Objekts ein Objekt abrufen, das nur von authentifizierten Benutzern gelesen werden kann. Was ist die echte Beziehung zwischen dem x-amz-acl QS Parameter und dem Header, der den gleichen Namen hat? Gibt es eine Möglichkeit, Berechtigungen für das Objekt zu beschränken, das über eine PUT
-Anfrage auf eine so genannte "vor-signierte" URL hochgeladen werden soll?
Wie ich es verstehe (und ich könnte mich hier irren), hat der Header x-amz-acl
Vorrang vor dem Querystring-Argument - und sie erfüllen den gleichen Zweck. Der Grund, dass nur der Querystring-Parameter bei der Signaturprüfung berücksichtigt wird, liegt einfach an der Tatsache, dass Header nicht Teil der Signaturprüfung für die Richtlinie sind.
Diese Seite könnte Ihnen helfen; Es hat mir beim Erstellen von Formularen, die direkt in S3 hochgeladen werden können, sehr geholfen.
Anscheinend verwenden Sie den falschen Namen für den Parameter acl. Versuchen Sie gemäß der Anleitung zum Signieren von Anfragen, acl:
zu verwendenREST-Anforderungen signieren und authentifizieren
Wenn die Anfrage eine Unterressource adressiert, wie? Versionsverwaltung,? location,? acl,? torrent,? lifecycle oder? versionid hängt die Unterressource an, ihren Wert, wenn es einen hat, und das Fragezeichen. Beachten Sie, dass die Unterressourcen bei mehreren Unterressourcen lexikographisch nach Unterressourcenamen sortiert und durch "& amp;" getrennt sein müssen. z.B. ? acl & amp; versionId = Wert.
Die Liste der Unterressourcen, die bei der Erstellung des CanonicalizedResource-Elements enthalten sein müssen: acl, lifecycle, location, logging, notification, partNumber, policy, requestPayment, torrent, uploadId, uploads, versionId, Versionierung, Versionen und Website.
Tags und Links python amazon-s3 amazon-web-services boto