veil

Pubblica una dichiarazione firmata

Una persona o un’organizzazione pubblica una dichiarazione con titolo, testo e un link facoltativo, o ne ritira una precedente. I testimoni del registro le danno una data.

POST/v1/identities/{n}/statements
Accesso
Richiesta firmata
Client
Client locale o server

Parametri#

NomePosizioneSignificato
nObbligatorioPercorsoNumero permanente positivo della scheda.

Corpo JSON#

NomePosizioneSignificato
statementObbligatorioJSON{link, retracts, text, time, title, type: "statement", v: 1}: un titolo da 1 a 200 caratteri, un testo da 1 a 4 000, un link https o null, e l’id della dichiarazione che ritira o null.
saltObbligatorioJSON32 byte casuali in 64 caratteri hex minuscoli, scelti dal browser.
entryObbligatorioJSON{text, signature}: la voce {c, key, kind, signer, time, token, v: 2} in JSON canonico senza firma, e la firma di "veil-rubrica:card-entry:v2\n" + text con X-Public-Key.

Questa chiamata richiede anche le intestazioni comuni di firma, nonce e timestamp. Prepara e firma request.json prima di usare l’esempio. Firma delle richieste

Esempi di richiesta#

cURL
curl -fsS -X POST \
  -H "X-Public-Key: $PUBLIC_KEY" \
  -H "X-Signature: $REQUEST_SIGNATURE" --json @request.json \
  "https://veil.rip/v1/identities/1/statements"

Risposta#

HTTP 201application/json

La dichiarazione, la sua voce e la sua prova.

CampoTipoSignificato
idintegerLa posizione della voce nel registro: l’id permanente della dichiarazione.
kindstringstatement oppure alert.
nintegerLa scheda che fa la dichiarazione.
signerobjectn e token della scheda di persona la cui chiave ha firmato: la scheda stessa, o un proprietario o amministratore di un’organizzazione.
statementstringLa dichiarazione come è stata firmata, in JSON canonico. I suoi campi sono ripetuti sotto per mostrarli.
saltstring32 byte in hex: c della voce è SHA-256(salt ‖ statement).
entrystringLa voce del registro con la firma, come il registro la tiene.
iintegerLa posizione della voce nel registro (la stessa di id).
publishedAtstring | nullLa prima controfirma sul primo checkpoint che contiene la voce.
checkpointobject | nullsize e note del checkpoint controfirmato che data la voce. Null quando il registro non si legge.
inclusionarray<string> | nullLa prova di inclusione RFC 6962 della voce in quel checkpoint, in hex, dal più profondo.
titlestringIl titolo, da 1 a 200 caratteri.
textstringIl testo, da 1 a 4 000 caratteri, con gli a capo.
linkstring | nullUn link https facoltativo.
retractsinteger | nullL’id della dichiarazione che questa ritira.
retractedByobject | nullid, publishedAt e title della dichiarazione che ritira questa.
urlstringLa pagina della dichiarazione.

Intestazioni della risposta#

IntestazioneValoreSignificato
Content-Typeapplication/jsonUsa il tipo dichiarato per scegliere come leggere il corpo.
DateHTTP dateOra del server. Confrontala con il tuo orologio per firmare le richieste.
Cache-Controlno-storeRichiedila ogni volta: una dichiarazione o un avviso nuovi si vedono subito.

Note d’uso#

  • Una persona firma con una sua chiave di dispositivo; un’organizzazione tramite un proprietario o un amministratore, con una chiave della propria scheda, come per le sue versioni.
  • Al più 10 dichiarazioni per scheda in 24 ore, ritiri compresi. GET su questo percorso è la pagina delle dichiarazioni dello staff (from, size).

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_parameter

Un campo del percorso, della query o del corpo manca, è malformato o fuori intervallo.

Correggi il campo indicato in error.message prima di inviare di nuovo.

400wrong_format

La richiesta o la lettura appartiene all’altro formato del registro di questo server: un record v1 su un registro in formato 2, o una lettura del formato 2 su un registro in formato 1.

Leggi format in GET /v1/log (assente vuol dire 1) e manda la forma di quel formato.

403identity_banned

La scheda che agisce è sospesa dallo staff di Veil.

Attendi la fine della restrizione o chiedi allo staff di riesaminarla.

403key_banned

La chiave del dispositivo che firma è sospesa dallo staff di Veil.

Usa una chiave attiva autorizzata o chiedi allo staff di riesaminare la restrizione.

403key_mismatch

La chiave di firma non è autorizzata per questa scheda o operazione.

Usa una chiave di dispositivo attiva con il ruolo di titolare o membro richiesto.

403role_not_allowed

Il ruolo che firma non può eseguire questa modifica.

Usa una chiave con il ruolo richiesto.

404not_found

La scheda, la chiave, l’alias, il codice o la risorsa richiesti non sono stati trovati.

Controlla l’identificatore. Codici e anteprime temporanei potrebbero essere scaduti o già usati.

409already_retracted

La dichiarazione indicata in retracts è già ritirata.

Pubblica invece una dichiarazione nuova.

409erase_pending

Su un registro in formato 2 la scheda ha una cancellazione in attesa. La sua chiusura firmata nomina la versione corrente, quindi la scheda non pubblica finché la cancellazione non è annullata.

Annulla la cancellazione con POST /v1/identities/{n}/erase/cancel, poi pubblica la versione.

409signer_stale

Su un registro in formato 2 signer.n di una voce firmata è indietro rispetto alla versione corrente della scheda che firma.

Rileggi la scheda che firma e firma di nuovo la voce con la sua versione corrente in signer.n.

410erased

La scheda esisteva ed è stata cancellata o rimossa. La risposta contiene anche la ricevuta pubblica di cancellazione.

Smetti di usare questa scheda come autorità corrente. Conserva soltanto la ricevuta pubblica se serve.

422bad_entry

Su un registro in formato 2 salt, entry o closing di una richiesta non vanno bene. error.message nomina il campo.

Correggi il campo indicato, firma di nuovo la voce con la chiave della richiesta e manda una nuova richiesta firmata.

422invalid_statement

Un avviso o una dichiarazione di una scheda non rispetta lo schema: un campo mancante o in più, un testo troppo lungo o con caratteri nascosti, un link non https, una data nel futuro.

Correggi il campo indicato in error.message e firma di nuovo la dichiarazione e la sua voce.

429statement_quota

La scheda ha pubblicato 10 dichiarazioni nelle ultime 24 ore, ritiri compresi.

Aspetta i secondi indicati da Retry-After.

503log_unavailable

Al momento il registro pubblico non può essere letto, verificato o usato per pubblicare.

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.

Errori comuni delle richieste
HTTPCodiceSignificato e cosa fare
400invalid_json

Il corpo non è un oggetto JSON, contiene chiavi duplicate o dati finali.

Invia un solo oggetto JSON valido con Content-Type application/json.

400invalid_nonce

Il nonce della richiesta firmata ha un formato errato.

Genera un nuovo nonce da 16 a 128 caratteri usando lettere, cifre, _ o -.

400invalid_signature_alg

X-Signature-Alg non è supportato.

Usa un algoritmo di firma supportato e la codifica corretta per chiave e firma.

400invalid_timestamp

Il timestamp della richiesta firmata non è espresso in millisecondi Unix.

Usa un timestamp Unix intero in millisecondi e firma la richiesta corretta.

401invalid_signature

La firma della richiesta HTTP non è valida.

Firma metodo, percorso e byte del corpo esatti, senza modificarli dopo.

401missing_signature

La richiesta richiede una firma del dispositivo e le intestazioni mancano o non sono leggibili.

Invia X-Public-Key, X-Signature e i metadati della richiesta firmata. Una chiave API non sostituisce la firma del dispositivo.

401stale_timestamp

Il timestamp firmato è fuori dalla finestra temporale ammessa.

Confronta l’intestazione Date del server con il tuo orologio, poi genera nuovi nonce, timestamp e firma.

409replayed_nonce

La chiave di firma ha già usato questo nonce.

Controlla se la richiesta precedente è riuscita prima di crearne una nuova firmata.

413payload_too_large

Il corpo della richiesta supera il limite in byte dell’endpoint.

Riduci il corpo codificato. La gestione delle chiavi API ammette al massimo 8 KiB.

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.