

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Firma e autenticazione delle richieste REST (AWS firma (versione 2)
<a name="RESTAuthentication"></a>

**Topics**
+ [Utilizzo di credenziali di sicurezza temporanee](#UsingTemporarySecurityCredentials)
+ [Intestazione di autenticazione](#ConstructingTheAuthenticationHeader)
+ [Standardizzazione della richiesta per la firma](#RESTAuthenticationRequestCanonicalization)
+ [Costruzione dell'elemento CanonicalizedResource](#ConstructingTheCanonicalizedResourceElement)
+ [Costruire l'elemento CanonicalizedAmzHeaders](#RESTAuthenticationConstructingCanonicalizedAmzHeaders)
+ [Elementi di intestazione HTTP posizionali e denominati StringToSign](#RESTAuthenticationStringToSign)
+ [Necessità del time stamp](#RESTAuthenticationTimeStamp)
+ [Esempi di autenticazione](#RESTAuthenticationExamples)
+ [Problemi con la firma delle richieste REST](#RESTAuthenticationDebugging)
+ [Alternativa per l'autenticazione di una richiesta tramite stringa di query](#RESTAuthenticationQueryStringAuth)

**Nota**  
In questo argomento viene illustrato come autenticare le richieste tramite Signature Version 2. Amazon S3 supporta ora il più recente Signature Version 4. L'ultima versione è ora supportata in tutte le regioni e le regioni create dopo il 30 gennaio 2014 supporteranno solo Signature Version 4. Per ulteriori informazioni, consulta [ Authenticating Requests (AWS Signature Version 4) ](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html) nel * Amazon Simple Storage Service API Reference. *

 Per autenticazione si intende il processo di attestazione dell'identità in un sistema. L'identità è un importante fattore per le decisioni di controllo degli accessi in Amazon S3. Le richieste vengono accettate o rifiutate in parte anche in base all'identità del richiedente. Ad esempio, il diritto di creare bucket è riservato agli sviluppatori registrati e, di default, è solo il proprietario del bucket in questione ad avere il diritto di creare oggetti al suo interno. Poiché gli sviluppatori inviano richieste che invocano questi privilegi, dovranno provare la propria identità al sistema autenticando le richieste: in questa sezione viene illustrato come procedere. 

**Nota**  
 I contenuti di questa sezione non si applicano alle richieste HTTP POST. Per ulteriori informazioni, consulta [Browser-based caricamenti utilizzando POST (AWS firma (versione 2)](UsingHTTPPOST.md). 

 Per l'autenticazione, l'API REST di Amazon S3 utilizza uno schema HTTP personalizzato basato su un codice HMAC (Hash Message Authentication Code) con chiave. Per autenticare una richiesta, è necessario in primo luogo concatenare alcuni elementi della richiesta per formare una stringa, Quindi utilizzi la tua chiave di accesso AWS segreta per calcolare l'HMAC di quella stringa. Informalmente, questo processo è chiamato «firma della richiesta» e l'output dell'algoritmo HMAC è la firma, poiché simula le proprietà di sicurezza di una firma reale. Infine, la firma viene aggiunta come parametro della richiesta tramite la sintassi descritta in questa sezione. 

 Quando il sistema riceve una richiesta autenticata, recupera la chiave di accesso AWS segreta che si afferma di avere e la utilizza allo stesso modo per calcolare una firma per il messaggio ricevuto. quindi confronta la firma calcolata con quella presentata dal richiedente. Se le due firme corrispondono, il sistema conclude che il richiedente deve avere accesso alla chiave di accesso AWS segreta e quindi agisce con l'autorità del mandante a cui è stata rilasciata la chiave. Se le due firme non coincidono, la richiesta viene scartata e il sistema risponde con un messaggio di errore. 

**Example Richiesta REST Amazon S3 autenticata**  

```
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=}}
```

## Utilizzo di credenziali di sicurezza temporanee
<a name="UsingTemporarySecurityCredentials"></a>

Se la richiesta viene firmata tramite credenziali di sicurezza temporanee (consulta [Esecuzione di richieste](MakingRequests.md)), è necessario includere nella richiesta il corrispondente token di sicurezza aggiungendo l'intestazione `x-amz-security-token`. 

Quando si ottengono credenziali di sicurezza temporanee utilizzando l'API Servizio di token di sicurezza AWS , la risposta include le credenziali di sicurezza temporanee e un token di sessione. Il valore del token di sessione deve essere fornito nell'intestazione `x-amz-security-token` durante l'invio di richieste ad Amazon S3. Per informazioni sull' Servizio di token di sicurezza AWS API fornita da IAM, vai a [ Action ](https://docs.aws.amazon.com/STS/latest/APIReference/API_Operations.html) in the *Servizio di token di sicurezza AWS API Reference Guide. *

## Intestazione di autenticazione
<a name="ConstructingTheAuthenticationHeader"></a>

L'API REST di Amazon S3 utilizza l'intestazione standard HTTP `Authorization` per passare le informazioni di autenticazione (il nome dell'intestazione standard è poco felice perché in realtà comunica informazioni sull'autenticazione, non sull'autorizzazione). Nell'ambito dello schema di autenticazione Amazon S3, l'intestazione Authorization ha il formato seguente:

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

Agli sviluppatori vengono rilasciati un ID della chiave di AWS accesso e una chiave di accesso AWS segreta al momento della registrazione. Per l'autenticazione delle richieste, l'elemento `AWSAccessKeyId` identifica l'ID chiave di accesso utilizzata per calcolare la firma e, indirettamente, lo sviluppatore che invia la richiesta.

L'`Signature`elemento è la RFC 2104 HMAC-SHA1 degli elementi selezionati dalla richiesta, pertanto la `Signature` parte dell'intestazione di autorizzazione varierà da richiesta a richiesta. Se la firma della richiesta calcolata dal sistema corrisponde a quella `Signature` inclusa nella richiesta, il richiedente avrà dimostrato il possesso della AWS chiave di accesso segreta. La richiesta verrà quindi elaborata con l'identità e l'autorità dello sviluppatore titolare della chiave.

Di seguito è riportato un esempio di grammatica che illustra la costruzione dell'intestazione `Authorization` per la richiesta. (Nell'esempio, l'elemento `\n` rappresenta il punto di codice Unicode `U+000A`, comunemente chiamato newline). 

```
 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 è un algoritmo definito da [ RFC 2104, Keyed-Hashing per l'autenticazione dei messaggi. ](http://www.ietf.org/rfc/rfc2104.txt) L'algoritmo prende come input due stringhe in bit, una chiave e un messaggio. Per l'autenticazione delle richieste di Amazon S3, utilizza la tua chiave di accesso AWS segreta (`YourSecretAccessKey`) come chiave e la UTF-8 codifica come messaggio. `StringToSign` L'output di HMAC-SHA1 è anche una stringa di byte, chiamata digest. Il parametro di richiesta `Signature` viene costruito da Base64 codificando il digest. 

## Standardizzazione della richiesta per la firma
<a name="RESTAuthenticationRequestCanonicalization"></a>

 È importante ricordare che, quando il sistema riceve una richiesta di autenticazione, confronta la firma calcolata con la firma fornita nella richiesta in `StringToSign`. Per questo motivo, devi calcolare la firma con lo stesso metodo utilizzato da Amazon S3. Il processo di presentazione di una richiesta in una forma concordata per la firma della canonicalizzazione. * * 

## Costruzione dell'elemento CanonicalizedResource
<a name="ConstructingTheCanonicalizedResourceElement"></a>

 `CanonicalizedResource` rappresenta la risorsa Amazon S3 cui è destinata la richiesta. È possibile costruire l'elemento per una richiesta REST nel modo seguente: 

1.  Iniziare con una stringa vuota (`""`). 

1. Se la richiesta specifica un bucket tramite l'intestazione Host HTTP (in stile hosting virtuale), aggiungere il nome del bucket preceduto da `"/"` (ad es., "/nomebucket"). Per le richieste in stile percorso o senza un bucket specifico, non è necessaria alcuna azione. Per ulteriori informazioni sulle richieste in stile host virtuale, vedere Hosting [ virtuale di bucket. ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html) 

   Per una richiesta in stile host virtuale "«, è «https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg/awsexamplebucket1". `CanonicalizedResource` 

   Per la richiesta in stile percorso, "«, è «». https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg `CanonicalizedResource`

1. Aggiungi la parte del percorso dell'HTTP non decodificato Request-URI, fino alla stringa di query ma non inclusa.

   Per una richiesta in stile host virtuale "«, è https://awsexamplebucket1.s3.us-west-1.amazonaws.com/photos/puppy.jpg «//puppy.jpg». `CanonicalizedResource` awsexamplebucket1/photos

   Per una richiesta in stile percorso, "https://s3.us-west-1.amazonaws.com/awsexamplebucket1/photos/puppy.jpg«, `CanonicalizedResource` è «//puppy.jpg». awsexamplebucket1/photos A questo punto, l'elemento `CanonicalizedResource` è lo stesso sia per le richieste in stile hosting virtuale che in stile percorso.

   Per una richiesta non indirizzata a un bucket, come [GET Service](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTServiceGET.html), aggiungere "/".

1. Se la richiesta è indirizzata a una risorsa secondaria, come `?versioning`, `?location`, `?acl`, `?lifecycle` o `?versionid`, aggiungere la risorsa secondaria, il suo valore (se disponibile) e il punto interrogativo. Nota che in caso di più sottorisorse, le sottorisorse devono essere ordinate lessicograficamente in base al nome della sottorisorsa e separate da '&', ad esempio? ACL&versionId=. {{value}} 

   Le risorse secondarie da includere nella costruzione dell' CanonicalizedResource elemento sono acl, lifecycle, location, logging, notification, partNumber, policy, requestPayment, uploadID, uploads, versionId, versionId, versioning, versions e website. 

   Se la richiesta specifica parametri della stringa di query che sostituiscono i valori dell'intestazione della risposta (consultare [Get Object](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html)), aggiungere i parametri della stringa di query e i rispettivi valori. Al momento della firma questi valori non vanno codificati, ma i valori dei parametri devono essere codificati quando si invia la richiesta. I parametri della stringa di query in una richiesta GET includono `response-content-type`, `response-content-language`, `response-expires`, `response-cache-control`, `response-content-disposition` e `response-content-encoding`.

   Il parametro della stringa di `delete` query deve essere incluso quando si crea una richiesta di eliminazione per più oggetti. CanonicalizedResource 

Gli elementi provenienti da HTTP Request-URI devono essere firmati letteralmente così come appaiono nella richiesta HTTP, inclusi i URL-Encoding metacaratteri. CanonicalizedResource 

`CanonicalizedResource`Potrebbe essere diverso dall'HTTP Request-URI. In particolare, se la richiesta utilizza l'`Host`intestazione HTTP per specificare un bucket, il bucket non viene visualizzato nell'HTTP. Request-URI Tuttavia, nella `CanonicalizedResource` è sempre incluso il bucket. I parametri della stringa di query potrebbero essere visualizzati anche in Request-URI ma non sono inclusi in. `CanonicalizedResource` Per ulteriori informazioni, consulta Hosting [ virtuale di bucket. ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/VirtualHosting.html) 

## Costruire l'elemento CanonicalizedAmzHeaders
<a name="RESTAuthenticationConstructingCanonicalizedAmzHeaders"></a>

Per creare la CanonicalizedAmzHeaders parte di`StringToSign`, seleziona tutte le intestazioni delle richieste HTTP che iniziano con 'x-amz-' (utilizzando un confronto senza distinzione tra maiuscole e minuscole) e usa la seguente procedura. 

1.  Convertire ciascun nome dell'intestazione HTTP in lettere minuscole. Ad esempio "`X-Amz-Date`" diventa "`x-amz-date`". 

1.  Disporre la raccolta delle intestazioni in ordine lessicografico in base al nome dell'intestazione. 

1.  Combinare i campi di intestazione con lo stesso nome in una coppia "nome-valore:elenco-valori-separati-da-virgole", come stabilito dallo standard RFC 2616, sezione 4.2, senza spazi tra i valori. Ad esempio, le due intestazioni con metadata "`x-amz-meta-username: fred`" e "`x-amz-meta-username: barney`" verrebbero combinate nell'intestazione singola "`x-amz-meta-username: fred,barney`". 

1.  "Aprire" le intestazioni più lunghe che occupano più righe (come consentito dallo standard RFC 2616, sezione 4.2) sostituendo gli spazi di folding (newline compreso) con un singolo spazio. 

1.  Rimuovere gli spazi attorno ai due punti nell'intestazione. Ad esempio, l'intestazione '' diventerebbe ''. `x-amz-meta-username: fred,barney` `x-amz-meta-username:fred,barney` 

1.  Infine, aggiungere un carattere newline (`U+000A`) a ogni intestazione standardizzata nell'elenco risultante. Costruisci l' CanonicalizedResource elemento concatenando tutte le intestazioni di questo elenco in un'unica stringa. 

## Elementi di intestazione HTTP posizionali e denominati StringToSign
<a name="RESTAuthenticationStringToSign"></a>

 I primi elementi di intestazione di `StringToSign` (Content-Type, Date e Content-MD5) sono di natura posizionale. `StringToSign`non include i nomi di queste intestazioni, ma solo i valori relativi alla richiesta. Al contrario, gli elementi "`x-amz-`" sono denominati. In sono inclusi sia i nomi, sia i valori dell'intestazion `StringToSign`. 

 Se un'intestazione posizionale richiamata per la definizione di `StringToSign` non è presente nella richiesta (ad esempio, `Content-Type` o `Content-MD5` sono facoltative per le richieste PUT e prive di senso per le richieste GET), la stringa vuota ("") per tale posizione va sostituita. 

## Necessità del time stamp
<a name="RESTAuthenticationTimeStamp"></a>

Per le richieste autenticate, è obbligatorio un time stamp valido (tramite intestazione `Date` HTTP o un'alternativa `x-amz-date`). Inoltre, alla ricezione di una richiesta autenticata, il timestamp del client incluso nella richiesta non deve differire di oltre 15 minuti rispetto all'orario di sistema in Amazon S3. In caso contrario, la richiesta avrà esito negativo con il codice di errore `RequestTimeTooSkewed`. Tali restrizioni hanno lo scopo di limitare le possibilità che una richiesta intercettata possa essere riproposta da un sistema avversario. Per una maggiore protezione contro le intercettazioni, utilizzare il protocollo di trasferimento HTTPS per le richieste autenticate. 

**Nota**  
Il vincolo relativo alla convalida della data della richiesta è valido solo per le richieste autenticate che non utilizzano l'autenticazione stringa di query. Per ulteriori informazioni, consulta [Alternativa per l'autenticazione di una richiesta tramite stringa di query](#RESTAuthenticationQueryStringAuth).

Alcune librerie client HTTP non danno la possibilità di impostare l'intestazione `Date` per una richiesta. Se includere il valore dell'intestazione "Date" nelle intestazioni standardizzate crea difficoltà, è possibile impostare il time stamp per la richiesta utilizzando l'intestazione "`x-amz-date`". Il valore dell'intestazione `x-amz-date` deve essere in uno dei formati RFC 2616 ([http://www.ietf.org/rfc/rfc2616.txt](http://www.ietf.org/rfc/rfc2616.txt)). Quando in una richiesta è presente un'intestazione `x-amz-date`, durante il calcolo della firma della richiesta il sistema ignorerà qualsiasi intestazione di tipo `Date`. Di conseguenza, se si include l'intestazione `x-amz-date`, va utilizzata la stringa vuota per il valore `Date` durante la costruzione della stringa `StringToSign`. Nella prossima sezione sarà riportato un esempio. 

## Esempi di autenticazione
<a name="RESTAuthenticationExamples"></a>

 Gli esempi in questa sezione utilizzano le credenziali (non funzionanti) incluse nella seguente tabella. 


| Parametro | Valore | 
| --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | 
| AWSSecretAccessKey | wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY | 

Negli elementi `StringToSign` di esempio, la formattazione non è significativa, mentre l'elemento `\n` rappresenta il punto di codice Unicode `U+000A`, comunemente chiamato newline. Inoltre, negli esempi viene utilizzato "\+0000" per identificare il fuso orario. Allo stesso scopo è anche possibile utilizzare "GMT", ma le firme mostrate nell'esempio saranno diverse.

### Richiesta GET di un oggetto
<a name="RESTAuthenticationExamples-1"></a>

Nell'esempio viene richiesto un oggetto dal bucket awsexamplebucket1.


| Richiesta | 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>  | 

 Nota che CanonicalizedResource include il nome del bucket, ma l'HTTP Request-URI no. (Il bucket è specificato dall'intestazione Host). 

**Nota**  
Il seguente script Python calcola la firma precedente utilizzando i parametri forniti. Puoi usare questo script per creare le tue firme, sostituendo le chiavi e StringToSign se necessario.  

```
 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()}")
```

### Richiesta PUT di un oggetto
<a name="RESTAuthenticationExamples-2"></a>

Nell'esempio viene inserito un oggetto nel bucket awsexamplebucket1.


| Richiesta | 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>  | 

 Annota l' Content-Type intestazione nella richiesta e nel. StringToSign Nota inoltre che Content-MD5 è lasciato vuoto in StringToSign, perché non è presente nella richiesta. 

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



Nell'esempio viene recuperato l'elenco dei contenuti del bucket awsexamplebucket1.


| Richiesta | 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>  | 

 Nota la barra finale CanonicalizedResource e l'assenza di parametri della stringa di query. 

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

Nell'esempio viene recuperata la risorsa secondaria relativa alla policy di controllo degli accessi per il bucket "awsexamplebucket1".


| Richiesta | 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>  | 

 Notate come il parametro della stringa di interrogazione della subrisorsa sia incluso in. CanonicalizedResource 

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

In questo esempio viene eliminato un oggetto dal bucket "awsexamplebucket1" utilizzando lo stile percorso e l'alternativa Date.


| Richiesta | 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>  | 

 Nota il metodo alternativo 'x-amz-date' per specificare la data (perché la nostra libreria client ci ha impedito di impostare la data, ad esempio). In questo caso, il metodo `x-amz-date` prevale sull'intestazione `Date`. Di conseguenza, la voce relativa alla data nella firma deve contenere il valore dell'intestazione `x-amz-date`. 

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

In questo esempio viene caricato un oggetto in un bucket CNAME in stile hosting virtuale con metadata.


| Richiesta | 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>  | 

 Osserva il modo in cui le intestazioni "x-amz-" vengono ordinate, private degli spazi aggiuntivi e convertite in caratteri minuscoli. Inoltre, più intestazioni con lo stesso nome sono state unite, con i valori separati da virgole. 

 Si noti come solo le intestazioni delle entità HTTP `Content-Type` e `Content-MD5` siano presenti in `StringToSign`, mentre le intestazioni dell'altra entità `Content-*` non lo sono. 

 Ancora una volta, nota che `CanonicalizedResource` include il nome del bucket, ma l'HTTP no. Request-URI (Il bucket è specificato dall'intestazione Host). 

### Elenco di tutti i bucket personali
<a name="RESTAuthenticationExamples-7"></a>


| Richiesta | 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>  | 

### Chiavi Unicode
<a name="RESTAuthenticationExamples-8"></a>


| Richiesta | 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>  | 

**Nota**  
Gli elementi `StringToSign` che ne derivano Request-URI sono presi alla lettera, compresi quelli URL-Encoding in maiuscolo. 

## Problemi con la firma delle richieste REST
<a name="RESTAuthenticationDebugging"></a>

 In caso di errore nell'autenticazione delle richieste REST, il sistema risponde alla richiesta con un documento di errore XML, che contiene informazioni concepite per aiutare gli sviluppatori a individuare il problema. In particolare, l'elemento `StringToSign` del documento di errore `SignatureDoesNotMatch` indica esplicitamente il tipo di standardizzazione della richiesta usata dal sistema. 

Alcuni kit di strumenti inseriscono tacitamente intestazioni non note in precedenza, ad esempio nel caso dell'aggiunta dell'intestazione `Content-Type` durante un'operazione PUT. In gran parte dei casi, il valore dell'intestazione inserita rimane costante: questo consente di scoprire le intestazioni mancanti utilizzando strumenti come Ethereal o tcpmon. 

## Alternativa per l'autenticazione di una richiesta tramite stringa di query
<a name="RESTAuthenticationQueryStringAuth"></a>

È possibile autenticare alcuni tipi di richieste passando le informazioni necessarie come parametri di una stringa di query, invece di utilizzare l'intestazione HTTP `Authorization`. Questa soluzione è utile per abilitare l'accesso diretto da parte di browser di terze parti ai dati Amazon S3 privati senza proxy della richiesta. L'idea è costruire di una richiesta "prefirmata" e codificarla come URL recuperabile da parte del browser di un utente finale. È inoltre possibile limitare una richiesta prefirmata specificando un periodo di scadenza. 

Per ulteriori informazioni sull'utilizzo dei parametri di query per autenticare le richieste, consulta [ Authenticating Requests: Using Query Parameters (AWS Signature Version 4) ](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html) nell'*Amazon Simple Storage Service API Reference. * Per esempi di utilizzo degli AWS SDK per generare URL prefirmati, [ consulta Condivisione di oggetti con URL prefirmati. ](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ShareObjectPreSignedURL.html) 

### Creazione di una firma
<a name="CreatingASignature"></a>

Di seguito è riportato un esempio di richiesta REST Amazon S3 autenticata tramite stringa di query.

```
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
```

Il metodo di autenticazione delle richieste tramite stringa di query non richiede particolari intestazioni HTTP. Gli elementi necessari all'autenticazione sono invece specificati come parametri della stringa di query: 


| Nome parametro stringa di query | Valore di esempio | Description | 
| --- | --- | --- | 
| AWSAccessKeyId | AKIAIOSFODNN7EXAMPLE | L'ID della tua chiave di accesso. AWS Specifica la chiave di accesso AWS segreta utilizzata per firmare la richiesta e, indirettamente, l'identità dello sviluppatore che effettua la richiesta. | 
| Expires | 1141889120 | L'ora di scadenza della firma, specificata come numero di secondi dal valore epoca (Unix epoch, ovvero 00:00:00 UTC del 1° gennaio 1970). Se ricevuta dopo l'ora indicata (secondo il server), la richiesta verrà rifiutata.  | 
| Signature | vjbyPxybdZaNmGa%2ByT272YEAiv4%3D | La codifica URL della codifica Base64 di of. HMAC-SHA1 StringToSign | 

Il metodo di autenticazione delle richieste tramite stringa di query varia leggermente rispetto al metodo tradizionale, ma solo nel formato del parametro di richiesta `Signature` e nell'elemento `StringToSign`. Di seguito è riportato un esempio di grammatica che illustra il metodo di autenticazione delle richieste tramite stringa di query. 

```
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`è l'ID della chiave di accesso AWS segreta che Amazon ti assegna quando ti registri per diventare uno sviluppatore di Amazon Web Service. Nota come `Signature` è URL-Encoded necessario renderlo adatto per il posizionamento nella stringa di query. Inoltre, in `StringToSign`, l'elemento posizionale HTTP `Date` è stato sostituito con l'elemento `Expires`, mentre `CanonicalizedAmzHeaders` e `CanonicalizedResource` restano invariati. 

**Nota**  
Nel metodo di autenticazione stringa di query, non si utilizzano né l'elemento `Date` né l'intestazione `x-amz-date request` per il calcolo della stringa da firmare.

#### Autenticazione di una richiesta tramite stringa di query
<a name="query-str-auth-ex"></a>


| Richiesta | 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>  | 

Questo esempio presuppone che quando un browser effettua la richiesta GET, non fornisca Content-MD5 né un' Content-Type intestazione né imposti alcuna intestazione x-amz-, quindi tali parti vengono lasciate vuote. `StringToSign` 

#### Utilizzo della codifica Base64
<a name="S3_Authentication_Base64"></a>

Le firme di richiesta HMAC devono essere codificate in formato Base64. La codifica Base64 converte la firma in una stringa ASCII semplice che è possibile allegare alla richiesta. Se utilizzati in un URI, i caratteri che possono essere presenti in una firma, ad esempio il più (\+), la barra (/) e l'uguale (=), devono essere codificati. Ad esempio, se il codice di autenticazione include un simbolo più (\+), nella richiesta va codificato come %2B. La codifica per la barra è %2F, mentre per l'uguale è %3D.

Per esempi di codifica Base64, consulta di Amazon 3 [Esempi di autenticazione](#RESTAuthenticationExamples).