Accedi con Veil
Fai entrare le persone nella tua app con la loro scheda Veil. L'accesso è una firma della loro chiave di dispositivo, e puoi controllarla da solo sul registro pubblico.
Accedi con Veil è un provider OpenID Connect con issuer https://veil.rip. Funziona qualunque libreria OpenID Connect, a partire dal documento di discovery. L'identità è la scheda: sub è il numero della scheda, lo stesso per tutta la sua vita.
cURL
curl -fsS 'https://veil.rip/.well-known/openid-configuration'Il flusso#
- Registra l'app su /developers (una scheda ne risponde, e la pagina di consenso dice Verificata quando la scheda prova il dominio dell'app) o con POST /oidc/register (non verificata, 30 giorni).
- Manda il browser a /oidc/authorize con il flusso del codice e PKCE S256. PKCE è obbligatorio per ogni app, anche per quelle confidenziali.
- Sulla pagina di consenso la chiave di dispositivo della persona firma un testo che nomina il tuo client_id, il redirect URI, gli scope, il nonce, l'hash del tuo state e il tuo code_challenge. Quella firma è l'accesso. Un browser senza scheda ne fa una o si aggiunge, e torna.
- Al tuo redirect URI controlla state e iss, poi scambia il codice su /oidc/token con il verificatore. I token di accesso durano 10 minuti; i refresh token ruotano a ogni uso.
Scope#
- openid: il numero della scheda (sub).
- profile: il nome, l'immagine, l'alias (preferred_username, o u<n>) e l'indirizzo della scheda.
- veil: veil_version e veil_log (con cosa è stato controllato l'accesso), veil_good_standing con i motivi, e veil_consent, il consenso firmato.
- veil:accounts: gli account verificati, [{platform, id, handle, url, verified_at}].
- veil:orgs: le organizzazioni, [{n, name, role}]. veil:keys: le chiavi di dispositivo attive e le impronte delle chiavi pubbliche di altri sistemi.
La tua app non riceve mai la chiave privata della persona, e non c'è una password: non ne ha.
Cosa verificare#
- Il token ID: la firma con la chiave del JWKS che il kid nomina e l'alg di quella chiave (EdDSA o ES256; imposta id_token_signed_response_alg nella tua libreria), iss https://veil.rip, aud e azp il tuo client_id, exp e il tuo nonce. Molte librerie saltano la firma di un token che arriva diretto dal token endpoint, quindi accendi il controllo (in openid-client, enableNonRepudiationChecks).
- Senza fidarti del server per l'accesso (scope veil): veil_consent.text comincia con veil-rubrica:oidc-consent:v1; il suo JSON nomina il tuo client_id, il tuo nonce, lo SHA-256 del tuo state, il tuo code_challenge, card uguale a sub e key uguale a veil_consent.key; la sua firma Ed25519 si verifica con quella chiave.
- Sul registro pubblico: GET /v1/keys/{key} dice quale versione ha aggiunto la chiave, e GET /v1/identities/{sub} dà il token della scheda e la sua versione corrente. Per ogni versione da quella alla corrente, GET /v1/identities/{sub}/versions/{v}/proof deve avere una voce che nomina il token della scheda e la versione, si lega alla precedente e sta sotto un checkpoint firmato dal registro e controfirmato dai testimoni. La prima aggiunge la chiave come dispositivo, nessuna dopo la revoca, e la voce di veil_version sta a veil_log.index. Il codice è nella guida.
- Prima di fidarti della persona adesso, leggi userinfo: veil_good_standing diventa subito false per una sospensione, un subentro in corso, una scheda in chiusura o una chiave d'accesso revocata.
CORS copre solo il documento di discovery e il JWKS. Un'app nel browser scambia il codice attraverso il proprio server. Le chiavi API qui non c'entrano.
Riferimento#
- GETLeggi la configurazione OpenIDIl documento di discovery di Accedi con Veil: issuer https://veil.rip, gli endpoint, gli scope, gli algoritmi e i metodi.
/.well-known/openid-configuration - GETLeggi le chiavi di firma del providerLe chiavi pubbliche che firmano i token ID: una Ed25519 (EdDSA) e una P-256 (ES256), più la coppia precedente per 30 giorni dopo una rotazione.
/oidc/jwks - GETComincia un accessoL'endpoint di autorizzazione. Controlla l'app e il suo redirect URI, tiene la richiesta 30 minuti e mostra la pagina di consenso, dove firma la chiave di dispositivo della persona.
/oidc/authorize - POSTScambia un codice o un refresh tokenL'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.
/oidc/token - GETLeggi i dati della personaGli stessi dati del token ID, dallo stato della scheda adesso: una chiave revocata, un subentro o una sospensione cambiano subito la risposta.
/oidc/userinfo - POSTRevoca un tokenRFC 7009: l'app revoca uno dei suoi token. Un refresh token chiude tutti i token del suo accesso.
/oidc/revoke - POSTIspeziona un tokenRFC 7662, per le app confidenziali: se uno dei token dell'app è attivo adesso.
/oidc/introspect - POSTRegistra un'app senza schedaRFC 7591, aperta: un'app di cui nessuna scheda risponde. La pagina di consenso la dice non verificata, e sparisce 30 giorni dopo la registrazione.
/oidc/register - GETEsci da un'appLogout avviato dall'app. Con id_token_hint finiscono i token di quell'accesso; il browser torna solo a un indirizzo che l'app ha registrato esattamente.
/oidc/logout - GETElenca le app di una schedaLe app registrate da una scheda per Accedi con Veil, senza i segreti.
/v1/developer/accounts/{n}/oidc-clients - POSTRegistra un'appUna persona o un proprietario dell'organizzazione firma la registrazione. Un'app confidenziale con client_secret_basic riceve il segreto una volta.
/v1/developer/accounts/{n}/oidc-clients - GETElenca le app in cui una persona è entrataLe app in cui la scheda è entrata, con gli ultimi cinque accessi di ognuna e il consenso firmato dalla sua chiave di dispositivo, così il proprietario controlla ogni accesso.
/v1/identities/{n}/oidc-apps