

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Signature et authentification des requêtes REST (AWS signature (version 2)
<a name="RESTAuthentication"></a>

**Topics**
+ [Utilisation d'informations d'identification de sécurité temporaires](#UsingTemporarySecurityCredentials)
+ [L'en-tête Authentification](#ConstructingTheAuthenticationHeader)
+ [Conversion sous forme canonique d'une demande pour signature](#RESTAuthenticationRequestCanonicalization)
+ [Construction de l' CanonicalizedResource élément](#ConstructingTheCanonicalizedResourceElement)
+ [Construction de l' CanonicalizedAmzHeaders élément](#RESTAuthenticationConstructingCanonicalizedAmzHeaders)
+ [Éléments d'en-tête HTTP positionnels et éléments d'en-tête StringToSign HTTP nommés](#RESTAuthenticationStringToSign)
+ [Exigence d'horodatage](#RESTAuthenticationTimeStamp)
+ [Exemples d'authentification](#RESTAuthenticationExamples)
+ [Problèmes de signature de la demande REST](#RESTAuthenticationDebugging)
+ [Alternative à l'authentification d'une demande par chaîne d'interrogation](#RESTAuthenticationQueryStringAuth)

**Note**  
Cette rubrique explique les demandes d'authentification à l'aide de la Signature Version 2. Amazon S3 prend désormais en charge le dernier processus Signature Version 4. Ce protocole récent est pris en charge dans toutes les Régions et chaque nouvelle Région après le 30 janvier 2014 prendra uniquement en charge Signature Version 4. Pour plus d'informations, consultez la rubrique Demandes [ d'authentification (AWS Signature version 4) ](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) dans le manuel * Amazon Simple Storage Service API Reference*.

 L'authentification est le processus qui consiste à prouver l'identité au système. L'identité est un facteur important dans les décisions liées au contrôle d'accès Amazon S3. Les demandes sont autorisées ou refusées en partie en fonction l'identité du demandeur. Par exemple, le droit de créer des compartiments est réservé aux développeurs inscrits et (par défaut) le droit de créer des objets dans un compartiment est réservé au propriétaire du compartiment en question. En tant que développeur, vous faites des demandes qui appellent ces privilèges, vous devez donc prouver l'identité au système grâce à l'authentification des demandes. Cette section vous montre comment le faire. 

**Note**  
 Le contenu de cette section ne s'applique pas à HTTP POST. Pour de plus amples informations, veuillez consulter [Browser-based téléchargements à l'aide de POST (AWS signature (version 2)](UsingHTTPPOST.md). 

 L'API REST Amazon S3 utilise un schéma HTTP personnalisé basé sur un HMAC (Hash Message Authentication Code) à clés pour l'authentification. Pour authentifier une demande, vous devez d'abord concaténer les éléments sélectionnés de la demande pour forme une chaîne. Vous utilisez ensuite votre clé d'accès AWS secrète pour calculer le HMAC de cette chaîne. De manière informelle, ce processus est appelé « signature de la demande » et le résultat de l'algorithme HMAC est la signature, car il simule les propriétés de sécurité d'une signature réelle. Enfin, vous ajoutez cette signature comme un paramètre de la demande grâce à la syntaxe décrite dans cette section. 

 Lorsque le système reçoit une demande authentifiée, il récupère la clé d'accès AWS secrète que vous prétendez détenir et l'utilise de la même manière pour calculer la signature du message qu'il a reçu. Il compare ensuite la signature calculée et la signature présentée par le demandeur. Si les deux signatures correspondent, le système conclut que le demandeur doit avoir accès à la clé d'accès AWS secrète et agit donc avec l'autorité du mandant à qui la clé a été délivrée. Si les deux signatures ne correspondent pas, la demande est abandonnée et le système répond par un message d'erreur. 

**Example Demande REST Amazon S3 authentifiée**  

```
1. GET /photos/puppy.jpg HTTP/1.1
2. Host: awsexamplebucket1.us-west-1.s3.amazonaws.com
3. Date: Tue, 27 Mar 2007 19:36:42 +0000
4. 
5. {{Authorization: AWS AKIAIOSFODNN7EXAMPLE:
6. qgk2+6Sv9/oM7G3qLEjTH1a1l1g=}}
```

## Utilisation d'informations d'identification de sécurité temporaires
<a name="UsingTemporarySecurityCredentials"></a>

Si vous signez la demande grâce à des informations d'identification de sécurité temporaires (consultez [Demandes](MakingRequests.md)), vous devez inclure le token de sécurité correspondant dans la demande et ajouter l'en-tête `x-amz-security-token`. 

Lorsque vous obtenez des informations d'identification de sécurité temporaires grâce à l'API AWS Security Token Service , la réponse inclut des informations d'identification de sécurité temporaires et un token de session. Vous indiquez la valeur du jeton de session dans l'en-tête `x-amz-security-token` lorsque vous envoyez des demandes à Amazon S3. Pour plus d'informations sur l' AWS Security Token Service API fournie par IAM, consultez la rubrique [ Action ](https://docs.aws.amazon.com/STS/latest/APIReference/API_Operations.html) dans le Guide * de référence des *AWS Security Token Service API.

## L'en-tête Authentification
<a name="ConstructingTheAuthenticationHeader"></a>

L'API REST Amazon S3 utilise l'en-tête `Authorization` HTTP standard pour transmettre les informations d'authentification. (Le nom de l'en-tête standard est maladroit car il comporte des informations d'authentification, pas d'autorisation.) Dans le schéma d'authentification Amazon S3, l'en-tête Autorisation possède la forme suivante :

```
1. Authorization: AWS {{AWSAccessKeyId}}:{{Signature}}
```

Les développeurs reçoivent un identifiant de clé d' AWS accès et une clé d'accès AWS secrète lors de leur inscription. Pour une authentification de demande, l'élément `AWSAccessKeyId` identifie l'ID de clé d'accès utilisé pour calculer la signature et, indirectement, le développeur à l'origine de la demande.

L'`Signature`élément est la RFC 2104 HMAC-SHA1 des éléments sélectionnés de la demande. La `Signature` partie de l'en-tête Authorization varie donc d'une demande à l'autre. Si la signature de la demande calculée par le système correspond à `Signature` celle incluse dans la demande, le demandeur aura démontré qu'il possédait la clé d'accès AWS secrète. La demande sera ensuite traitée sous l'identité, et avec l'autorité, du développeur pour qui la clé a été émise.

Voici une pseudo-grammaire qui illustre la construction de l'en-tête de la demande `Authorization`. (Dans l'exemple, `\n` signifie le point de code Unicode `U+000A`, communément appelé nouvelle ligne). 

```
 1. Authorization = "AWS" + " " + AWSAccessKeyId + ":" + Signature;
 2. 
 3. Signature = Base64( HMAC-SHA1( UTF-8-Encoding-Of(YourSecretAccessKey), UTF-8-Encoding-Of( StringToSign ) ) );
 4. 
 5. StringToSign = HTTP-Verb + "\n" +
 6. 	Content-MD5 + "\n" +
 7. 	Content-Type + "\n" +
 8. 	Date + "\n" +
 9. 	CanonicalizedAmzHeaders +
10. 	CanonicalizedResource;
11. 
12. CanonicalizedResource = [ "/" + Bucket ] +
13. 	<HTTP-Request-URI, from the protocol name up to the query string> +
14. 	[ subresource, if present. For example "?acl", "?location", or "?logging"];
15. 
16. CanonicalizedAmzHeaders = <described below>
```

 HMAC-SHA1 est un algorithme défini par la [ RFC 2104 Keyed-Hashing pour l'authentification des messages. ](http://www.ietf.org/rfc/rfc2104.txt) L'algorithme utilise comme paramètres des chaînes encodées sur deux octets, une clé et un message. Pour l'authentification des demandes Amazon S3, utilisez votre clé d'accès AWS secrète (`YourSecretAccessKey`) comme clé et son UTF-8 encodage `StringToSign` comme message. La sortie de HMAC-SHA1 est également une chaîne d'octets, appelée condensé. Le paramètre de la demande `Signature` est construit en encodant en Base64 cette valeur de hachage. 

## Conversion sous forme canonique d'une demande pour signature
<a name="RESTAuthenticationRequestCanonicalization"></a>

 Rappelez-vous que lorsque le système reçoit une demande authentifiée, il compare la signature calculée de la demande et celle fournie dans la demande dans `StringToSign`. C'est pourquoi, vous devez calculer la signature grâce à la même méthode utilisée par Amazon S3. Processus qui consiste à présenter une demande sous une forme convenue pour la signature * de la canonisation. * 

## Construction de l' CanonicalizedResource élément
<a name="ConstructingTheCanonicalizedResourceElement"></a>

 `CanonicalizedResource` représente la ressource Amazon S3 ciblée par la demande. Construisez-la pour une demande REST de la manière suivante : 

1.  Commencez par une chaîne de caractères vide (`""`). 

1. Si la demande spécifie un compartiment qui utilise l'en-tête hôte HTTP (demande d'hébergement virtuel), ajoutez le nom du compartiment précédé d'un `"/"` (par exemple, "/nom du compartiment"). Pour les demandes de type chemin et les demandes qui ne font pas référence à un compartiment, ne faites rien. Pour plus d'informations sur les requêtes de type hébergement virtuel, consultez la section Hébergement [ virtuel de buckets. ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html) 

   Pour une requête de type hébergé virtuel « », il s'`CanonicalizedResource`agit de https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg « /awsexamplebucket1". 

   Pour la requête de style path, https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg « », `CanonicalizedResource` c'est « ».

1. Ajoutez la partie chemin du HTTP non décodé, jusqu'à la chaîne de requête Request-URI, mais sans l'inclure.

   Pour une requête de style hébergé virtuel https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg « », il `CanonicalizedResource` s'agit de «/awsexamplebucket1/photos/puppy.jpg ».

   Pour une requête de type chemin, https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg « », `CanonicalizedResource` c'est «/awsexamplebucket1/photos/puppy.jpg ». A ce stade, la `CanonicalizedResource` est identique pour la demande d'hébergement virtuel et de type chemin.

   Pour une demande qui ne fait pas référence à un compartiment, comme [GET Service](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html), ajoutez « / ».

1. Si la demande fait référence à une sous-ressource, comme `?versioning`, `?location`, `?acl`, `?lifecycle`, `?versionid`, ou, ajoutez la sous-ressource, sa valeur le cas échéant et le point d'interrogation. Notez que dans le cas de plusieurs sous-ressources, celles-ci doivent être triées lexicographiquement par nom de sous-ressource et séparées par « & », par exemple ? ACL&ID de version ={{value}}. 

   Les sous-ressources qui doivent être incluses lors de la création de l' CanonicalizedResource élément sont acl, lifecycle, location, logging, notification, PartNumber, policy, RequestPayment, UploadId, uploadId, uploads, VersionId, VersionId, Versioning, versions et site web. 

   Si la demande spécifie des paramètres de la chaîne d'interrogation qui ignorent les valeurs de l'en-tête de la réponse (veuillez consulter [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html)), ajoutez les paramètres de la chaîne d'interrogation et leurs valeurs. Lors de la signature, vous n'encodez pas ces valeurs ; toutefois, lorsque vous faites la demande, vous devez encoder les valeurs de ces paramètres. Les paramètres de la chaîne d'interrogation dans une demande GET incluent `response-content-type`, `response-content-language`, `response-expires`, `response-cache-control`, `response-content-disposition` et `response-content-encoding`.

   Le paramètre de chaîne de `delete` requête doit être inclus lorsque vous créez la demande de suppression CanonicalizedResource pour une requête de suppression multi-objets.

Les éléments provenant du CanonicalizedResource HTTP Request-URI doivent être signés littéralement tels qu'ils apparaissent dans la requête HTTP, y compris les URL-Encoding méta-caractères. 

`CanonicalizedResource`Cela peut être différent du HTTP Request-URI. En particulier, si votre demande utilise l'`Host`en-tête HTTP pour spécifier un compartiment, celui-ci n'apparaît pas dans le protocole HTTP Request-URI. Toutefois, la `CanonicalizedResource` continue d'inclure le compartiment. Les paramètres de chaîne de requête peuvent également apparaître dans le Request-URI mais ne sont pas inclus dans`CanonicalizedResource`. Pour plus d'informations, consultez la section Hébergement [ virtuel de buckets](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html). 

## Construction de l' CanonicalizedAmzHeaders élément
<a name="RESTAuthenticationConstructingCanonicalizedAmzHeaders"></a>

Pour créer la CanonicalizedAmzHeaders partie de`StringToSign`, sélectionnez tous les en-têtes de requêtes HTTP qui commencent par « x-amz- » (en utilisant une comparaison sans distinction majuscules/minuscules), puis procédez comme suit. 

1.  Convertissez chaque nom d'en-tête HTTP en minuscule. Par exemple, « `X-Amz-Date` » devient « `x-amz-date` ». 

1.  Triez la sélection d'en-tête de manière lexicographique par nom d'en-tête. 

1.  Combinez les champs d'en-tête avec le même nom dans une paire « nom d'en-tête:liste de valeurs séparées par des virgules » tel que recommandé par RFC 2616, section 4.2, sans aucun espace entre les valeurs. Par exemple, les deux en-têtes de métadonnées « `x-amz-meta-username: fred` » et « `x-amz-meta-username: barney` » seraient combinés en un seul en-tête « `x-amz-meta-username: fred,barney` ». 

1.  « Séparez » les longs en-têtes qui s'étendent sur plusieurs lignes (comme le permet RFC 2616, section 4.2) en remplaçant le retour à la ligne (notamment la nouvelle ligne) par un espace simple. 

1.  Coupez les espaces autour des deux-points dans l'en-tête. Par exemple, l'en-tête « `x-amz-meta-username: fred,barney` » deviendrait « `x-amz-meta-username:fred,barney` ». 

1.  Enfin, ajoutez un caractère de nouvelle ligne (`U+000A`) à chaque en-tête converti sous forme canonique dans la liste obtenue. Construisez l' CanonicalizedResource élément en concaténant tous les en-têtes de cette liste en une seule chaîne. 

## Éléments d'en-tête HTTP positionnels et éléments d'en-tête StringToSign HTTP nommés
<a name="RESTAuthenticationStringToSign"></a>

 Les premiers éléments d'en-tête de `StringToSign` (Content-Type, Date et Content-MD5) sont de nature positionnelle. `StringToSign`n'inclut pas les noms de ces en-têtes, mais uniquement leurs valeurs issues de la demande. En revanche, les éléments « `x-amz-` » sont nommés. Les noms et les valeurs de l'en-tête apparaissent dans `StringToSign`. 

 Si un en-tête positionnel demandé pour une définition de `StringToSign` n'est pas présent dans la demande (par exemple, les en-têtes `Content-Type` ou `Content-MD5` sont facultatifs pour les demandes PUT et insignifiants pour les demandes GET), substituez la chaîne de caractères vide ("") pour cette position. 

## Exigence d'horodatage
<a name="RESTAuthenticationTimeStamp"></a>

Un horodatage valide (qui utilise l'en-tête `Date` HTTP ou une alternative `x-amz-date`) est obligatoire pour les demandes authentifiées. De plus, l'horodatage du client inclus dans une demande authentifiée doit se faire dans les 15 minutes de l'heure du système Amazon S3 à la réception de la demande. Dans le cas contraire, la demande échoue avec le code d'erreur `RequestTimeTooSkewed`. L'objectif de ces restrictions est de limiter la possibilité que des demandes interceptées soient réutilisées par un adversaire. Pour une meilleure protection contre l'écoute, utilisez le transport HTTPS pour des demandes authentifiées. 

**Note**  
La contrainte de validation sur la date de la demande s'applique uniquement aux demandes authentifiées qui n'utilisent pas d'authentification par chaîne d'interrogation. Pour de plus amples informations, veuillez consulter [Alternative à l'authentification d'une demande par chaîne d'interrogation](#RESTAuthenticationQueryStringAuth).

Certaines bibliothèques client HTTP n'offrent pas la possibilité de configurer l'en-tête `Date` pour une demande. Si vous avez des problèmes pour inclure la valeur de l'en-tête « Date » dans les en-têtes convertis sous forme canonique, vous pouvez à la place configurer l'horodatage pour la demande grâce à un en-tête « `x-amz-date` ». 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](http://www.ietf.org/rfc/rfc2616.txt)). Lorsqu'un en-tête `x-amz-date` est présent dans une demande, le système ignore tous les en-têtes `Date` lors du calcul de la signature de la demande. Par conséquent, si vous incluez l'en-tête `x-amz-date`, utilisez la chaîne de caractères vide pour la `Date` lors de la création de l'élément `StringToSign`. consultez suivante pour obtenir un exemple. 

## Exemples d'authentification
<a name="RESTAuthenticationExamples"></a>

 Les exemples de cette section utilisent les informations d'identification (qui ne fonctionnent pas) dans le tableau suivant. 


| Paramètre | Value | 
| --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | 
| AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY | 

Dans l'exemple `StringToSign`, le formatage n'est pas significatif, et `\n` signifie le point de code Unicode `U+000A`, communément appelé nouvelle ligne. De plus, les exemples utilisent « \+0000 » pour désigner le fuseau horaire. Vous pouvez utiliser « GMT » à la place pour désigner le fuseau horaire, mais les signatures illustrées dans les exemples sont différentes.

### Objet GET
<a name="RESTAuthenticationExamples-1"></a>

Cet exemple obtient un objet à partir du compartiment awsexamplebucket1.


| Demande | StringToSign | 
| --- | --- | 
|  <pre>GET /photos/puppy.jpg HTTP/1.1<br />Host: awsexamplebucket1.us-west-1.s3.amazonaws.com<br />Date: Tue, 27 Mar 2007 19:36:42 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />qgk2+6Sv9/oM7G3qLEjTH1a1l1g=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Tue, 27 Mar 2007 19:36:42 +0000\n<br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

 Notez que le nom du compartiment est CanonicalizedResource inclus, mais Request-URI pas le HTTP. (Le compartiment est spécifié par l'en-tête hôte.) 

**Note**  
Le script Python suivant calcule la signature précédente à l'aide des paramètres fournis. Vous pouvez utiliser ce script pour créer vos propres signatures, en remplaçant les clés et le cas StringToSign échéant.  

```
 1. import base64
 2. import hmac
 3. from hashlib import sha1
 4. 
 5. access_key = '{{AKIAIOSFODNN7EXAMPLE}}'.encode("UTF-8")
 6. secret_key = '{{wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY}}'.encode("UTF-8")
 7. 
 8. string_to_sign = '{{GET\n\n\nTue, 27 Mar 2007 19:36:42 +0000\n/awsexamplebucket1/photos/puppy.jpg}}'.encode("UTF-8")
 9. signature = base64.b64encode(
10.                                 hmac.new(
11.                                          secret_key, string_to_sign, sha1
12.                                          ).digest()
13.                                 ).strip()
14. 
15. 
16. print(f"AWS {access_key.decode()}:{signature.decode()}")
```

### Objet PUT
<a name="RESTAuthenticationExamples-2"></a>

Cet exemple place un objet dans le compartiment awsexamplebucket1.


| Demande | StringToSign | 
| --- | --- | 
|  <pre>PUT /photos/puppy.jpg HTTP/1.1<br />Content-Type: image/jpeg<br />Content-Length: 94328<br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 21:15:45 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />iqRzw+ileNPu1fhspnRs8nOjjIA=<br />}}</pre>  |  <pre>PUT\n<br />\n<br />image/jpeg\n<br />Tue, 27 Mar 2007 21:15:45 +0000\n<br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

 Notez l' Content-Type en-tête de la demande et du StringToSign. Notez également que le champ Content-MD5 est laissé vide dans le StringToSign, car il n'est pas présent dans la demande. 

### List
<a name="RESTAuthenticationExamples-3"></a>



Cet exemple répertorie le contenu du compartiment awsexamplebucket1.


| Demande | StringToSign | 
| --- | --- | 
|  <pre>GET /?prefix=photos&max-keys=50&marker=puppy HTTP/1.1<br />User-Agent: Mozilla/5.0<br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 19:42:41 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />m0WP8eCtspQl5Ahe6L1SozdX9YA=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Tue, 27 Mar 2007 19:42:41 +0000\n<br />/awsexamplebucket1/</pre>  | 

 Notez la barre oblique finale CanonicalizedResource et l'absence de paramètres de chaîne de requête. 

### Fetch
<a name="RESTAuthenticationExamples-4"></a>

Cet exemple récupère la stratégie de contrôle d'accès pour le compartiment « awsexamplebucket1 ».


| Demande | StringToSign | 
| --- | --- | 
|  <pre>GET /?acl HTTP/1.1<br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 19:44:46 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />82ZHiFIjc+WbcwFKGUVEQspPn+0=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Tue, 27 Mar 2007 19:44:46 +0000\n<br />/awsexamplebucket1/?acl</pre>  | 

 Remarquez comment le paramètre de chaîne de requête de sous-ressource est inclus dans le CanonicalizedResource. 

### Suppression
<a name="RESTAuthenticationExamples-5"></a>

Cet exemple supprime un objet du compartiment « awsexamplebucket1 » grâce à l'alternative de type chemin et Date.


| Demande | StringToSign | 
| --- | --- | 
|  <pre>DELETE /awsexamplebucket1/photos/puppy.jpg HTTP/1.1<br />User-Agent: dotnet<br />Host: s3.us-west-1.amazonaws.com<br />Date: Tue, 27 Mar 2007 21:20:27 +0000<br /><br />x-amz-date: Tue, 27 Mar 2007 21:20:26 +0000<br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:XbyTlbQdu9Xw5o8P4iMwPktxQd8=}}</pre>  |  <pre>DELETE\n<br />\n<br />\n<br />Tue, 27 Mar 2007 21:20:26 +0000\n<br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

 Notez la méthode alternative « x-amz-date » pour spécifier la date (parce que notre bibliothèque cliente nous empêchait de définir la date, par exemple). Dans ce cas, le code `x-amz-date` prime sur l'en-tête `Date`. Par conséquent, l'entrée de la date dans la signature doit contenir la valeur de l'en-tête `x-amz-date`. 

### Charger
<a name="RESTAuthenticationExamples-6"></a>

Cet exemple charge un objet dans un compartiment d'hébergement virtuel CNAME avec des métadonnées.


| Demande | StringToSign | 
| --- | --- | 
|  <pre>PUT /db-backup.dat.gz HTTP/1.1<br />User-Agent: curl/7.15.5<br />Host: static.example.com:8080<br />Date: Tue, 27 Mar 2007 21:06:08 +0000<br /><br />x-amz-acl: public-read<br />content-type: application/x-download<br />Content-MD5: 4gJE4saaMU4BqNR0kLY+lw==<br />X-Amz-Meta-ReviewedBy: joe@example.com<br />X-Amz-Meta-ReviewedBy: jane@example.com<br />X-Amz-Meta-FileChecksum: 0x02661779<br />X-Amz-Meta-ChecksumAlgorithm: crc32<br />Content-Disposition: attachment; filename=database.dat<br />Content-Encoding: gzip<br />Content-Length: 5913339<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:<br />jtBQa0Aq+DkULFI8qrpwIjGEx0E=}}</pre>  |  <pre>PUT\n<br />4gJE4saaMU4BqNR0kLY+lw==\n<br />application/x-download\n<br />Tue, 27 Mar 2007 21:06:08 +0000\n<br /><br />x-amz-acl:public-read\n<br />x-amz-meta-checksumalgorithm:crc32\n<br />x-amz-meta-filechecksum:0x02661779\n<br />x-amz-meta-reviewedby:<br />joe@example.com,jane@example.com\n<br />/static.example.com/db-backup.dat.gz</pre>  | 

 Notez la façon dont les en-têtes sont triés, débarrassés de leurs espaces et convertis en minuscules. Notez également que plusieurs en-têtes avec le même nom ont été réunis grâce aux virgules pour séparer les valeurs. 

 Notez comme seuls les en-têtes d'entité HTTP `Content-Type` et `Content-MD5` apparaissent dans l'élément `StringToSign`. Les autres en-têtes d'entité `Content-*` n'apparaissent pas. 

 Encore une fois, notez que le nom du bucket est `CanonicalizedResource` inclus, mais Request-URI pas le HTTP. (Le compartiment est spécifié par l'en-tête hôte.) 

### Lister tous les compartiments
<a name="RESTAuthenticationExamples-7"></a>


| Demande | StringToSign | 
| --- | --- | 
|  <pre>GET / HTTP/1.1<br />Host: s3.us-west-1.amazonaws.com<br />Date: Wed, 28 Mar 2007 01:29:59 +0000<br /><br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:qGdzdERIC03wnaRNKh6OqZehG9s=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Wed, 28 Mar 2007 01:29:59 +0000\n<br />/</pre>  | 

### Clés Unicode
<a name="RESTAuthenticationExamples-8"></a>


| Demande | StringToSign | 
| --- | --- | 
|  <pre>GET /dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re HTTP/1.1<br />Host: s3.us-west-1.amazonaws.com<br />Date: Wed, 28 Mar 2007 01:49:49 +0000<br />{{Authorization: AWS AKIAIOSFODNN7EXAMPLE:DNEZGsoieTZ92F3bUfSPQcbGmlM=}}</pre>  |  <pre>GET\n<br />\n<br />\n<br />Wed, 28 Mar 2007 01:49:49 +0000\n<br />/dictionary/fran%C3%A7ais/pr%c3%a9f%c3%a8re</pre>  | 

**Note**  
Les éléments `StringToSign` qui en sont dérivés Request-URI sont pris littéralement, y compris en URL-Encoding majuscules. 

## Problèmes de signature de la demande REST
<a name="RESTAuthenticationDebugging"></a>

 En cas d'échec de l'authentification de la demande REST, le système répond à la demande avec un rapport d'erreur XML. Les informations contenues dans ce rapport d'erreur aident les développeurs à identifier le problème. L'élément `StringToSign` du rapport d'erreur `SignatureDoesNotMatch` vous indique notamment la conversion sous forme canonique de la demande utilisée par le système. 

Certaines boîtes à outils insèrent en silence et au préalable des en-têtes comme l'en-tête `Content-Type` lors d'une opération PUT. Dans la plupart des cas, la valeur de l'en-tête inséré reste constante, ce qui vous permet d'identifier les en-têtes manquants grâce à des outils comme Ethereal ou tcpmon. 

## Alternative à l'authentification d'une demande par chaîne d'interrogation
<a name="RESTAuthenticationQueryStringAuth"></a>

Vous pouvez authentifier certains types de demandes en transférant les informations requises en tant que paramètres de la chaîne d'interrogation au lieu d'utiliser l'en-tête HTTP `Authorization`. Cette méthode est utile pour activer l'accès direct d'un navigateur tiers vers les données Amazon S3 privées sans rediriger la demande. L'idée est de créer une demande « pré-signée » et de l'encoder comme une URL récupérable par le navigateur d'un utilisateur final. De plus, vous pouvez limiter une demande pré-signée en spécifiant un délai d'expiration. 

Pour plus d'informations sur l'utilisation des paramètres de requête pour authentifier les demandes, consultez [ Authentification des demandes : utilisation des paramètres de requête (AWS Signature version 4) ](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html) dans le manuel * Amazon Simple Storage Service API Reference. * Pour des exemples d'utilisation des AWS SDK pour générer des URL présignées, consultez la section [ Partage d'objets avec des URL présignées. ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html) 

### Création d'une signature
<a name="CreatingASignature"></a>

Voici un exemple de requête REST Amazon S3 authentifiée par la chaîne d'interrogation.

```
1. GET /photos/puppy.jpg
2. ?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1141889120&Signature=vjbyPxybdZaNmGa%2ByT272YEAiv4%3D HTTP/1.1
3. Host: awsexamplebucket1.s3.us-west-1.amazonaws.com
4. Date: Mon, 26 Mar 2007 19:37:58 +0000
```

La méthode d'authentification d'une demande par chaîne d'interrogation n'exige aucun en-tête HTTP spécial. A la place, les éléments d'authentification requis sont spécifiés en tant que paramètres de la chaîne d'interrogation : 


| Nom du paramètre de la chaîne d'interrogation | Exemple de valeur | Description | 
| --- | --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | ID de votre clé d' AWS accès. Spécifie la clé d'accès AWS secrète utilisée pour signer la demande et, indirectement, l'identité du développeur à l'origine de la demande. | 
| Expires | 1141889120 | Le délai d'expiration de la signature, indiqué en nombre de secondes depuis l'époque (00:00:00 UTC le 1er janvier 1970). Passé ce délai (selon le serveur), toute demande reçue est rejetée.  | 
| Signature | vjbyPxybdZaNmGa%2ByT272YEAiv4%3D | L'encodage URL du codage Base64 du HMAC-SHA1 of StringToSign. | 

La méthode d'authentification de la demande par chaîne d'interrogation diffère légèrement du paramètre de la demande `Signature` et de l'élément `StringToSign`. Voici une pseudo-grammaire qui illustre la construction de la méthode d'authentification de la demande par chaîne d'interrogation. 

```
1. Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKey, UTF-8-Encoding-Of( StringToSign ) ) ) );
2. 
3. StringToSign = HTTP-VERB + "\n" +
4.     Content-MD5 + "\n" +
5.     Content-Type + "\n" +
6.     Expires + "\n" +
7.     CanonicalizedAmzHeaders +
8.     CanonicalizedResource;
```

`YourSecretAccessKey`est l'identifiant de clé d'accès AWS secrète qu'Amazon vous attribue lorsque vous vous inscrivez en tant que développeur Amazon Web Service. Remarquez `Signature` comment il convient de le placer dans la chaîne de requête. URL-Encoded Notez également que dans l'élément `StringToSign`, l'élément HTTP positionnel `Date` a été remplacé par `Expires`. Les `CanonicalizedAmzHeaders` et la `CanonicalizedResource` sont identiques. 

**Note**  
Dans la méthode d'authentification par chaîne d'interrogation, vous n'utilisez pas le `Date` ou l'en-tête `x-amz-date request` lors du calcul de l'élément StringToSign.

#### Authentification d'une demande par chaîne d'interrogation
<a name="query-str-auth-ex"></a>


| Demande | StringToSign | 
| --- | --- | 
|  <pre>GET /photos/puppy.jpg?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&<br />    Signature=NpgCjnDzrM%2BWFzoENXmpNDUsSn8%3D&<br />    Expires=1175139620 HTTP/1.1<br /><br />Host: awsexamplebucket1.s3.us-west-1.amazonaws.com</pre>  |  <pre>GET\n<br />\n<br />\n<br />1175139620\n<br /><br />/awsexamplebucket1/photos/puppy.jpg</pre>  | 

Cet exemple suppose que lorsqu'un navigateur effectue la requête GET, il ne fournit pas d' Content-Type en-tête Content-MD5 ou, et il ne définit pas non plus d'en-têtes x-amz-, de sorte que ces parties `StringToSign` sont laissées vides. 

#### Utilisation de l'encodage en Base64
<a name="S3_Authentication_Base64"></a>

Les signatures de la demande HMAC doivent être encodées en Base64. L'encodage Base64 convertit la signature en une simple chaîne de caractères ASCII qui peut être attachée à la demande. Les caractères qui peuvent apparaître dans la chaîne de signature comme plus (\+), barre oblique (/) et égal (=) doivent être encodés s'ils sont utilisés dans une URI. Par exemple, si le code d'authentification inclut un signe plus (\+), utilisez %2B dans la demande. Pour une barre oblique, utilisez %2F et pour le signe égal, utilisez %3D.

Pour obtenir des exemples d'encodage en Base64, consultez les Amazon S3 [Exemples d'authentification](#RESTAuthenticationExamples).