Passa al contenuto principale

2.2. Derived Components (Componenti derivati)

2.2. Derived Components (Componenti derivati)

Oltre ai campi HTTP, esistono diverse componenti derivabili dai control data, dal contesto della firma o da altri aspetti del messaggio firmato. Tali componenti derivate possono essere incluse nella base definendo nome, parametri possibili, target del messaggio e metodo di derivazione del valore.

I nomi delle componenti derivate DEVONO iniziare con il carattere @. Ciò li distingue dai nomi dei campi HTTP, che non possono contenere @ (Sezione 5.1 di [HTTP]). I processori DEVONO trattare i nomi derivati separatamente dai nomi di campo (Sezione 7.5.1).

Questa specifica definisce le seguenti componenti derivate:

@method — Metodo usato per una richiesta (Sezione 2.2.1).

@target-uri — URI target completo della richiesta (Sezione 2.2.2).

@authority — Authority dell'URI target (Sezione 2.2.3).

@scheme — Schema dell'URI target (Sezione 2.2.4).

@request-target — Request target (Sezione 2.2.5).

@path — Porzione di percorso assoluto dell'URI target (Sezione 2.2.6).

@query — Porzione di query dell'URI target (Sezione 2.2.7).

@query-param — Parametro di query analizzato e codificato (Sezione 2.2.8).

@status — Codice di stato della risposta (Sezione 2.2.9).

Altri nomi sono nel registro "HTTP Signature Derived Component Names" (Sezione 6.4).

I valori sono tratti dal contesto del messaggio di destinazione, inclusi control data e stato aggiuntivo del firmatario o verificatore. Firmando una risposta, il firmatario può includere componenti derivate dalla richiesta originaria con req (Sezione 2.4).

request: Valori derivati da e applicati a un messaggio di richiesta HTTP (Sezione 3.4 di [HTTP]). Se il messaggio di destinazione è una risposta, le componenti che puntano alla richiesta possono usare req (Sezione 2.4).

response: Valori derivati da e applicati a una risposta HTTP (Sezione 3.4 di [HTTP]).

request, response: Valori derivati da e applicati a richiesta o risposta.

Una definizione di componente derivata DEVE definire tutti i tipi di messaggio target a cui può applicarsi.

I valori delle componenti derivate DEVONO essere limitati a caratteri stampabili e spazi e NON DEVONO contenere newline. NON DEVONO iniziare o finire con spazi bianchi.

2.2.1. Metodo (@method)

@method si riferisce al metodo HTTP della richiesta. Il valore è il nome del metodo come stringa. Il nome è sensibile alle maiuscole ([HTTP], Sezione 9.1). I nomi standardizzati sono di solito maiuscoli [ASCII]; non si applica trasformazione di maiuscole.

Esempio:

POST /path?param=value HTTP/1.1
Host: www.example.com

Valore: POST. Riga base: "@method": POST

2.2.2. URI target (@target-uri)

@target-uri è l'URI target della richiesta ([HTTP], Sezione 7.1), assemblato da tutti i componenti URI disponibili, inclusa l'authority.

Esempio su HTTPS:

POST /path?param=value HTTP/1.1
Host: www.example.com

Valore: https://www.example.com/path?param=value

Riga: "@target-uri": https://www.example.com/path?param=value

2.2.3. Authority (@authority)

@authority è il componente authority dell'URI target ([HTTP], Sezione 7.2). In HTTP/1.1 di solito tramite Host, in HTTP/2/3 tramite pseudo-header :authority. È la stringa authority completa (host e opzionalmente porta). Il valore DEVE essere normalizzato ([HTTP], Sezione 4.2.3): hostname minuscolo, porta predefinita omessa.

Esempio:

POST /path?param=value HTTP/1.1
Host: www.example.com

www.example.com"@authority": www.example.com

È RACCOMANDATO usare @authority invece di firmare direttamente Host (Sezione 7.2.4).

2.2.4. Schema (@scheme)

@scheme è lo schema dell'URL target, stringa minuscola ([HTTP], Sezione 4.2). Lo schema non è sensibile alle maiuscole ma DEVE essere normalizzato in minuscolo.

HTTP in chiaro:

POST /path?param=value HTTP/1.1
Host: www.example.com

Valore http"@scheme": http

2.2.5. Request target (@request-target)

@request-target è il request target completo ([HTTP], Sezione 7.1). Per HTTP/1.1 equivale alla porzione request line; in altre versioni è più difficile costruirlo in modo affidabile. NON è RACCOMANDATO usarlo quando possono essere in uso versioni diverse da 1.1.

Form origin: percorso assoluto + query.

POST /path?param=value HTTP/1.1
Host: www.example.com

"/path?param=value""@request-target": /path?param=value

Proxy con forma assoluta:

GET https://www.example.com/path?param=value HTTP/1.1

Stesso valore nell'URI completo.

CONNECT authority-form:

CONNECT www.example.com:80 HTTP/1.1 con Host: www.example.comwww.example.com:80

OPTIONS asterisk-form: *"@request-target": *

2.2.6. Percorso (@path)

@path è il percorso assoluto del target senza query e senza ? finale, normalizzato ([HTTP] 4.2.3): percorso vuoto → /. I componenti del percorso sono i valori prima della decodifica percent-encoded ([URI] 6.2.1).

GET /path?param=value HTTP/1.1
Host: www.example.com

"/path"

2.2.7. Query (@query)

@query è l'intera query normalizzata [URI], incluso il ? iniziale. Percent-encoded non decodificati ([URI] 6.2.1).

GET /path?param=value&foo=bar&baz=bat%2Dman HTTP/1.1
Host: www.example.com

?param=value&foo=bar&baz=bat%2Dman

Con ?queryString sola: ?queryString

Se la query assente, il valore è solo ? per indicare componente vuota: "@query": ?

2.2.8. Parametri di query (@query-param)

Se la query usa parametri form HTML (Sezione 5 di [HTMLURL], application/x-www-form-urlencoded), @query-param indirizza singoli parametri. I parametri DEVONO essere analizzati secondo la Sezione 5.1 di [HTMLURL], producendo coppie (nameString, valueString). Il parametro RICHIESTO name nell'identificatore contiene il nameString codificato come String. Il valore della componente è il valueString codificato di quel parametro. Più parametri nominati POSSONO essere inclusi; POSSONO comparire in qualsiasi ordine nell'elenco coperto.

Processo per name e valore:

  1. Analizzare nameString o valueString (Sezione 5.1 [HTMLURL]) dopo decodifica percent-encoded.

  2. Codificare con "percent-encode after encoding" (Sezione 5.2 [HTMLURL]) → stringa ASCII [ASCII].

  3. Output della stringa ASCII.

Il valore non include ?, = o & di separazione. Valori vuoti: stringa vuota (alcune librerie eliminano valori vuoti).

Se un parametro nominato è coperto ma assente nella query, ciò DEVE causare errore nella generazione della base.

Esempio:

GET /path?param=value&foo=bar&baz=batman&qux= HTTP/1.1
Host: www.example.com

Valori di componente per i parametri nominati baz, qux e param:

baz: batman

qux: stringa vuota

param: value

Righe nella base (con (SP) = singolo spazio finale prima del valore vuoto):

"@query-param";name="baz": batman "@query-param";name="qux":(SP) "@query-param";name="param": value

Limitazioni: solo UTF-8 percent-escaped come in [HTMLURL] Sezione 5; istanze multiple dello stesso nome non sono supportate in modo affidabile sul campo — il parametro nominato NON DEVE essere incluso se il nome compare più volte. Se comune nell'applicazione, è RACCOMANDATO firmare l'intera query con @query (Sezione 2.2.7).

Esempio con newline e + (RFC 8792):

GET /parameters?var=this%20is%20a%20big%0Amultiline%20value&\
bar=with+plus+whitespace&fa%C3%A7ade%22%3A%20=something HTTP/1.1
Host: www.example.com
Date: Tue, 20 Apr 2021 02:07:56 GMT

Valori codificati come nell'RFC. Senza codifica, stringhe con caratteri illegali per nomi/valori.

2.2.9. Codice di stato (@status)

@status è il codice di stato numerico a tre cifre ([HTTP], Sezione 15), solo intero senza testo descrittivo.

HTTP/1.1 200 OK
Date: Fri, 26 Mar 2010 00:05:00 GMT

200"@status": 200

L'identificatore @status NON DEVE essere usato in un messaggio di richiesta.