Le richieste canoniche definiscono gli elementi di una richiesta che un utente deve includere quando invia richieste autenticate con firma V4, ad esempio URL firmati, a Cloud Storage.
Panoramica
Una richiesta canonica è una stringa che rappresenta una richiesta HTTP specifica a Cloud Storage. Utilizzi una richiesta canonica insieme a una chiave crittografica, ad esempio una chiave RSA, per creare una firma che viene poi inclusa nella richiesta effettiva come autenticazione.
Una richiesta canonica include informazioni come il verbo HTTP, i parametri della stringa di query e le intestazioni che verranno utilizzate nella richiesta effettiva, nonché l'oggetto, il bucket o un'altra risorsa da richiedere.
Una richiesta canonica garantisce che quando Cloud Storage riceve la richiesta, possa calcolare la stessa firma che hai calcolato. Se la tua versione e quella calcolata da Cloud Storage non corrispondono, la richiesta non va a buon fine.
Strutturazione
Le richieste canoniche hanno la seguente struttura, incluso l'utilizzo di nuove righe tra ogni elemento:
HTTP_VERB PATH_TO_RESOURCE CANONICAL_QUERY_STRING CANONICAL_HEADERS SIGNED_HEADERS PAYLOAD
Verbi HTTP
Le richieste firmate possono utilizzare i seguenti verbi HTTP, che devono essere specificati come parte della richiesta canonica:
DELETE
GET
HEAD
POST
1PUT
1 Gli URL firmati possono essere utilizzati solo per le richieste POST
che avviano un caricamento ripristinabile. Per ulteriori informazioni, consulta la sezione Utilizzo degli URL firmati con i caricamenti ripristinabili.
Percorso della risorsa
Le richieste canoniche includono il percorso della risorsa a cui si applica la richiesta. Il percorso della risorsa è tutto ciò che segue il nome host ma precede qualsiasi stringa di query.
Ad esempio, se l'URL di Cloud Storage è
https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg
,
il percorso della risorsa è /example-bucket/cat-pics/tabby.jpeg
.
Se utilizzi un URL Cloud Storage alternativo, ad esempio
https://example-bucket.storage.googleapis.com/cat-pics/tabby.jpeg
il percorso della risorsa è /cat-pics/tabby.jpeg
.
Per altri endpoint URL che possono essere utilizzati con gli URL firmati, consulta Endpoint delle richieste API XML.
Quando definisci il percorso della risorsa, devi codificare in percentuale i seguenti caratteri riservati: ?=!#$&'()*+,:;@[]"
Qualsiasi altra codifica in percentuale utilizzata nell'URL deve essere inclusa anche nel percorso della risorsa.
Stringa di query canonica
Le richieste canoniche specificano ogni parametro della stringa di query che verrà successivamente
incluso in qualsiasi richiesta firmata che utilizza la firma pertinente, con l'eccezione del
parametro della stringa di query X-Goog-Signature
o X-Amz-Signature
.
La stringa di query specificata nella richiesta canonica è chiamata
stringa di query canonica
La stringa di query è tutto ciò che segue il punto interrogativo (?
) alla fine
del percorso della risorsa.
Ad esempio, se l'URL di Cloud Storage è
https://storage.googleapis.com/example-bucket/cat-pics/tabby.jpeg?generation=1360887697105000&userProject=my-project
,
la stringa di query è generation=1360887697105000&userProject=my-project
.
Quando costruisci la stringa di query canonica:
I parametri nella stringa di query devono essere ordinati per nome utilizzando un ordinamento lessicografico in base al valore del punto di codice.
Ogni parametro nella stringa di query deve essere separato da
&
.Se la stringa di query canonica è vuota, questa parte della richiesta canonica complessiva è solo una nuova riga (
\n
).
Parametri stringa di query obbligatori
La maggior parte dei parametri della stringa di query viene aggiunta in base alle necessità, ma i seguenti devono essere inclusi nella richiesta canonica se intendi utilizzarla per creare un URL firmato:
X-Goog-Algorithm
: l'algoritmo che utilizzerai per firmare l'URL. I valori validi sonoGOOG4-RSA-SHA256
eGOOG4-HMAC-SHA256
.X-Goog-Credential
: Le credenziali che utilizzerai per firmare l'URL. Le credenziali sono costituite da un autorizzatore e da un ambito delle credenziali nel formato:AUTHORIZER%2FCREDENTIAL_SCOPE
. L'autorizzatore può essere un nome del service account o un ID accesso alla chiave HMAC.X-Goog-Date
: la data e l'ora in cui l'URL firmato diventa utilizzabile, nel formato ISO 8601 di baseYYYYMMDD'T'HHMMSS'Z'
.X-Goog-Expires
: la durata dell'URL firmato, misurata in secondi a partire daX-Goog-Date
. Il valore di scadenza più lungo è 604800 secondi (7 giorni).X-Goog-SignedHeaders
: un elenco separato da punto e virgola dei nomi delle intestazioni definite nella richiesta canonica. Questi sono noti anche come intestazioni firmate.host
deve essere uno dei nomi delle intestazioni.
Questi parametri della stringa di query devono essere utilizzati successivamente nell'URL firmato, insieme al parametro della stringa di query X-Goog-Signature
, che contiene
la firma che autentica la richiesta.
Intestazioni canoniche
Le richieste canoniche includono tutte le intestazioni che devono essere incluse successivamente nelle richieste firmate che utilizzano la firma pertinente. Tuttavia, queste richieste firmate possono includere intestazioni aggiuntive non specificate nella richiesta canonica, ad eccezione di quanto indicato in intestazioni richieste. Le intestazioni specificate nella richiesta canonica sono chiamate intestazioni canoniche.
Le intestazioni canoniche possono includere intestazioni personalizzate e intestazioni di estensione
che iniziano con x-goog-
.
Quando specifichi le intestazioni canoniche, tieni presente quanto segue:
- Rendi tutti i nomi delle intestazioni in minuscolo.
- Ordina tutte le intestazioni per nome utilizzando un ordinamento lessicografico in base al valore del punto di codice.
- Separa ogni intestazione con una nuova riga (
\n
). - Elimina i nomi delle intestazioni duplicati creando un nome di intestazione con un elenco di valori separati da virgole. Assicurati che non ci siano spazi vuoti tra i valori e che l'ordine dell'elenco separato da virgole corrisponda all'ordine in cui vengono visualizzate le intestazioni nella richiesta. Per ulteriori informazioni, consulta la sezione 3.2 di RFC 7230.
- Sostituisci gli eventuali spazi vuoti o nuove righe (CRLF o LF) con un unico spazio. Per ulteriori informazioni sugli spazi vuoti di piegatura, consulta RFC 7230, sezione 3.2.4.
Rimuovi gli spazi vuoti intorno ai due punti che seguono il nome dell'intestazione.
Ad esempio, l'utilizzo dell'intestazione personalizzata
x-goog-acl: private
senza rimuovere lo spazio dopo i due punti restituisce un errore403 Forbidden
, perché la firma della richiesta che calcoli non corrisponde alla firma calcolata da Cloud Storage.
Esempio
Se hai il seguente insieme di intestazioni:
host: storage.googleapis.com content-type: text/plain x-goog-meta-reviewer: jane x-goog-meta-reviewer: john
La costruzione delle intestazioni canoniche nella richiesta canonica sarebbe:
content-type:text/plain host:storage.googleapis.com x-goog-meta-reviewer:jane,john
Intestazioni canoniche obbligatorie
La maggior parte delle intestazioni, ad esempio content-type
, vengono aggiunte in base alle necessità, ma le seguenti
intestazioni devono sempre essere definite nelle intestazioni canoniche se intendi utilizzarle
nella richiesta firmata:
host
: l'URI utilizzato per accedere a Cloud Storage.- Intestazioni con prefisso
x-goog-
. L'unica intestazione di questo tipo che è facoltativo includere come intestazione canonica èx-goog-content-sha256
. - Intestazioni con prefisso
x-amz-
. L'unica intestazione di questo tipo che è facoltativo includere come intestazione canonica èx-amz-content-sha256
.
Intestazioni firmate
Un'intestazione firmata è la parte del nome di un'intestazione canonica.
Per creare l'elenco delle intestazioni firmate, converti tutti i nomi delle intestazioni in minuscolo, ordinali
in base al codice carattere e utilizza un punto e virgola (;
) per separarli.
Esempio
Se hai il seguente insieme di intestazioni:
host: storage.googleapis.com content-type: text/plain x-goog-meta-reviewer: jane x-goog-meta-reviewer: john
La costruzione delle intestazioni firmate nella richiesta canonica sarebbe:
content-type;host;x-goog-meta-reviewer
Payload
Se la richiesta canonica verrà utilizzata per creare un URL firmato, questo valore deve essere la stringa
UNSIGNED-PAYLOAD
.Se la tua richiesta canonica verrà utilizzata per creare una firma da utilizzare in un'intestazione
Authorization
:Utilizza
UNSIGNED-PAYLOAD
se vuoi consentire payload arbitrari come parte della richiesta.Utilizza
UNSIGNED-PAYLOAD
se la richiesta avvierà un caricamento ripristinabile, perché l'intestazionex-goog-content-sha256
viene ignorata per i caricamenti ripristinabili.Se vuoi consentire solo un payload specifico, questo valore deve essere un hash SHA-256 con codifica esadecimale in lettere minuscole del payload previsto. Per richiedere un payload vuoto, utilizza una stringa vuota come input della funzione hash. Un esempio di payload sottoposto ad hashing (in questo caso un payload vuoto) è:
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Esempio
Di seguito è riportato un esempio di richiesta canonica formattata correttamente, con
i caratteri di nuova riga visualizzati come nuove righe effettive e non \n
:
GET /example-bucket/tabby.jpeg host:storage.googleapis.com x-amz-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 x-amz-date:20190301T190859Z host;x-amz-content-sha256;x-amz-date e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
Passaggi successivi
- Scopri di più sulle firme e su come utilizzano le richieste canoniche.
- Crea una richiesta che utilizzi una richiesta canonica.
- Crea URL firmati, che utilizzano richieste canoniche.
- Scopri di più sugli URL firmati.