Discourse contiene un sistema per la generazione di chiavi API per utente se si segue un protocollo molto specifico. Questa funzionalità facilita l’accesso tramite “applicazione” alle istanze di Discourse senza dover coinvolgere i moderatori.
Descrizione di alto livello
A un alto livello:
-
Il client (app desktop, plugin browser, app mobile) genera una coppia di chiavi privata/pubblica e un URL di ritorno.
-
Il client reindirizza a una rotta su Discourse fornendo a Discourse la sua chiave pubblica.
-
Discourse ottiene l’approvazione dall’utente per utilizzare l’app.
-
Discourse genera una chiave API utente.
-
Discourse reindirizza all’URL di ritorno con un payload crittografato utilizzando la chiave pubblica contenente la chiave API utente.
Dettagli
Casi d’uso:
-
Applicazioni desktop che interrogano i siti Discourse per conto degli utenti finali per ottenere i conteggi delle notifiche su più siti.
-
Applicazioni mobili che interrogano i siti Discourse per conto degli utenti finali e gestiscono le notifiche push.
-
Applicazioni web che forniscono una dashboard per gli utenti finali su vari siti Discourse.
-
Integrazioni personalizzate con app di terze parti che consumano Discourse come parte di un’app aziendale generale. Es: integrare le notifiche della community di Discourse nell’app hopscotch.
La progettazione:
Impostazioni del sito
-
allow_user_api_key_scopes: ambiti di accesso consentiti per le chiavi API utente. Gli ambiti sono definiti qui. Gli ambiti predefiniti disponibili sono:
read,write,message_bus,push,one_time_password,notifications,session_info,bookmarks_calendar,user_status(i plugin possono registrare ambiti aggiuntivi). -
user_api_key_allowed_groups: controlla quali gruppi sono autorizzati a generare chiavi API utente (per impostazione predefinita amministratori, moderatori e trust_level_0)
-
allowed_user_api_push_urls: elenco di siti che possono essere destinazioni per le notifiche push.
-
allowed_user_api_auth_redirects: destinazioni di reindirizzamento consentite dopo la generazione della chiave API utente.
Impostazioni globali
- max_user_api_reqs_per_minute: 20
- max_user_api_reqs_per_day: 2880
Elementi UX
Se sono state concesse chiavi API utente, Discourse visualizza una scheda app nella pagina utente.
La scheda app elencherà:
- Il nome dell’applicazione, ad esempio: (“Discourse Notifier”)
- Ultimo utilizzo
- Data di approvazione
- Elenco degli ambiti di accesso concessi
- Un pulsante revoca accesso in modo da poter revocare facilmente eventuali chiavi.
UI di autorizzazione della chiave API
Ogni chiave dovrà essere esplicitamente autorizzata dagli utenti finali in una pagina che spiega chiaramente cosa sta succedendo, ad esempio:
“Discourse Notifier” sta richiedendo il seguente accesso al tuo account:
- Leggi e cancella notifiche
- Leggi informazioni sulla sessione utente
- Crea un token di accesso una tantum
[Autorizza]
Flusso di generazione della chiave API
L’API richiede un’unica richiesta GET dal lato utente.
https://sitename.com/user-api-key/new
A partire da Discourse 2.1, queste chiavi API utente ora scadono automaticamente se non utilizzate per lunghi periodi di tempo. L’impostazione del sito:
revoke user api keys unused daysè impostata su 180 di default.
Parametri:
- auth_redirect: URL a cui reindirizzare con il token generato.
- application_name: il nome dell’applicazione che effettua la richiesta (verrà visualizzato nella scheda App dell’account utente).
- client_id: un identificatore univoco per il client.
- nonce: un nonce univoco generato dal client. Questo verrà riportato nel payload crittografato in modo che il client possa verificare l’autenticità della risposta.
- scopes: elenco separato da virgole degli ambiti di accesso consentiti per la chiave; vedere
allow user api key scopesper l’elenco completo degli ambiti disponibili. - push_url: URL a cui inviare le notifiche push (richiesto e valido solo se
pushonotificationssono inclusi negli ambiti). - public_key: la parte pubblica della coppia di chiavi generata dal client.
- padding (opzionale): la modalità di padding RSA da utilizzare per la crittografia del payload. I valori accettati sono
pkcs1(default) ooaep. OAEP è raccomandato per le nuove applicazioni.
Dopo che /user-api-key/new è stato chiamato con i parametri corretti, possono accadere 2 cose:
- Se l’utente non ha effettuato l’accesso, reindirizzeremo al login (dopo il login riprenderemo l’autorizzazione).
- Una volta che un utente ha effettuato l’accesso, gli verrà presentata l’UI di autorizzazione.
Dopo che l’autorizzazione è stata consentita, il sistema reindirizzerà all’URL definito in auth_redirect e includerà un parametro payload crittografato contenente un oggetto JSON con la chiave API utente generata (key), il nonce, lo stato push (push) e la versione API (api). Se è stato richiesto l’ambito one_time_password, verrà incluso anche un parametro di query oneTimePassword crittografato separato. client_id non viene riportato per maggiore sicurezza.
Controllo della versione API
L’API per l’utilizzo della chiave in Discourse è versionata. I client possono controllare la versione dell’API di un sito Discourse effettuando una richiesta HEAD a https://sitename.com/user-api-key/new. La risposta conterrà un’intestazione denominata Auth-Api-Version contenente il numero di versione dell’API del sito.
Utilizzo dell’API
L’utilizzo dell’API client sarà in qualche modo diverso dall’attuale API di amministrazione.
Il client può specificare 2 intestazioni:
User-Api-Key (richiesto): la chiave che è stata generata
e
User-Api-Client-Id (opzionale): fornire questo per aggiornare l’ID client memorizzato per questa api_key nel database.
Una volta specificate queste intestazioni, il client può eseguire richieste contro l’API proprio come farebbe normalmente.
Generazione di una password di accesso una tantum
A partire dalla versione 4, l’API include un ambito speciale: l’ambito one_time_password, che consente ai client di utilizzare la chiave API utente per generare una password una tantum. Se il client include questo ambito durante la generazione della chiave API seguendo i passaggi precedenti, una oneTimePassword crittografata verrà inclusa come parametro di query separato nel reindirizzamento al client.
In alternativa, il client può effettuare una richiesta GET a /user-api-key/otp con i seguenti parametri:
- auth_redirect
- application_name
- public_key
- padding (opzionale)
e con l’intestazione User-Api-Key.
Questa richiesta reindirizzerà a una schermata in Discourse che chiederà all’utente di consentire all’applicazione l’accesso al sito. Se l’utente approva, il sito reindirizzerà all’URL definito in auth_redirect e includerà un parametro oneTimePassword crittografato con una password una tantum che il client può utilizzare per accedere al sito richiedendo https://sitename.com/session/otp/ONE-TIME-PASSWORD. (La password una tantum è valida solo per 10 minuti.)
Revoca delle chiavi API
Per revocare una chiave API, effettuare una richiesta POST con l’intestazione User-Api-Key e nessun parametro a /user-api-key/revoke.
Ultima revisione da @SaraDev il 2022-07-13T00:00:00Z

