Accesso automatico con il plugin OpenId Connect e AWS Cognito

Ciao. Sono nuovo di zecca su Discourse. Ho un’app in esecuzione su AWS che utilizza Cognito per l’autenticazione. Voglio collegare questa app al mio nuovo forum ospitato su Discourse. Ho fatto un buon inizio, ma spero che qualcuno possa fornirmi indicazioni sui passaggi finali per completare questa configurazione.

L’obiettivo è rendere l’esperienza di login fluida tra la mia app e il forum Discourse. Quindi:

  • Se un utente è già loggato nella mia app, quando accede al forum Discourse, quest’ultimo lo riconosce e non richiede un nuovo login.

  • Allo stesso modo, se un utente visita per la prima volta il forum Discourse e non è loggato, Discourse lo reindirizzerà alla pagina di login della mia app (o a un’interfaccia di login ospitata, se necessario).

Il Plugin di autenticazione OpenId Connect sembra essere ideale per questo scopo. Mi sono iscritto a un Piano Business con Discourse per assicurarmi di poter utilizzare questo plugin.

Ho seguito le istruzioni fornite da @david e ho completato quanto credo sia necessario configurare lato Cognito:

  1. Da Cognito, ho ottenuto il “documento di discovery OpenID Connect” e l’“ID client OpenID Connect”.

  2. Nelle impostazioni di Discourse, sotto OpenID_Connect, li ho inseriti e salvati.

  3. Ho spuntato “Abilita autenticazione OpenID Connect” e, sotto “Ambito di autorizzazione OpenID Connect”, ho inserito “openid email”. Ho salvato queste impostazioni.

Secondo la descrizione del plugin, dovrei essere a posto, corretto?

Ebbene, quando accedo alla mia app e poi vado sul mio forum, non succede nulla. Viene mostrata semplicemente la normale home page con i pulsanti “Iscriviti” e “Accedi”. Speravo che il sistema mi avesse loggato automaticamente dopo aver verificato con Cognito, ma non è successo. Cosa altro devo fare?

Inoltre, se un utente arrivasse al sito del forum per la prima volta (senza aver mai effettuato il login nella mia app), non dovrebbe vedere i pulsanti di iscrizione e login di Discourse; invece, dovrebbe vedere un pulsante che, cliccato, lo reindirizza alla pagina di login della mia app. Come posso aggiungerlo?

Infine, gli utenti si abbonano alla mia app e pagano per utilizzare le funzionalità premium. Questa informazione è salvata come attributi personalizzati per l’utente in Cognito (c’è un attributo personalizzato che indica se l’utente è abbonato o meno). Solo gli utenti abbonati dovrebbero poter pubblicare sul forum. Quindi, quando Discourse verifica con Cognito per ottenere le informazioni dell’utente, deve controllare l’attributo personalizzato dell’utente e concedere il permesso di pubblicare solo se l’utente è abbonato. Come posso implementare questo?

Essendo così nuovo su Discourse, apprezzerei moltissimo qualsiasi informazione che chiunque possa avere su una di queste domande. Grazie!

Ciao @JQ331 :wave:

L’accesso automatico è supportato solo se il tuo sito è privato (ha l’impostazione del sito login_required abilitata).

Dovrebbe già funzionare così. Assicurati di disabilitare tutti gli altri metodi di accesso, inclusi gli “accessi locali”.

Purtroppo questo non è possibile utilizzando il plugin OIDC.

@david, grazie mille per la tua risposta. È molto utile.

Dove si trova questa impostazione del sito “login_required”? Con “privato”, intendi che gli utenti possono visualizzare i contenuti del sito solo se hanno effettuato l’accesso? Ovviamente non è questo che voglio qui. Voglio che sia necessario essere loggati per pubblicare, e l’unico modo per accedere è tramite la mia app separata.

Immagino tu ti riferisca a Impostazioni → Accesso → Abilita accessi locali (deseleziona questa opzione). Quindi ho deselezionato tutte le opzioni relative agli accessi locali. Ma cosa dovrei selezionare qui? Ad esempio, se sto usando il plugin per collegare la mia app separata per l’accesso, quell’app separata è un “sso” o “oauth2”? (Mi chiedo, ad esempio, se dovrei selezionare “sso sovrascrive l’email” o “oauth2 sovrascrive l’email”?)

Per quanto riguarda la possibilità di pubblicare solo per gli utenti paganti:

Questo è un requisito fondamentale, quindi forse dovrò essere creativo. Esiste un’altra opzione oltre al plugin SSO? Se no, potrei comunque vedere funzionare questa soluzione se è possibile una di queste cose:

  1. Discourse ha diversi livelli di autorizzazioni per gli utenti. Quindi potrei configurarlo in modo che un utente possa essere loggato, ma non abbia il permesso di pubblicare o rispondere ai post. In questo caso, dovrei impostare il livello di autorizzazione dell’utente in base alle informazioni che Discourse riceve da Cognito (se è abbonato o meno).

  2. Se ciò non funziona, Discourse ha un plugin Stripe funzionante che permette agli utenti di essere loggati, ma di poter pubblicare solo se hanno saldato l’abbonamento tramite il sistema Stripe?

  3. Se nessuna di queste opzioni funziona — ad esempio, se Discourse NON ha la capacità di distinguere tra diversi livelli di privilegi utente che posso impostare — allora sembra che dovrei configurarlo in modo che un utente sia o loggato o non loggato, e solo gli utenti loggati possano pubblicare. Ha senso?

Se è così, allora dovrò capire dalla parte della mia app come dire a Discourse di effettuare l’accesso dell’utente solo se è abbonato nella mia app.

Grazie.

In tal caso, l’accesso automatico non è attualmente supportato. Gli utenti dovranno fare clic sul pulsante di accesso.

Ok, quindi ora il pulsante di accesso dovrebbe collegarsi direttamente al tuo provider di identità. Funziona?

Sì, puoi impostare tutte le categorie in modo che “tutti” possano leggerle. Ma solo gli utenti di un determinato gruppo possono creare o rispondere ai topic. Se vuoi automatizzare il processo, puoi utilizzare l’API per aggiungere o rimuovere persone da un gruppo.

Bene, sembra che io sia molto vicino. Per conferma:

Voglio che si verifichi quanto segue:

  1. Tutti possono leggere i contenuti del sito (acceduti o meno).
  2. Solo gli utenti acceduti possono pubblicare.
  3. Se sei acceso nella mia app, quando vai su Discourse, questa si collega a Cognito e ti accede automaticamente, consentendoti di pubblicare.

Stai dicendo che il punto (3) non è possibile? Stai dicendo che, per qualche motivo, l’accesso automatico avviene solo se i contenuti del sito sono nascosti al pubblico?


Sembra che sia questo ciò che voglio fare. Dal tuo suggerimento di “usare l’API”, immagino tu intenda qualcosa del genere:

  1. L’utente tenta di accedere al mio forum.
  2. Viene reindirizzato per accedere alla mia app.
  3. Quando accede alla mia app, quest’ultima verifica se l’utente ha pagato o meno. Se ha pagato, la mia app effettua una chiamata all’API di Discourse per aggiungere quella persona al “gruppo” abilitato a pubblicare e rispondere.

È questo che intendi? In tal caso, esiste una documentazione di riferimento per capire come aggiungere persone ai gruppi tramite l’API?

Grazie, questo mi sta facendo fare grandi progressi.

Penso che forse abbiamo definizioni diverse di “accesso automatico”.

Discourse può connettersi a un provider OIDC per l’accesso. Questo processo viene avviato quando l’utente clicca sul pulsante “Accedi” nel forum. Funziona sempre, indipendentemente dalla configurazione.

Se un sito richiede l’accesso (cioè se l’impostazione “Accesso richiesto” è abilitata), l’utente viene reindirizzato direttamente alla schermata di accesso OIDC senza bisogno di cliccare sul pulsante.

Sì, era quello che pensavo. Ecco della documentazione su questo endpoint API.

Bene, grazie! Darò un’occhiata a quella documentazione API. Sembra molto promettente.

Per quanto riguarda la questione “auto-login”—sembra tu intenda “auto-login = inviare automaticamente l’utente a una schermata di accesso”. Quindi, da quanto dici, quando un utente accede al mio forum Discourse ci sono due opzioni:
Opzione 1. Il sito “automaticamente” lo reindirizza all’app di accesso separata. Questo avverrebbe indipendentemente dal fatto che l’utente sia già loggato nella mia app. (Questa è quella che descrivi come “auto-login”, e dici che si verifica impostando “login_required”).

Opzione 2. Il sito non esegue alcun reindirizzamento automatico. Piuttosto, c’è il pulsante di accesso base nella pagina. Se un utente clicca quel pulsante o tenta di pubblicare, il forum lo reindirizzerà all’accesso della mia app.

Speravo nell’Opzione 3: Se un utente è loggato nella mia app, quando accede al mio forum Discourse, quest’ultimo verifica su Cognito se l’utente è loggato o meno. Se l’utente è loggato su Cognito, allora Discourse lo autentica nel forum, senza che l’utente debba effettuare un nuovo accesso separato.

Sono nuovo delle cose legate a OpenID, ma ero certo che fosse possibile, perché se un utente deve accedere separatamente all’app e anche al forum quando passa dall’una all’altro, l’esperienza non è fluida.

Non c’è un modo per cui il forum Discourse possa verificare su Cognito e aggiornare lo stato di accesso dell’utente senza che questi debba sottoporsi a un processo di accesso separato?

A proposito, presumo che integrare Discourse direttamente nella mia app non aiuterebbe. Lo farei se potessi, ma sembra che sia possibile solo tramite iframe, e ciò non risolverebbe il problema dell’autenticazione.

È tecnicamente possibile secondo la specifica OIDC, ma purtroppo Discourse non lo supporta attualmente.

Hmm. Ho sentito che ci sono due modi per collegare Discourse a un provider di autenticazione esterno come Cognito: il plugin OpenId o l’utilizzo del Single Sign On per Discourse.

Non sono per nulla familiare con il processo di Single Sign On, ma potrebbe essere un modo per fare ciò che desidero, ovvero evitare che gli utenti debbano effettuare il login due volte?

Oppure, forse, semplicemente, quando si accede alla mia app, inviare una chiamata API a Discourse e effettuare il login in quel modo?

(il documento che ho linkato parla anche di specificare l’appartenenza ai gruppi: presumo che questo permetterebbe di raggiungere l’obiettivo di dire che solo gli utenti PAGANTI possono far parte del gruppo autorizzato a pubblicare)