La SPA non ha una propria gestione utenti, vorrei usare Discourse per questo (poiché non abbiamo altre cose specifiche dell’utente che richiederebbero una propria gestione utenti).
Ma vorrei mostrare l’utente attualmente connesso di Discourse nella SPA, oltre a mostrare un widget degli argomenti non letti (che sono specifici dell’utente), ad esempio, quindi ho bisogno di caricare dati tramite API da Discourse.
Cose che ho provato:
Utilizzare il percorso SSO di Discourse, che poi reindirizza alla mia SPA. Va bene, ottengo l’indirizzo email dell’utente corrente, l’ID esterno e così via, ma niente con cui poter effettuare la richiesta (token/chiave).
Giocare con le impostazioni dei cookie per poter utilizzare il cookie di Discourse per effettuare la richiesta (senza successo).
Ho letto delle chiavi API utente su User API keys specification, ma mi sentirei strano che l’utente permetta a un’app, che è lo stesso sito, di accedere al proprio account Discourse.
C’è qualche possibilità di ottenere il comportamento che desidero?
Creare una chiave API con gli ambiti necessari e l’accesso a “tutti gli utenti”.
Ovviamente non è possibile passare quella chiave all’applicazione web sul lato client senza compromettere il sito, quindi sarà necessario inoltrare le richieste dall’applicazione web tramite il backend di tale applicazione alla tua istanza Discourse. (Ed è necessario convalidare che il nome utente sia legittimo dal backend — non ho esaminato DiscourseConnect ma presumibilmente c’è un modo per farlo.)
(PS: consiglio di utilizzare ‘example.com’ per il tuo dominio di esempio. Qualcuno potrebbe acquistare quello che hai collegato e impostare spam o malware o altro, mentre example.[com|org|net] sono ufficialmente riservati.)
Invio l’utente tramite SSO, il Middleware crea un semplice utente con nome, email e un array di token, crea un token, lo restituisce alla SPA.
Il middleware inoltra le richieste a Discourse con una chiave API di tutti gli utenti e convalida il “token di sessione” (per vedere di quale utente si tratta) e altra magia di sicurezza.
Per far sì che l’utente rimanga connesso, utilizzerò un cookie / local storage e sincronizzerò il logout tramite l’opzione di logout diretto di Discourse.
Funziona, ma credo ancora che dovrebbe esserci un’opzione migliore rispetto alla gestione con un token API di amministratore in combinazione con un nome utente. Si interrompe se un amministratore cambierà il nome utente di qualcuno… Vorrei un ID hash o qualcosa del genere… Ma non posso cambiare nulla, quindi mi accontenterò