Lavora con gli utenti di discourse su una SPA

Sto cercando un modo per ottenere dati specifici dell’utente in una SPA da Discourse.

Configurazione approssimativa
SPA in esecuzione su my-app.com
Discourse in esecuzione su community.my-app.com

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?

Saluti
Marcel

1 Mi Piace

Funzionerebbe?

  1. Utilizzare DiscourseConnect (“Discourse SSO”) come descritto per ottenere il nome utente dell’utente corrente.
  2. Creare una chiave API con gli ambiti necessari e l’accesso a “tutti gli utenti”.
  3. 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.)

1 Mi Piace

Sì, in realtà è così che lo implementavo ora.

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ò :wink:

Grazie per la tua risposta.

2 Mi Piace