Sono riuscito a farlo funzionare, dopo qualche tentativo ed errore.
Ecco i passaggi di base che seguo quando: ho un’app separata che ho codificato e voglio che gli utenti possano utilizzarla per effettuare chiamate API a un sito Discourse.
Per fare ciò, devo generare un token API per utente per effettuare chiamate per conto di ogni utente specifico (almeno in un ambiente Node.js/JavaScript).
Nota: per la parte JavaScript, ho trovato molto utile il codice fornito da @KengoTODA qui: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub
Ecco i passaggi che ho seguito:
Primo: Generare una coppia di chiavi pubblica e privata.
Questo è qualcosa che la tua app deve generare: una chiave pubblica e una chiave privata. Il gist di GitHub fornisce un metodo per farlo.
Secondo: Avere un URL di reindirizzamento.
Questo è l’URL a cui Discourse reindirizzerà, fornendo il token API finale nel payload. Se hai un’app desktop (cioè senza URL del browser), l’URL di reindirizzamento si baserà su un protocollo personalizzato che hai configurato e che apre l’app quando l’URL di reindirizzamento viene inserito nel browser.
Nota che l’URL di reindirizzamento deve essere inserito nella whitelist nelle impostazioni del sito del sito Discourse di destinazione.
Il sito Discourse deve anche probabilmente avere attiva l’impostazione del sito “Consenti chiavi API utente”. Consulta il post originale su questo argomento per le “Impostazioni del sito”.
Terzo: Inviare la chiamata della richiesta API all’URL di richiesta di Discourse.
La tua app invierà quindi una chiamata a un URL che segue questo formato:
https://[il tuo sito Discourse di destinazione .com]/user-api-key-new"
aggiungendo come parametri:
- il nome della tua app
- il tuo “client_id” (sono riuscito a usare hostname(), da
const {hostname} = require('os')per un’app desktop, proprio come nel gist di GitHub citato sopra) - gli ambiti (questi sono gli ambiti che desideri che l’utente possa utilizzare tramite l’API, come “write”, “read”, ecc.)
- la tua chiave pubblica (dal passaggio 1 sopra)
- il tuo URL di reindirizzamento (dal passaggio 2 sopra)
- nonce (questo è un valore che puoi scegliere: ad esempio, usare semplicemente ‘1’ sembra funzionare)
Quarto: L’utente autorizza la tua app sulla pagina del sito Discourse aperta dall’URL di richiesta
Quando invii con successo l’URL di richiesta, si apre una pagina sul sito Discourse che informa l’utente che la tua app vuole accedere al sito.
Su quella pagina, c’è un pulsante per l’utente per consentire questa operazione. Quando l’utente clicca su questo pulsante, il sito Discourse reindirizza all’URL di reindirizzamento che hai fornito e allega come parametro ?payload=[LA CHIAVE API]. LA CHIAVE API qui è la chiave che devi decodificare nella tua app.
Quinto: La tua app riceve il valore dell’URL di reindirizzamento (con il valore del payload) e decodi la CHIAVE API
Sei quasi arrivato. La tua app deve analizzare l’URL di reindirizzamento a cui è andato Discourse e ottenere la Chiave API contenuta nel payload.
Una volta ottenuta quella Chiave API, devi fare due cose:
- Ottenere la chiave effettiva, non la versione codificata nell’URL: se stai ottenendo un parametro da un URL, spesso è codificato nell’URL (aggiungendo % qui e là, ecc.). Devi pulirlo. In JavaScript, ho trovato che
decodeURIComponentfunziona per questo. - Una volta ottenuta la CHIAVE API ripulita restituita da Discourse, devi decodificarla. Per fare ciò, puoi usare la decodifica JavaScript con le chiavi private. Fondamentalmente, usi la tua chiave privata (generata nel primo passaggio sopra) per decodificare la CHIAVE API ripulita. C’è qualche esempio JavaScript nel gist di GitHub che ho citato sopra: discourse-api-key-generator/src/index.ts at main · KengoTODA/discourse-api-key-generator · GitHub
Dopo aver eseguito il tuo codice di decodifica, hai il token stesso, che ora puoi usare per effettuare chiamate API autenticate per conto dell’utente.
Sesto: Usa il token (cioè la CHIAVE API finale, ripulita e decodificata) per effettuare chiamate API per conto dell’utente
Con quel token, sembra che non sia necessario inserire il nome utente nella chiamata API. Trovo che l’intestazione seguente sia sufficiente quando la includi nelle tue chiamate GET, POST, PUT, ecc.:
headers: {
"User-Api-Key": [il token]
}
E con questo, speriamo tu abbia un metodo di autenticazione per utente funzionante per interagire con Discourse.