veil

Scambia un codice o un refresh token

L'endpoint dei token: il codice con il verificatore PKCE, o un refresh token, per un token di accesso, un token ID e un nuovo refresh token.

POST/oidc/token
Accesso
Serve un codice privato
Client
Client locale o server

Corpo JSON#

NomePosizioneSignificato
grant_typeObbligatorioJSONauthorization_code o refresh_token.
codeJSONIl codice (authorization_code).
redirect_uriJSONLo stesso della richiesta (authorization_code).
code_verifierJSONIl verificatore PKCE, da 43 a 128 caratteri (authorization_code).
refresh_tokenJSONIl refresh token (refresh_token).
scopeJSONUn refresh può restringere gli scope.
client_idJSONUn'app pubblica si nomina qui.
client_assertion, client_assertion_typeJSONprivate_key_jwt (RFC 7523): un JWT firmato da una chiave del jwks dell'app, aud l'issuer o questo endpoint, exp entro 5 minuti, un jti nuovo.

Esempi di richiesta#

cURL
curl -fsS -u "$CLIENT_ID:$CLIENT_SECRET" \
  -d grant_type=authorization_code -d code="$CODE" -d code_verifier="$VERIFIER" \
  --data-urlencode redirect_uri=https://app.example.org/callback "https://veil.rip/oidc/token"

Risposta#

HTTP 200application/json

{access_token, token_type: Bearer, expires_in: 600, refresh_token?, id_token, scope}.

CampoTipoSignificato
access_tokenstringOpaco, veil_at_…, 10 minuti. Conservato solo come hash.
token_typestringBearer.
expires_ininteger600.
refresh_tokenstringveil_rt_…, 30 giorni, ruotato a ogni uso, al più 90 giorni dall'accesso. Manca per un'app senza refresh.
id_tokenstringJWT firmato con l'algoritmo dell'app (EdDSA o ES256), kid nell'intestazione.
scopestringGli scope concessi.

Intestazioni della risposta#

IntestazioneValoreSignificato
Content-Typeapplication/jsonJSON, anche per gli errori.
Cache-Controlno-storePrivata: mai in una cache.
Pragmano-cacheRFC 6749, 5.1.

Cosa verificare#

Nel token ID controlla la firma con la chiave del JWKS che il suo kid nomina, iss, aud e azp (il tuo client_id), exp e nonce. Con lo scope veil si può controllare anche veil_consent: vedi la guida.

Note d’uso#

  • Gli errori di questo endpoint seguono OAuth: {"error", "error_description"} (RFC 6749, 5.2), non l'oggetto error del resto delle API. Un limite risponde comunque 429 con la busta solita.
  • application/x-www-form-urlencoded, al più 16 KiB, ogni parametro una volta. Un'app confidenziale usa l'autenticazione Basic.
  • Qui non si legge nessuna chiave API: un'intestazione Authorization su /oidc/ è la credenziale dell'app o della persona.

Errori#

Gli errori API restituiscono un oggetto error. Usa error.code nella logica del programma; error.message è un testo inglese per le persone e può cambiare. Guida a risposte ed errori

HTTPCodiceSignificato e cosa fare
400invalid_grant

Errore OAuth: il codice o il refresh token non è valido, è scaduto, usato, revocato o di un'altra app, oppure il verificatore PKCE non torna. Un codice o un refresh token usato due volte chiude tutti i token del suo accesso.

Ricomincia l'accesso. Non riprovare mai un codice.

400invalid_request

Errore OAuth: un parametro manca, è ripetuto o malformato, oppure il corpo non è un modulo.

Leggi error_description, correggi la richiesta e mandala di nuovo.

400invalid_scope

Errore OAuth: un refresh ha chiesto uno scope che l'accesso non ha concesso, o ha tolto openid.

Tieni o restringi gli scope, con openid. Uno scope nuovo vuole un nuovo accesso.

400unsupported_grant_type

Errore OAuth: grant_type non è authorization_code né refresh_token.

Usa uno dei due tipi.

401invalid_client

Errore OAuth: l'app non si è autenticata con il metodo che ha registrato.

Controlla client id e segreto (Basic), l'asserzione (private_key_jwt, un jti nuovo ogni volta) o client_id per un'app pubblica.

404invalid_request

Errore OAuth: Accedi con Veil non è configurato su questo server.

Usa https://veil.rip, o un server il cui documento di discovery risponde.

Errori comuni delle richieste
HTTPCodiceSignificato e cosa fare
429rate_limited

È stato superato un limite anonimo, delle richieste firmate o della chiave API.

Attendi almeno i secondi indicati da Retry-After. Condividi coda e budget dei tentativi tra i tuoi processi.

500internal_error

Si è verificato un errore imprevisto del server. I dettagli interni non vengono restituiti.

Riprova le letture con attese crescenti e un limite. Controlla l’esito delle scritture prima di inviare una nuova operazione firmata.

503busy

L’applicazione ha raggiunto un limite temporaneo di concorrenza o del database.

Attendi i secondi indicati da Retry-After e riprova con attese crescenti e un limite.