https://<name>.auth.didit.meper un’applicazione live,https://<name>.sandbox.auth.didit.meper un’applicazione sandbox,- oppure il tuo dominio personalizzato, una volta attivo.
DIDIT_AUTH_ISSUER con il tuo issuer, senza barra finale, e DIDIT_APPLICATION_ID con l’ID della tua applicazione: i token lo riportano nel claim aud. La tua chiave pubblicabile codifica l’issuer: dopo pk_live_ o pk_test_ c’è l’issuer in base64url senza padding.
Quando il tuo dominio personalizzato diventa attivo, sostituisce l’host predefinito come issuer. I nuovi token lo indicano in
iss, il discovery fa puntare jwks_uri ad esso e la tua chiave pubblicabile cambia. I token di accesso emessi sotto l’host predefinito falliscono su GET /session/ finché non vengono aggiornati. Aggiorna DIDIT_AUTH_ISSUER quando attivi il dominio, oppure accetta entrambi gli issuer finché i token più vecchi non scadono, entro 5 minuti.Discovery e chiavi
L’issuer supporta:
- Tipo di risposta
codee modalità di rispostaquery. - Tipi di grant
authorization_codeerefresh_token. - Solo il metodo PKCE
S256. I client sono pubblici: non esiste alcun client secret, eclient_idè l’ID della tua applicazione. - Algoritmo di firma
ES256(chiavi P-256). - Scope
openid,email,phone,profileeoffline_access.
prompt=none non è supportato. Usa GET /session/ per leggere e verificare una sessione.
Cache e rotazione
Entrambi i documenti rispondono conCache-Control: public, max-age=300, quindi tu e le cache condivise potete conservarli per 5 minuti. Consentono 1.200 richieste al minuto e 12.000 l’ora per indirizzo, molto al di sopra degli endpoint di accesso, perché spesso molte istanze backend condividono un solo indirizzo.
- Ogni chiave ha un
kid; i nuovi ID di chiave iniziano conk_. Ogni token indica la propria chiave nell’headerkid. - Le chiavi ruotano ogni 30 giorni. Didit pubblica la chiave successiva un giorno prima che inizi a firmare e mantiene pubblicata la chiave precedente per un giorno dopo che ha smesso di firmare. Un JWKS in cache per 5 minuti continua quindi a verificare anche durante una rotazione.
- Metti in cache le chiavi per
kid. Quando un token indica unkidche non hai, richiedi di nuovo il JWKS, al massimo una volta al minuto, e rifiuta il token se la chiave manca ancora. - Quando Didit revoca una chiave compromessa, la rimuove subito dal JWKS e
GET /session/rifiuta ogni token firmato da quella chiave. Una chiave sostitutiva inizia a firmare immediatamente, senza il giorno di pubblicazione anticipata. Un JWKS in cache fino a 5 minuti prima accetta ancora la chiave revocata e non conosce ancora quella sostitutiva, quindi i nuovi token possono non superare la verifica offline finché la cache non si aggiorna.
Avvia l’accesso
Apri la pagina ospitata, cioè l’authorization_endpoint:
Le guide rapide costruiscono questa richiesta per te.
Scambia il codice
Il callback ricevecode e state. Verifica state, poi scambia il codice entro 60 secondi. Ogni codice funziona una sola volta. Il corpo può essere JSON oppure codificato in formato form.
expires_in indica i secondi che restano al token di accesso. Quando disattivi le sessioni multiple, questo scambio termina le altre sessioni della persona.
Claim del token di accesso
Il token di accesso è un JWT con intestazionealg: ES256 e typ: at+jwt. Dura al massimo 5 minuti e mai più a lungo della sessione.
Il token ID ha intestazione
typ: JWT. Contiene gli stessi claim, tranne client_id, più auth_time ed email_verified, e email, name e phone_number quando hanno un valore. Solo il token ID dello scambio del codice contiene nonce, se l’accesso ne prevedeva uno: verificalo lì, perché i token ID dei refresh non lo contengono mai. Un token ID non viene mai accettato come token di accesso.
Verifica un token sul tuo server
Controlla tutti questi punti prima di fidarti di un claim:algèES256etypèat+jwt. Rifiuta ogni altro algoritmo, inclusonone.- Il
kidè presente nel JWKS della tua applicazione e la firma viene verificata. isscoincide con l’issuer configurato eaudcoincide con l’ID della tua applicazione.expeiatsono validi, con una differenza di orologio fino a 60 secondi, esub,sidejtisono presenti.actènull. Il token di accesso di un agente AI è firmato con la stessa chiave e ha gli stessityp,isseaud; soloactlo distingue. Rifiutalo, a meno che l’endpoint accetti agenti: in quel caso consenti solo ciò cheact.scopesconcede.GET /session/rifiuta sempre il token di un agente.
GET /session/.
Controlla la sessione
sub, sid, application_id, vendor_data, amr, mfa_verified, email, email_verified, phone, verified_identity, verified, expires_at, post_logout_redirect_uri e organizations. Ogni voce di organizzazione contiene organization_id, organization__name, role e custom_role.
Questo controllo è più rigoroso della verifica offline. Fallisce anche quando la sessione è stata revocata, è rimasta inattiva o ha superato la sua durata massima, quando la persona è stata bloccata o la sua email non è più verificata, quando la sessione non soddisfa più la tua politica MFA (per esempio dopo che la persona ha aggiunto un’app di autenticazione o è diventata amministratrice di un’organizzazione), o quando il token è stato sostituito da un refresh. Un errore restituisce 401 {"detail": "invalid_token"} con WWW-Authenticate: Bearer.
GET /session/ consente 30 richieste al minuto e 300 all’ora per indirizzo, un limite che condivide con DELETE /session/. Verifica i token offline a ogni richiesta e riserva questa chiamata ai momenti che ne hanno bisogno. Ogni chiamata riuscita conta come attività e quindi riavvia l’idle_timeout della sessione.
Un’email verificata non è una verifica dell’identità. Per quella leggi verified: qui è null se non c’è, mentre i token contengono {}.
Refresh token
- Il refresh token è una stringa casuale, valida fino al termine della sessione.
- Il riutilizzo termina la sessione. Quando arriva di nuovo un refresh token già usato, Didit lo considera un segnale di furto: revoca la sessione e restituisce
400 {"error": "invalid_grant"}. Anche i token della sessione smettono di funzionare, compresi quelli del refresh precedente: il loro refresh token fallisce e il loro token di accesso fallisce subito inGET /session/, anche se la verifica offline resta valida fino alla scadenza, entro 5 minuti. - Esegui un solo refresh alla volta per sessione, tra schede, dispositivi e istanze del server, e sostituisci tutti e tre i token insieme.
- Se un refresh fallisce con
400o non riceve risposta, avvia di nuovo l’accesso. Non ritentarlo alla cieca: un nuovo tentativo dopo un refresh andato a buon fine è un riutilizzo. - Un
503 {"error": "temporarily_unavailable"}significa che il refresh non è avvenuto e il tuo refresh token funziona ancora. Ritenta con backoff. - Didit risponde con un
429prima di eseguire il refresh, quindi ritenta dopoRetry-After. L’endpoint dei token consente 30 richieste al minuto e 300 all’ora per indirizzo. In aggiunta, ogniPOSTeDELETEdella tua applicazione condivide i bucket di protezione dai bot: 60 richieste al minuto per indirizzo su questi endpoint e 30 al minuto per dispositivo. Per l’intera applicazione, i refresh hanno un bucket di 6.000 al minuto e ogni altroPOSTeDELETE(browser e passaggi di accesso inclusi) ne ha uno di 3.000 al minuto, così i refresh non esauriscono i tuoi accessi. - Con token di accesso da 5 minuti, 300 refresh all’ora coprono circa 25 persone che rimangono attive. Se il tuo server esegue refresh per molte persone dallo stesso indirizzo, esegui il refresh solo quando una richiesta ha bisogno di un nuovo token, e fallo nel browser o nell’app dove è possibile.
Disconnessione
DELETE /session/ con l’access token corrente della persona termina la sessione e restituisce 204. Il suo refresh token smette di funzionare e i suoi access token non superano più GET /session/ immediatamente; i token che verifichi offline restano validi fino alla scadenza. Poi reindirizza la persona al tuo post_logout_redirect_uri, se ne hai impostato uno.
La disconnessione richiede un access token che GET /session/ accetterebbe: uno non scaduto e non sostituito da un refresh. Un 401 significa che la sessione non è terminata. Esegui un aggiornamento, poi disconnetti con il nuovo access token; se l’aggiornamento fallisce con 400, la sessione non può più essere usata.
Una sessione termina anche quando:
- supera
session_lifetime(predefinito 30 giorni) oidle_timeout(predefinito 1 giorno), - la persona accede di nuovo mentre le sessioni multiple sono disattivate,
- la persona reimposta la password mentre
revoke_on_password_changeè attivo, - il tuo team la revoca o blocca la persona nella console,
- un refresh token già usato viene inviato di nuovo.
Durate
Conservare le credenziali in base alla finalità
- Conserva le chiavi API di verifica e i token della console sul tuo server.
- Conserva gli access token del browser in memoria, dove possibile. Per le app renderizzate lato server, usa cookie sicuri con HttpOnly e proteggi le richieste autenticate tramite cookie dagli attacchi CSRF.
- Conserva i refresh token per dispositivi mobili in un’archiviazione protetta dalla piattaforma. Cancella lo stato locale dopo la disconnessione.
- Non inserire mai i token negli URL o nei log.