{"revision":"9f11a31dd2951db0","language":"it","entry":{"id":"oidc-consent","kind":"endpoint","group":"oidc","title":"Accedi: il consenso firmato","method":"POST","path":"/oidc/requests/{id}/consent","paths":[],"summary":"Il testo del consenso firmato da una chiave di dispositivo attiva della scheda di una persona. Il server lo controlla con la scheda e la sua versione nel registro verificato, tiene l'accesso e dà il codice.","response":"{redirect, login, version, log}: il browser va a redirect.","parameters":[{"name":"id","in":"path","required":true,"description":"L'id della richiesta: 43 caratteri dall'indirizzo della pagina di consenso (`?req=`) o dal suo elemento meta."}],"sample":"/oidc/requests/{id}/consent","access":"private-code","base":"directory","notes":["time sono secondi Unix entro due minuti dall'ora del server. Una richiesta prende un solo consenso; la stessa firma ripetuta risponde 410."],"errors":["400 invalid_json","400 invalid_parameter","401 invalid_signature","401 stale_timestamp","403 key_banned","403 key_mismatch","403 veil_suspended","404 not_found","410 erased","410 request_expired","413 payload_too_large","422 invalid_consent","429 rate_limited","500 internal_error","503 busy","503 log_unavailable"],"related":["sign-in-with-veil"],"sections":[{"kind":"code","language":"shell","code":"curl -fsS --json @consent.json \"https://veil.rip/oidc/requests/$REQUEST_ID/consent\""}],"live":false,"responses":[{"status":200,"contentType":"application/json","description":"{redirect, login, version, log}: il browser va a redirect.","fields":[{"name":"redirect","type":"string","description":"redirect_uri con code, state e iss."},{"name":"login","type":"integer","description":"L'id dell'accesso (sid l<id> nel token ID)."},{"name":"version","type":"integer","description":"La versione della scheda con cui l'accesso è stato controllato."},{"name":"log","type":"object","description":"{origin, index, size, root}: la voce della versione e il checkpoint verificato."}]}],"responseObjects":[],"errorFormat":"json","errorDetails":[{"status":400,"code":"invalid_json","description":"Il corpo non è un oggetto JSON, contiene chiavi duplicate o dati finali.","action":"Invia un solo oggetto JSON valido con `Content-Type` application/json.","scope":"endpoint"},{"status":400,"code":"invalid_parameter","description":"Un campo del percorso, della query o del corpo manca, è malformato o fuori intervallo.","action":"Correggi il campo indicato in `error.message` prima di inviare di nuovo.","scope":"endpoint"},{"status":401,"code":"invalid_signature","description":"La firma della richiesta HTTP non è valida.","action":"Firma metodo, percorso e byte del corpo esatti, senza modificarli dopo.","scope":"endpoint"},{"status":401,"code":"stale_timestamp","description":"Il timestamp firmato è fuori dalla finestra temporale ammessa.","action":"Confronta l’intestazione Date del server con il tuo orologio, poi genera nuovi nonce, timestamp e firma.","scope":"endpoint"},{"status":403,"code":"key_banned","description":"La chiave del dispositivo che firma è sospesa dallo staff di Veil.","action":"Usa una chiave attiva autorizzata o chiedi allo staff di riesaminare la restrizione.","scope":"endpoint"},{"status":403,"code":"key_mismatch","description":"La chiave di firma non è autorizzata per questa scheda o operazione.","action":"Usa una chiave di dispositivo attiva con il ruolo di titolare o membro richiesto.","scope":"endpoint"},{"status":403,"code":"veil_suspended","description":"La scheda è sospesa dallo staff di Veil, quindi non accede alle app.","action":"Non c'è niente da riprovare finché dura la sospensione.","scope":"endpoint"},{"status":404,"code":"not_found","description":"La scheda, la chiave, l’alias, il codice o la risorsa richiesti non sono stati trovati.","action":"Controlla l’identificatore. Codici e anteprime temporanei potrebbero essere scaduti o già usati.","scope":"endpoint"},{"status":410,"code":"erased","description":"La scheda esisteva ed è stata cancellata o rimossa. La risposta contiene anche la ricevuta pubblica di cancellazione.","action":"Smetti di usare questa scheda come autorità corrente. Conserva soltanto la ricevuta pubblica se serve.","scope":"endpoint"},{"status":410,"code":"request_expired","description":"La richiesta di accesso è già stata usata o ha più di 30 minuti.","action":"Torna all'app e ricomincia.","scope":"endpoint"},{"status":413,"code":"payload_too_large","description":"Il corpo della richiesta supera il limite in byte dell’endpoint.","action":"Riduci il corpo codificato. La gestione delle chiavi API ammette al massimo 8 KiB.","scope":"endpoint"},{"status":422,"code":"invalid_consent","description":"Il testo del consenso non è quello che questa richiesta vuole: un campo è diverso, manca o è in più, oppure il JSON non è canonico.","action":"Costruisci il testo da GET /oidc/requests/{id} così com'è, poi firmalo.","scope":"endpoint"},{"status":429,"code":"rate_limited","description":"È stato superato un limite anonimo, delle richieste firmate o della chiave API.","action":"Attendi almeno i secondi indicati da `Retry-After`. Condividi coda e budget dei tentativi tra i tuoi processi.","scope":"common"},{"status":500,"code":"internal_error","description":"Si è verificato un errore imprevisto del server. I dettagli interni non vengono restituiti.","action":"Riprova le letture con attese crescenti e un limite. Controlla l’esito delle scritture prima di inviare una nuova operazione firmata.","scope":"common"},{"status":503,"code":"busy","description":"L’applicazione ha raggiunto un limite temporaneo di concorrenza o del database.","action":"Attendi i secondi indicati da `Retry-After` e riprova con attese crescenti e un limite.","scope":"common"},{"status":503,"code":"log_unavailable","description":"Al momento il registro pubblico non può essere letto, verificato o usato per pubblicare.","action":"Per le letture, considera il risultato non verificato e riprova più tardi. Prima di ripetere una scrittura, leggi la scheda per controllare se la pubblicazione è terminata.","scope":"endpoint"}],"responseHeaders":[{"name":"Content-Type","value":"application/json","description":"JSON, anche per gli errori."},{"name":"Cache-Control","value":"no-store","description":"Privata: mai in una cache."}],"bodyFields":[{"name":"consent","in":"body","required":true,"description":"veil-rubrica:oidc-consent:v1, a capo, poi il JSON canonico {card, challenge, client, iss, key, nonce, redirect, request, scopes, state, time, v: 1}."},{"name":"signature","in":"body","required":true,"description":"La firma della chiave di dispositivo sui byte UTF-8 esatti di consent (hex per Ed25519)."}],"documentationUrl":"https://veil.rip/docs/oidc-consent?lang=it","supportsBrowserFetch":false,"browserMode":"local-or-server"}}