11.5. Esempio¶
Un RP fornisce servizi per i quali è necessaria un’autenticazione di liv 1 o di livello 2.
Il RP, per consentire l’accesso, effettua una richiesta di autenticazione, all’OP con acr_values=https://www.spid.gov.it/SpidL2 https://www.spid.gov.it/SpidL1
L’“authorization server” autentica l’utente, sulla base del Livello SPID richiesto dal RP (Livello 1 o Livello 2 o Livello 3), c.d. “autenticazione originaria”, e rilascia un unico “access_token” sia per il Livello SPID 1 sia per il Livello SPID richiesto dal SP, con una scadenza di 15 minuti, e rilascia un “refresh_token” per il solo livello SPID 1 con scadenza 30 giorni.
L’OP consente l’accesso sia al livello «SPID1» sia al livello «SPID2» per 15 mins mediante l’“access_token”.
Quando l’“access_token” scade, l’OP non consente l’accesso con tale l’access token e il RP deve ottenere un nuovo «access_token» tramite nuova autenticazione oppure tramite una «richiesta di refresh».
Il RP effettua una “richiesta di refresh” con il refresh_token.
Il “token endpoint” verifica la validità del refresh_token, e se nella richiesta di autenticazione originaria era presente nell’“acr_values” il livello “SPID1”, rilascia un nuovo ID Token valido esclusivamente per il livello «SPID1» con scadenza a 30 giorni dall’autenticazione originaria.
Esempio (chiamata HTTP):
https://op.spid.agid.gov.it/auth?request=eyJhbGciOiJSUzI1NiIs ImtpZCI6ImsyYmRjIn0.ew0KICJpc3MiOiAiczZCaGRSa3F0MyIsDQogImF1ZCI6ICJod HRwczovL3NlcnZlci5leGFtcGxlLmNvbSIsDQogInJlc3BvbnNlX3R5cGUiOiAiY29kZS BpZF90b2tlbiIsDQogImNsaWVudF9pZCI6ICJzNkJoZFJrcXQzIiwNCiAicmVkaXJlY3R fdXJpIjogImh0dHBzOi8vY2xpZW50LmV4YW1wbGUub3JnL2NiIiwNCiAic2NvcGUiOiAi b3BlbmlkIiwNCiAic3RhdGUiOiAiYWYwaWZqc2xka2oiLA0KICJub25jZSI6ICJuLTBTN l9XekEyTWoiLA0KICJtYXhfYWdlIjogODY0MDAsDQogImNsYWltcyI6IA0KICB7DQogIC AidXNlcmluZm8iOiANCiAgICB7DQogICAgICJnaXZlbl9uYW1lIjogeyJlc3NlbnRpYWw iOiB0cnVlfSwNCiAgICAgIm5p |
Esempio (contenuto del JWT):
{
client_id=https%3A%2F%2Frp.spid.agid.gov.it,
code_challenge=qWJlMe0xdbXrKxTm72EpH659bUxAxw80,
code_challenge_method=S256,
nonce=MBzGqyf9QytD28eupyWhSqMj78WNqpc2
prompt=login,
redirect_uri=https%3A%2F%2Frp.spid.agid.gov.it%2Fcallback1%2F,
response_type=code,
scope=openid offline_access,
acr_values=https://www.spid.gov.it/SpidL2 https://www.spid.gov.it/SpidL1,
claims={
"userinfo":{
"https://attributes.spid.gov.it/name": null,
"https://attributes.spid.gov.it/familyName": null
},
}&
state=fyZiOL9Lf2CeKuNT2JzxiLRDink0uPcd
}
Parametro | Descrizione | Valori ammessi | Obbligatorio |
client_id | URI che identifica univocamente il ad un valore RP come da Registro SPID. | Deve corrispondere nel Registro SPID. | SI |
code_challenge | Un challenge per PKCE da riportare anche nella successiva richiesta al Token endpoint. | V. paragrafo 6.1 «Generazione del code_challenge per PKCE» | SI |
code_challenge_method | Metodo di costruzione del challenge PKCE. | È obbligatorio specificare il valore S256 | SI |
Nonce | Valore che serve ad evitare attacchi Reply, generato casualmente e non prevedibile da Questo valore sarà restituito nell’ID Token fornito dal Token Endpoint, in modo da consentire al client di verificare che sia uguale a quello inviato nella richiesta di autenticazione. | Stringa di almeno 32 caratteri alfanumerici. | SI |
Prompt | Definisce se l’OP deve occuparsi di eseguire una richiesta di autenticazione all’utente o meno. | consent: l’OP chiederà le le credenziali di all’utente (ma solo se non è già attiva una sessione di Single Sign-On) e successivamente chiederà il consenso al trasferimento degli attributi (valore consigliato) consent login: l’OP chiederà sempre le credenziali di autenticazione all’utente e successivamente chiederà il consenso al trasferimento degli attributi (valore da utilizzarsi limitatamente ai casi in cui si vuole forzare la riautenticazione) |
SI |
redirect_uri | URL dove l’OP reindirizzerà l’utente al termine del processo di autenticazione. | Deve essere uno degli URL indicati nel client metadata (v. paragrafo 3.2). | SI |
response_type | Il tipo di credenziali che deve restituire l’OP. | code | SI |
Scope | Lista degli scope richiesti. | openid (obbligatorio) offline_access: se specificato, l’OP rilascerà oltre all’access token anche un refresh token necessario per instaurare sessioni lunghe revocabili. L’uso di questo valore è consentito solo se il client è un’applicazione per dispositivi mobili che intenda offrire all’utente una sessione lunga revocabile. | SI |
Claims | Lista dei claims (attributi) che un RP intende richiedere per il servizio. | vedi paragrafo 5.1 | SI |
acr_values | Livello minimo SPID richiesto. | Se sono richiesti più livelli, occorre indicarli in ordine di preferenza, separati da uno spazio. | SI |
State | Valore univoco utilizzato per mantenere lo stato tra la request e il callback. Questo valore verrà restituito al client nella risposta al termine dell’autenticazione. Il valore deve essere significativo esclusivamente per il RP e non deve essere intellegibile ad altri. | Stringa di almeno almeno 32 caratteri alfanumerici. | SI |
response_mode | http://openid.net/specs/oauth-v2-form-post-response-mode-1_0.html#FormPostResponseMode | form_post | SI |
ui_locales | Lingue preferibili per visualizzare le pagine dell’OP. L’OP può ignorare questo parametro se non dispone di nessuna delle lingue indicate. | Lista di codici RFC5646 separati da spazi. | NO |
Esempio Refresh (chiamata HTTP):
POST /token HTTP/1.1
Host: server.example.com
Content-Type: application/x-www-form-urlencoded
client_id=https%3A%2F%2Frp.spid.agid.gov.it
&grant_type=refresh_token
&refresh_token=8xLOxBtZp8
&scope=opened
|
Parametro | Descrizione | Valori ammessi |
client_id | URI che identifica univocamente il RP come da Registro SPID. | Deve corrispondere alm valore del client_id della authentication request. |
grant_type | Tipo di credenziale presentata dal Client per la richiesta corrente. | Deve assumere il valore: refresh_token |
refresh_token | ||
Scope | openid |
Nel caso in cui il Token Endpoint rifiuti la concessione di un nuovo ID token e access token, l’utente dovrà effettuare un nuovo login SPID.
Nel caso in cui sia necessario accedere all’applicazione con un livello superiore a SPID di Livello 1, occorre effettuare una nuova autenticazione SPID in base al livello richiesto.
Se la Refresh Request è valida, l’OpenID Connect Provider restituisce un ID Token con i seguenti parametri:
Parametro | Descrizione | Valori ammessi |
Iss | Identificatore dell’OP che lo contraddistingue univocamente nella federazione nel formato Uniform Resource Locator (URL). | Deve essere lo stesso indicato nell’ID Token emesso nell’autenticazione originaria. |
Sub | Per il valore di questo parametro fare riferimento allo standard “OpenID Connect Core 1.0”, paragrafo 8.1. “Pairwise Identifier Algorithm”. | Deve essere lo stesso indicato nell’ID Token emesso nell’autenticazione originaria. |
Aud | Contiene il client ID. | Deve essere lo stesso indicato nell’ID Token emesso nell’autenticazione originaria. |
Acr | Livello di autenticazione ammesso a seguito di richiesta di refresh | https://www.spid.gov.it/SpidL1 |
at_hash | Hash dell’Access Token; il suo valore è la codifica base64url della prima metà dell’hash del valore access_token, usando l’algoritmo di hashing indicato in alg nell’header dell’ID Token. | Il client è tenuto a verificare che questo valore corrisponda all’access token restituito insieme all’ID Token. |
Iat | Data/ora di emissione del token in formato UTC. | |
Nbf | Data/ora di inizio validità del token in formato UTC. Deve corrispondere con il valore di iat. | |
Exp | Data/ora di scadenza del token in formato UTC | |
Jti | Identificatore unico dell’ID Token che il client può utilizzare per prevenirne il riuso, rifiutando l’ID Token se già processato. Deve essere di difficile individuazione da parte di un attaccante e composto da una stringa casuale. | |
Nonce | Stringa casuale generata dal Client per ciascuna sessione utente ed inviata nell’Authentication Request (parametro nonce), finalizzata a mitigare attacchi replay. | Il client è tenuto a verificare che coincida con quella inviata nell’Authentication Request. |
Il refresh token ottenuto con la richiesta di autenticazione ha una validità massima di 30 giorni, entro i quali potrà essere utilizzato un numero illimitato di volte. Allo scadere dei 30 giorni non potrà più essere utilizzato e sarà necessario rieseguire l’autenticazione completa.
Riferimenti: