Richieste canoniche

Le richieste canoniche definiscono gli elementi di una richiesta che un utente deve includere quando invia richieste V4 con autenticazione basata sulla firma, ad esempio URL firmati, a Cloud Storage.

Panoramica

Una richiesta canonica è una stringa che rappresenta una richiesta HTTP specifica a Cloud Storage. Puoi utilizzare una richiesta canonica insieme a una chiave di crittografia, ad esempio una chiave RSA, per creare una firma che verrà 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 dovrebbero essere 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 da te calcolata. 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
  • POST1
  • PUT

1 Gli URL firmati possono essere utilizzati solo per le richieste POST che avviano un caricamento ripristinabile. Per ulteriori informazioni, consulta la sezione Utilizzo di URL firmati con caricamenti ripristinabili.

Percorso della risorsa

Le richieste canoniche includono il percorso della risorsa a cui si applica la richiesta. Il percorso della risorsa è costituito da 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 di Cloud Storage alternativo come https://example-bucket.storage.googleapis.com/cat-pics/tabby.jpeg, il percorso della risorsa è /cat-pics/tabby.jpeg.

Per ulteriori endpoint URL che possono essere utilizzati con URL firmati, consulta Endpoint di richiesta API XML.

Quando definisci il percorso della risorsa, devi codificare a percentuale i seguenti caratteri riservati: ?=!#$&'()*+,:;@[]" Anche qualsiasi altra codifica percentuale utilizzata nell'URL deve essere inclusa nel percorso della risorsa.

Stringa di query canonica

Le richieste canoniche specificano ciascun parametro della stringa di query che verrà successivamente incluso in qualsiasi richiesta firmata che utilizza la firma pertinente, ad 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.

Al momento di creare la stringa di query canonica:

  • I parametri nella stringa di query devono essere ordinati per nome utilizzando un ordinamento lessicografico per valore in punti di codice.

  • Ogni parametro nella stringa di query deve essere separato da &.

  • Se la stringa di query canonica è vuota, questa parte della richiesta canonica generale è solo una nuova riga (\n).

Parametri stringa di query obbligatori

La maggior parte dei parametri delle stringhe di query viene aggiunta in base alle esigenze, ma i seguenti elementi devono essere inclusi nella richiesta canonica quando intendi utilizzarla per creare un URL firmato:

  • X-Goog-Algorithm: l'algoritmo che utilizzerai per firmare l'URL. I valori validi sono GOOG4-RSA-SHA256 e GOOG4-HMAC-SHA256.
  • X-Goog-Credential: le credenziali che userai per firmare l'URL. Le credenziali consistono in un'autorizzazione e in un ambito delle credenziali specificato nel formato: AUTHORIZER%2FCREDENTIAL_SCOPE. L'autorizzazione può essere un nome dell'account di servizio o un ID di accesso alla chiave HMAC.
  • X-Goog-Date: la data e l'ora in cui l'URL firmato diventa utilizzabile, nel formato di base ISO 8601 YYYYMMDD'T'HHMMSS'Z'.
  • X-Goog-Expires: la durata dell'URL firmato, misurata in secondi a partire dal giorno X-Goog-Date. Il valore di scadenza più lungo è 604.800 secondi (7 giorni).
  • X-Goog-SignedHeaders: un elenco separato da punti e virgola di nomi delle intestazioni definite nella richiesta canonica. Sono anche note come intestazioni firmate. host deve essere uno dei nomi delle intestazioni.

Questi parametri della stringa di query in seguito devono essere utilizzati nell'URL firmato stesso, 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 successivamente incluse nelle richieste firmate che utilizzano la firma pertinente. Tuttavia, queste richieste firmate possono includere intestazioni aggiuntive che non sono state specificate nella richiesta canonica, ad eccezione di quanto indicato nelle intestazioni obbligatorie. Le intestazioni specificate nella richiesta canonica sono chiamate intestazioni canoniche.

Le intestazioni canoniche possono includere intestazioni personalizzate e intestazioni di estensioni 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 per valore di punto di codice.
  • Separa ogni intestazione con una nuova riga (\n).
  • Elimina i nomi delle intestazioni duplicati creandone un solo con un elenco di valori separati da virgole. Assicurati che non vi siano spazi vuoti tra i valori e che l'ordine dell'elenco separato da virgole corrisponda all'ordine in cui le intestazioni vengono visualizzate nella richiesta. Per ulteriori informazioni, consulta la RFC 7230 sezione 3.2.
  • Sostituisci eventuali spazi vuoti pieghevoli o nuove righe (CRLF o LF) con un singolo spazio. Per ulteriori informazioni sulla piegatura dello spazio vuoto, consulta RFC 7230, sezione 3.2.4.
  • Rimuovi gli spazi vuoti intorno ai due punti visualizzati dopo 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 errore 403 Forbidden, perché la firma della richiesta calcolata 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 struttura 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, viene aggiunta secondo 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 relativa al nome di un'intestazione canonica.

Per creare l'elenco delle intestazioni firmate, converti tutti i nomi delle intestazioni in lettere minuscole, ordinali per codice di 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 struttura delle intestazioni firmate nella richiesta canonica sarebbe:

content-type;host;x-goog-meta-reviewer

Payload

  • Se la tua richiesta canonica verrà utilizzata per creare un URL firmato, questo valore deve essere la stringa UNSIGNED-PAYLOAD.

  • Se la tua richiesta canonica verrà utilizzata come parte di una richiesta che utilizza un'intestazione Authorization:

    • Utilizza UNSIGNED-PAYLOAD se vuoi consentire payload arbitrari come parte della richiesta. Quando avvii una richiesta di caricamento ripristinabile, ti consigliamo inoltre di utilizzare UNSIGNED-PAYLOAD. Qualsiasi valore sha256 incluso viene ignorato per i caricamenti ripristinabili.

    • Se vuoi consentire solo un payload specifico, questo valore deve essere un hash SHA-256 con codifica esadecimale minuscolo del payload desiderato. Per richiedere un payload vuoto, utilizza una stringa vuota come input della funzione hash. Un esempio di payload con hash (in questo caso un payload vuoto) è:

      e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855

Esempio

Di seguito è riportato un esempio di richiesta canonica formata correttamente, con i ritorni a capo mostrati 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