Token Endpoint¶
Al termine del flusso di autenticazione descritto nel paragrafo precedente, il RP invia una richiesta al Token Endpoint inviando l'authorization code ricevuto dall'OP per ottenere un ID Token e un Access Token ed eventualmente un Refresh Token (se è stata effettuata una richiesta di autenticazione con scope=offline_access e prompt=consent. Vedi la Sezione Refresh Token).
I token restituiti devono essere JWT firmati.
Nota
Il metodo di autenticazione del RP presso il token endpoint è il private_key_jwt (OpenID.Core#ClientAuthentication).
Vedi anche
Request¶
Di seguito i claim che DEVONO essere inseriti nella Token Request.
Esempio di richiesta con authorization code (caso 1)
POST /token HTTP/1.1 Host: https://op.spid.agid.gov.it Content-Type: application/x-www-form-urlencoded client_id=https://rp.spid.agid.gov.it& client_assertion=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiw ibmFtZSI6IlNQSUQiLCJhZG1pbiI6dHJ1ZX0.LVyRDPVJm0S9q7oiXcYVIIqGWY0wWQlqxvFGYswL…& client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwtbearer& code=usDwMnEzJPpG5oaV8x3j& code_verifier=9g8S40MozM3NSqjHnhi7OnsE38jklFv2& grant_type=authorization_code
Esempio di richiesta con Refresh Token (caso 2):
POST /token HTTP/1.1 Host: https://op.spid.agid.gov.it Content-Type: application/x-www-form-urlencoded client_id=https://rp.spid.agid.gov.it& client_assertion=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiw ibmFtZSI6IlNQSUQiLCJhZG1pbiI6dHJ1ZX0.LVyRDPVJm0S9q7oiXcYVIIqGWY0wWQlqxvFGYswL…& client_assertion_type=urn%3Aietf%3Aparams%3Aoauth%3Aclient-assertion-type%3Ajwtbearer& grant_type=refresh_token& refresh_token=8xLOxBtZp8
Claim |
Descrizione |
Supportato da |
---|---|---|
client_id |
Vedi OpenID.Registration. DEVE essere valorizzato con un HTTPS URL che identifica univocamente il RP. |
|
client_assertion |
JWT firmato con la chiave privata del Relying Party contenente i seguenti parametri:
|
|
client_assertion_type |
Deve assumere il seguente valore: |
|
code |
Codice di autorizzazione restituito nell'Authentication response. Obbligatorio solo se grant_type è authorization_code |
|
code_verifier |
Codice di verifica del code_challenge. Obbligatorio solo se grant_type è authorization_code |
|
grant_type |
Tipo di credenziale presentata dal RP per la richiesta corrente. PUÒ assumere uno dei seguenti valori:
|
|
refresh_token |
Obbligatorio solo se grant_type è refresh_token |
Response¶
L'OpenID Provider (OP) restituisce un ID Token e Access Token e un eventuale Refresh Token, in formato JWT firmato.
L'Access Token deve essere formato secondo le indicazioni dello standard "International Government Assurance Profile (iGov) for OAuth 2.0 - Draft 03", section 3.2.1, "JWT Bearer Tokens".
L'ID Token deve essere formato secondo le indicazioni del paragrafo successivo.
La risposta DEVE contenere i seguenti claim.
Esempio di risposta:
HTTP/1.1 200 OK
Last-Modified: Wed, 22 Jul 2018 19:15:56 GMT
Content-Type: application/json
{
"access_token":"dC34Pf6kdG...",
"token_type":"Bearer",
"refresh_token":"wJ848BcyLP...",
"expires_in":1800,
"id_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY..."
}
Claim |
Descrizione |
Supportato da |
---|---|---|
access_token |
L'Access Token, in formato JWT firmato, consente l'accesso allo UserInfo endpoint per ottenere gli attributi. |
|
token_type |
Tipo di Access Token restituito. DEVE essere valorizzato sempre con Bearer |
|
refresh_token |
Disponibile sono nel caso di sessione lunga revocabile. Il Refresh Token, in formato JWT firmato, consente di chiamare nuovamente il Token Endpoint per ottenere un nuovo Access Token e un nuovo ID Token. |
|
expires_in |
Scadenza dell'Access Token in secondi. |
|
id_token |
ID Token in formato JWT (vedi paragrafo successivo) |
Access Token¶
L'Access Token è un JSON Web Token (JWT) firmato che consente l'accesso allo UserInfo endpoint per ottenere gli attributi dell'utente. Di seguito i claim che compongono l'Access Token.
Esempio del contenuto di intestazione di payload di un Access Token:
{
"alg": "RS256",
"kid": "dB67gL7ck3TFiIAf7N6_7SHvqk0MDYMEQcoGGlkUAAw",
"typ": "at+jwt"
}
.
{
"iss":"https://op.spid.agid.gov.it",
"sub": "9sd798asd98asui23hiuds89y798sfyg",
"aud": "https://op.spid.agid.gov.it/userinfo",
"client_id": "https://rp.spid.example.it",
"scope": "openid",
"jti": "9ea42af0-594c-4486-9602-8a1f8dde42d3",
"exp": 1656859559,
"iat": 1656857579
}
Claim |
Descrizione |
Supportato da |
---|---|---|
iss |
DEVE essere valorizzato con un HTTPS URL che identifica univocamente l'OP. Il client DEVE verificare che questo valore corrisponda all'OP chiamato. |
|
sub |
Vedi OpenID.Core#SubjectIDTypes. DEVE essere di tipo pairwise. |
|
client_id |
DEVE essere valorizzato con un HTTPS URL che identifica univocamente il RP. |
|
aud |
DEVE contenere un elenco di Resource Server che consumano l'AT. DEVE contenere almeno lo UserInfo Endpoint. |
|
scope |
L'OP DOVREBBE inserire il parametro scope come previsto in RFC 9068 Sezione 2.2.3. DEVE coincidere con il valore presente in fase di richiesta di autenticazione. |
|
iat |
UNIX Timestamp con l'istante di generazione del JWT, codificato come NumericDate come indicato in RFC 7519 |
|
exp |
UNIX Timestamp con l'istante di scadenza del JWT, codificato come NumericDate come indicato in RFC 7519 |
|
jti |
DEVE essere una Stringa in formato uuid4. Identificatore unico dell'ID Token che il RP PUÒ utilizzare per prevenirne il riuso, rifiutando l'ID Token se già processato. |
ID Token¶
L'ID Token è un JSON Web Token (JWT) firmato che contiene informazioni sull'utente che ha eseguito l'autenticazione. I RP DEVONO eseguire la validazione dell'ID Token.
Di seguito i claim disponibili nell'ID Token.
Esempio del contenuto di intestazione e di payload di un ID Token:
{
"alg": "RS256",
"kid": "dB67gL7ck3TFiIAf7N6_7SHvqk0MDYMEQcoGGlkUAAw"
}
.
{
"iss":"https://op.spid.agid.gov.it/",
"sub":"9sd798asd98asui23hiuds89y798sfyg",
"aud":"https://rp.spid.example.it/auth",
"acr":"https://www.spid.gov.it/SpidL2",
"at_hash":"qiyh4XPJGsOZ2MEAyLkfWqeQ",
"iat":1519032969,
"nbf":1519032969,
"exp":1519033149,
"jti":"nw4J0zMwRk4kRbQ53G7z",
"nonce":"MBzGqyf9QytD28eupyWhSqMj78WNqpc2"
}
Claim |
Descrizione |
Supportato da |
---|---|---|
iss |
DEVE essere valorizzato con un HTTPS URL che identifica univocamente l'OP. Il client DEVE verificare che questo valore corrisponda all'OP chiamato. |
|
sub |
Vedi OpenID.Core#SubjectIDTypes. DEVE essere di tipo pairwise. |
|
aud |
DEVE coincidere con il valore client_id. Il RP DEVE verificare che questo valore corrisponda al proprio client ID. |
|
acr |
Livello di autenticazione effettivo. DEVE essere uguale o superiore a quello richiesto dal RP nella Authentication Request. |
|
at_hash |
Vedi OpenID.Core#CodeIDToken. Il suo valore è la codifica base64url della prima metà dell'hash calcolato sulla rappresentazione ASCII dell'Access Token, usando l'algoritmo di hashing indicato in alg nell'header dell'ID Token. Il client DEVE verificare che questo valore corrisponda applicando la medesima funzione all'Access Token restituito insieme all'ID Token. |
|
iat |
UNIX Timestamp con l'istante di generazione del JWT, codificato come NumericDate come indicato in RFC 7519 |
|
nbf |
UNIX Timestamp. Istante di inizio validità del JWT in formato NumericDate, come indicato in RFC 7519. DEVE corrispondere con il valore di iat. |
|
exp |
UNIX Timestamp con l'istante di scadenza del JWT, codificato come NumericDate come indicato in RFC 7519 |
|
jti |
DEVE essere una Stringa in formato uuid4. Identificatore unico dell'ID Token che il RP PUÒ utilizzare per prevenirne il riuso, rifiutando l'ID Token se già processato. |
|
nonce |
Vedi OpenID.Core#AuthRequest. DEVE essere una stringa casuale di almeno 32 caratteri alfanumerici. Questo valore DEVE coincidere con quello inviato dal RP nella richiesta di autenticazione. |
Refresh Token¶
Il Refresh Token è un JWT che PUÒ essere rilasciato dall'OP e che PUÒ essere usato per ottenere un nuovo Access Token che abilita il RP ad accedere allo UserInfo endpoint senza interazione diretta dell'utente.
Il Refresh Token DEVE essere rilasciato in formato JWT, firmato, e contenere almeno i seguenti parametri.
Claim |
Descrizione |
Supportato da |
---|---|---|
iss |
DEVE essere valorizzato con un HTTPS URL che identifica univocamente l'OP. Il RP DEVE verificare che questo valore corrisponda all'OP chiamato. |
|
client_id |
DEVE coincidere con il valore client_id. Il RP DEVE verificare che questo valore corrisponda al proprio client ID. |
|
aud |
DEVE contenere il Token Endpoint dell'OP. |
|
iat |
UNIX Timestamp con l'istante di generazione del JWT, codificato come NumericDate come indicato in RFC 7519 |
|
exp |
UNIX Timestamp con l'istante di scadenza del JWT, codificato come NumericDate come indicato in RFC 7519 |
|
jti |
DEVE essere una Stringa in formato uuid4. Identificatore unico del Refresh Token che il RP PUÒ utilizzare per prevenirne il riuso, rifiutando il Refresh Token se già processato. |
Periodo di validità di un Refresh Token¶
Il Refresh Token NON DEVE avere una validità (differenza tra iat e exp) superiore a 30 giorni.
Se allo scadere del periodo di validità l'RP effettua una richiesta all'OP, quest'ultimo DEVE restituire un errore nella risposta (Vedi Codici di Errore).
Codici di errore¶
Claim |
Descrizione |
Codice HTTP |
Supportato da |
---|---|---|---|
invalid_client |
Problemi durante la client authentication (ad esempio, il client_id è conosciuto, non è fornita l'autenticazione del client o il metodo di autenticazione non è supportato) |
401 Unauthorized |
|
unsupported_grant_type |
Il parametro grant_type contiene un valore non corretto (RFC 6749#section-5.2). |
400 Bad Request |
|
invalid_grant |
I parametri grant_type, code, code_verifier, access_token non sono validi (RFC 6749#section-5.2). |
400 Bad Request |
|
invalid_request |
La richiesta non è valida a causa della mancanza o della non correttezza di uno o più parametri (RFC 6749#section-5.2). |
400 Bad Request |
|
server_error |
L'OP ha riscontrato un problema interno (RFC 6749#section-5.2). |
500 Internal Server Error |
|
temporarily_unavailable |
L'OP ha riscontrato un problema interno temporaneo (RFC 6749#section-5.2). |
503 Service Unavailable |