Jeton aws s3
Authentification des demandes REST
Chaque demande non anonyme adressée à S3 doit contenir des informations d’authentification permettant d’établir l’identité du mandataire à l’origine de la demande. Dans REST, cela se fait en plaçant d’abord les en-têtes dans un format canonique, puis en signant les en-têtes à l’aide de votre clé d’accès secrète AWS.
Il y a deux façons d’envoyer votre signature avec une demande. La première consiste à mettre votre ID de clé d’accès AWS et la signature que vous avez calculée dans l’en-tête d’autorisation :
Exemple
« Authorization : AWS : AWS " + AWSAccessKeyId + « : » + base64(hmac-sha1(VERB + « \n » + CONTENT-MD5 + « \n » + CONTENT-TYPE + « \n » + DATE + « \n » + CanonicalizedAmzHeaders + « \n » + CanonicalizedResource))Vous pouvez également envoyer une signature en tant que paramètre de chaîne de requête encodé en URL dans l’URL de la demande. Ceci est utile si vous souhaitez activer un troisième pour accéder à S3 en votre nom sans que vous ayez à proxy pour le transfert de données. Par exemple, si vous souhaitez permettre à un utilisateur de télécharger vos données privées directement à partir de S3, vous pouvez insérer une URL pré-signée dans une page Web avant de la donner à votre utilisateur. La chaîne canonisée que vous signez est la même, sauf que vous remplacez le champ DATE dans la chaîne par un champ Expires qui indique quand vous souhaitez que la signature expire. Le champ Expires est indiqué sous la forme du nombre de secondes écoulées depuis l’heure de l’époque et est également inclus en tant que paramètre de chaîne de requête avec votre ID de clé d’accès AWS :
Exemple
GET /my-bucket/foo ? signature=<urlencode(base64(hmac-sha1(VERB + « \n » + CONTENT-MD5 + « \n » + CONTENT-TYPE + « \n » + expire + « \n » + canonicalizedAmzHeaders + « \n » + canonicalizedResource)))> &expires=<secondes depuis epoch> &AWSAccessKeyId=<aws-id>Canonicalisation pour Lors de
l’authentification via l’en-tête Authorization, vous créez la chaîne à signer en concaténant le verbe de demande avec les en-têtes canonisés et la ressource ciblée par la demande.
Les en-têtes utilisés pour la signature de la demande sont : content-md5, content-type, date et tout ce qui commence par x-amz-. La chaîne à signer est formée en ajoutant le verbe REST, la valeur content-md5, la valeur content-type, la valeur date, les en-têtes x-amz canonisés (voir recette ci-dessous) et la ressource ; tous séparés par des sauts de ligne. (Si vous ne pouvez pas définir l’en-tête Date, utilisez l’en-tête x-amz-date comme décrit ci-dessous.)
La ressource est le compartiment et la clé (le cas échéant), séparés par un « / ». Si la demande que vous signez concerne une liste de contrôle d’accès ou un fichier torrent, vous devez inclure ?acl ou ?torrent dans la partie ressource de la chaîne canonique. Aucun autre paramètre de chaîne de requête ne doit être inclus, cependant.
Canonisation de l’authentification de la chaîne de requête
Lors de l’authentification via les paramètres de chaîne de requête, vous créez la chaîne à signer en concaténant le verbe de la demande avec les en-têtes canonisés et la ressource ciblée par la demande.
Les en-têtes utilisés pour la signature de la demande sont les mêmes que ceux utilisés pour l’authentification de l’en-tête d’autorisation, sauf que le champ Date est remplacé par le paramètre Expires. Le paramètre Expires est l’heure à laquelle vous souhaitez que la signature expire, spécifiée comme le nombre de secondes depuis l’heure de l’époque.
Ainsi, la chaîne à signer est formée en ajoutant le verbe REST, la valeur content-md5, la valeur content-type, la valeur du paramètre expires, les en-têtes x-amz canonisés (voir la recette ci-dessous) et la ressource, le tout séparé par des sauts de ligne.
La ressource est la même que celle de l’authentification de l’en-tête d’autorisation : le bucket et la clé (le cas échéant), séparés par un '/'. Si la demande que vous signez concerne une liste de contrôle d’accès ou un fichier torrent, vous devez inclure ?acl ou ?torrent dans la partie ressource de la chaîne canonique. Cependant, aucun autre paramètre de chaîne de requête ne doit être inclus.
Lesen-têtes x-amz sont canonisés par :
-
Nom d’en-tête
en -
minuscules En-têtes triés par nom d’en-tête
-
Les valeurs des en-têtes dont les noms apparaissent plus d’une fois doivent être coupées d’espaces blancs et concaténées avec des séparateurs de virgules pour être conformes à la section 4.2 de la RFC 2616.
-
Supprimer les espaces autour des deux-points dans l’en-tête
-
Supprimer les sauts de ligne ('\n') dans les lignes de continuation
-
Séparer les en-têtes par des sauts de ligne ('\n')
Quelques points importants :
-
La chaîne à signe (verbe, en-têtes, ressource) doit être encodé en UTF-8.
-
Les valeurs content-type et content-md5 sont facultatives, mais si vous ne les incluez pas, vous devez toujours insérer un saut de ligne à l’endroit où ces valeurs seraient normalement insérées.
-
Certaines boîtes à outils peuvent insérer des en-têtes que vous ne connaissez pas auparavant, tels que l’ajout de l’en-tête « Content-Type » lors d’un PUT. Dans la plupart de ces cas, la valeur de l’en-tête inséré reste constante, ce qui vous permet de découvrir les en-têtes manquants à l’aide d’outils tels que Ethereal ou tcpmon.
-
Certaines boîtes à outils rendent difficile la définition manuelle de la date. Si vous rencontrez des difficultés pour inclure la valeur de l’en-tête 'Date' dans les en-têtes canonisés, vous pouvez inclure un en-tête 'x-amz-date' avant la canonisation. La valeur de l’en-tête x-amz-date doit être dans l’un des formats RFC 2616 (http://www.ietf.org/rfc/rfc2616.txt). Si S3 voit un en-tête x-amz-date dans la demande, il ignorera l’en-tête Date lors de la validation de la signature de la demande. Si vous incluez l’en-tête x-amz-date, vous devez toujours inclure un caractère de nouvelle ligne dans la chaîne canonisée à l’endroit où la valeur Date serait normalement insérée.
-
La valeur de l’en-tête Date ou, le cas échéant, x-amz-date doit spécifier une heure qui ne s’éloigne pas de plus de 15 minutes de l’horloge du serveur Web S3.
-
La fonction de hachage pour calculer la signature est HMAC-SHA1 définie dans la RFC 2104 (http://www.ietf.org/rfc/rfc2104.txt), en utilisant votre clé d’accès secrète comme clé.
Authentification REST : Exemple 1
Exemple
Par exemple, imaginez que vous souhaitiez signer la requête suivante :
PUT /quotes/nelson HTTP/1.0 Content-Md5 : c8fdb181845a4ca6b8fec737b3581d76 Content-Type : text/html Date : Jeu, 17 Nov 2005 18:49:58 GMT X-Amz-Meta-Author : [email protected] X-Amz-Magic : abracadabraLa chaîne canonique à signer est la suivante :
PUT\nc8fdb181845a4ca6b8fec737b3581d76\ntext/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-amz-magic :abracadabra\nx-amz-meta-author:[email protected]\n/quotes/nelsonSupposons que l’ID de votre clé d’accès AWS soit « 44CF9590006BF252F707 » et que votre clé d’accès secrète AWS soit « OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV ». Ensuite, vous pouvez calculer la signature comme suit :
import base64 import hmac import sha h = hmac.new(« OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV », « PUT\nc8fdb181845a4ca6b8fec737b3581d76\ntext/html\nThu, 17 Nov 2005 18:49:58 GMT\nx-amz-magic :abracadabra\nx-amz-meta-author:[email protected]\n/quotes/nelson », sha) base64.encodestring(h.digest()).strip()La signature résultante serait « jZNOcbfWmD/A/f3hSvVzXZjM2HU= », et vous ajouteriez l’en-tête Authorization à votre demande pour obtenir le résultat suivant :
PUT /quotes/nelson HTTP/1.0 Autorisation : AWS 44CF9590006BF252F707 :jZNOcbfWmD/A/f3hSvVzXZjM2HU= Content-Md5 : c8fdb181845a4ca6b8fec737b3581d76 Content-Type : text/html Date : Thu, 17 Nov 2005 18:49:58 GMT X-Amz-Meta-Author : [email protected] X-Amz-Magic : abracadabraREST Authentification : Exemple 2
Exemple
Imaginez que vous ne pouvez pas définir l’en-tête Date et que vous ne savez pas quelle valeur votre boîte à outils attribuera à cet en-tête. Ensuite, vous devez inclure l’en-tête x-amz-date dans votre requête :
GET /quotes/nelson HTTP/1.0 Date : XXXXXXXXX X-Amz-Magic : abracadabra X-Amz-Date : Thu, 17 Nov 2005 18:49:58 GMTLa chaîne canonique à signer est (notez les sauts de ligne inclus même s’il n’y a pas d’en-tête Content-Md5 ou Content-Type dans la demande) :
GET\n\n\n\nx-amz-date :Thu, 17 nov. 2005 18:49:58 GMT\nx-amz-magic :abracadabra\n/quotes/nelsonSupposons que l’ID de votre clé d’accès AWS soit « 44CF9590006BF252F707 » et votre clé d’accès secrète AWS est « OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV ». Ensuite, vous pouvez calculer la signature comme suit :
import base64 import hmac import sha h = hmac.new(« OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV », « GET\n\n\n\nx-amz-date :Thu, 17 Nov 2005 18:49:58 GMT\nx-amz-magic :abracadabra\n/quotes/nelson », sha) base64.encodestring(h.digest()).strip()La signature résultante serait « 5m+HAmc5JsrgyDelh9+a2dNrzN8= », et, vous ajouteriez l’en-tête Authorization à votre demande pour obtenir le résultat suivant :
GET /quotes/nelson HTTP/1.0 Autorisation : AWS 44CF9590006BF252F707:5m+HAmc5JsrgyDelh9+a2dNrzN8= Date : XXXXXXXXX X-Amz-Magic : abracadabra X-Amz-Date : Thu, 17 Nov 2005 18:49:58 GMTAuthentification REST Exemple 3 : Exemple d’authentification de chaîne de requête
Supposons que vous souhaitiez permettre à quelqu’un d’autre d’accéder http://s3.amazonaws.com/quotes/nelson via un navigateur web. Les URL d’authentification de chaîne de requête ont toutes un paramètre Expires qui spécifie jusqu’à quand l’URL est toujours valide. La valeur de ce paramètre est exprimée en secondes depuis l’époque. Sous Unix, vous pouvez exécuter la commande « date +%s », ou en java, vous pouvez diviser le résultat de System.currentTimeMillis() par 1000. Par conséquent, s’il est 1141889060 en ce moment et que vous souhaitez que l’URL soit valide pendant 60 secondes, votre paramètre Expires sera 1141889120. Cette valeur sera utilisée à la place de l’en-tête Date lors du calcul de la chaîne canonique.
La chaîne canonique à signer est :
GET\n\n\n1141889120\n/quotes/nelsonVous savez que lorsque le navigateur effectue la requête GET, il ne fournit pas de hader Content-Md5 ou Content-Type, ni ne définit d’en-têtes x-amz-, de sorte que ces parties restent toutes vides.
Supposons que votre ID de clé d’accès AWS soit « 44CF9590006BF252F707 » et que votre clé d’accès secrète AWS est « OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV ». Ensuite, vous pouvez calculer la signature comme suit :
import base64 import hmac import sha import urllib h = hmac.new(« OtxrzxIsfpFjA7SwPzILwy8Bw21TLhquhboDYROV », « GET\n\n\n1141889120\n/quotes/nelson », sha) urllib.quote_plus(base64.encodestring(h.digest()).strip())Notez que nous avons également encodé l’URL le résultat cette fois-ci. En effet, la sortie de l’algorithme base64 n’est pas adaptée à une utilisation en tant que paramètre de chaîne de requête, nous ajoutons donc une couche supplémentaire d’armure pour la rendre acceptable.
La signature résultante serait « vjbyPxybdZaNmGa%2ByT272YEAiv4%3D », donc les paramètres que nous utiliserons sont les suivants :
Valeur de clé | |
---|---|
AWSAccessKeyId | 44CF9590006BF252F707 |
Expire | 1141889120 |
signature | vjbyPxybdZaNmGa%2ByT272YEAiv4%3D |
Et l’URL résultante serait :
http://s3.amazonaws.com/quotes/nelson?AWSAccessKeyId=44CF9590006BF252F707&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D