Compilare discourse_username quando non si usa DiscourseConnect

Questa era una domanda su un vecchio problema di GitHub, che è più facile da seguire qui su meta
https://github.com/discourse/wp-discourse/issues/237
Da @mattdm:

Stiamo usando OpenID per l’accesso e sembra che quell’opzione sia disponibile solo quando si usa DiscourseConnect. C’è un altro modo? Compilarli manualmente è piuttosto fastidioso.

Permettiamo agli utenti di modificare il loro indirizzo email (distinto dall’SSO) sui siti Discourse, ma l’ID utente è garantito che sia lo stesso.

La mia risposta iniziale (le domande sono ancora in sospeso)

Ehi @mattdm, potresti chiarire alcune cose:

  1. L’email di un utente può essere diversa tra i suoi account su WordPress e Discourse?
  2. Cosa intendi con “l’ID utente è garantito che sia lo stesso”? Di quale ID utente stiamo parlando?
2 Mi Piace

Oh, scusa, ero sicuro di aver risposto prima, ma immagino… non l’abbia fatto? Forse ci ho solo pensato! Comunque:

  1. L’email viene inizialmente sincronizzata dall’SSO sia per WordPress che per Discourse. Tuttavia, a causa della forte domanda, consentiamo alle persone di cambiare quell’email su Discourse. (Si scopre che è frequente voler ricevere le notifiche di Discourse altrove rispetto all’email associata direttamente all’accesso.) È anche possibile cambiare l’indirizzo email su WordPress, ma non conosco nessuno che lo faccia, o anche solo se l’email in uscita su quell’istanza funziona.

  2. Per “user id”, intendevo “username”. Lo username viene sempre[1] preso dall’SSO sia per Discourse che per WordPress e non può essere modificato dall’utente in nessun caso. Per qualche motivo a me sconosciuto ma che probabilmente aveva senso all’epoca, questo è nickname sul nostro lato SSO; questo viene mappato a oauth2 json username path.


  1. In realtà, si scopre che ci sono pochi account come il mio che sono stati configurati prima che avessimo l’SSO, e sono sbagliati: sono “Matthew Miller” invece di mattdm. Ma potremmo sistemare quello. ↩︎

hm ok, quindi in pratica

  1. Ci sarebbe un sottoinsieme dei tuoi utenti con email diverse su WordPress e Discourse.
  2. Il tuo nome utente è garantito essere lo stesso poiché è fornito dal tuo identity provider sia per WordPress che per Discourse.

Se dovessimo disaccoppiare il webhook utente WP Discourse dalla funzionalità DiscourseConnect (possibile), la corrispondenza utente avverrebbe in base all’email, non al nome utente. La tua situazione è in qualche modo specifica della tua configurazione di identità.

Penso che questo caso sia gestito meglio tramite codice personalizzato sul tuo WordPress. Quello che vuoi è qualcosa del genere:

function update_discourse_username( $user_login, $user ) {
    update_user_meta( $user->ID, 'discourse_username', $user_login );
}
add_action( 'wp_login', 'update_discourse_username', 10, 2);

In sostanza, assegna semplicemente il campo meta discourse_username come nome utente WP dopo il login, poiché sono garantiti essere gli stessi. Nota che “user_login” è ciò che a volte viene chiamato “username” nel codice di WordPress.

Tornando a questo dopo diversi anni. :slight_smile:

Ad un certo punto, abbiamo cambiato in modo che gli indirizzi email vengano sincronizzati forzatamente dal nostro SSO (oauth2). Quindi, dovremmo essere in grado di abbinare in quel modo. (E, anche se per qualche motivo ci fosse una discrepanza, non dovrebbe esserci un caso in cui un’email appartenga a qualcun altro, quindi nel peggiore dei casi fallirebbe, giusto?)

C’è qualche possibilità di far funzionare semplicemente il webhook utente di WP Discourse?

In caso contrario… non sono un esperto di WP e il nostro WP è ospitato, quindi non sono sicuro che abbiamo un’opzione facile per personalizzare il plugin.

CC @jwheel

Ok, quindi solo per chiarire

Questo non è più il caso?

Solo una nota che attualmente funziona. Stai chiedendo una nuova funzionalità :slight_smile:

Inoltre, stai chiedendo una nuova funzionalità che deve essere considerata con molta attenzione. So di aver detto che era possibile qualche anno fa, tuttavia attualmente sono un po’ cauto nel farlo come funzionalità principale del plugin, poiché tale funzionalità dovrebbe presumere che gli indirizzi email siano correttamente convalidati su WordPress, il che non è necessariamente un’ipotesi sicura.

Quella (la convalida dell’email di WordPress) è responsabilità dell’amministratore del sito, tuttavia un principio dello sviluppo open source è evitare di creare qualcosa che causi esiti negativi in un sottoinsieme (anche un piccolo sottoinsieme) di casi, supponendo che tu non abbia alcun controllo sull’ambiente. Questo problema è ancora presente, ma mitigato, quando è limitato solo a DiscourseConnect.

Lo considererò più attentamente e ti risponderò più tardi questa settimana.

1 Mi Piace

Se la corrispondenza delle email è troppo complicata, ritengo che “I nomi utente di Discourse corrispondono sempre a WordPress (e viceversa)” non possa essere così rara.

Anche se qualcuno non ha un sistema SSO che presuppone un nome utente univoco, ci devono sicuramente essere molti siti più piccoli con, diciamo, dozzine di utenti WordPress in cui questo è vero per convenzione.

Esiste una sorta di soluzione esistente per questo. Discourse può essere configurato per essere il provider DiscourseConnect per WordPress (il contrario della configurazione usuale). È facile da configurare. Quando abilitato, esiste un’impostazione opzionale che consente la sincronizzazione degli account WordPress/Discourse in base all’indirizzo email dell’utente.

Viene persino aggiunto un link alla pagina del profilo dell’utente:


(modifica: un’immagine può avere una didascalia senza IA?)

Testandolo ora, cliccando sul link nella pagina del profilo non viene compilato il campo Nome utente Discourse. Dovrebbe. Cliccando sul link “Accedi con Discourse” che può essere aggiunto alla pagina di accesso, il campo Nome utente Discourse viene aggiornato automaticamente.

Penso che lo scopo della sincronizzazione degli account sia aggiornare il campo Nome utente Discourse in modo sicuro, quindi vale la pena esaminare cosa sta succedendo. Sembra anche che ci sia un problema per cui gli account che hanno un indirizzo email “non verificato” su WordPress possono sincronizzare i propri account con Discourse. Ciò probabilmente non dovrebbe essere consentito per impostazione predefinita.

Nel tuo caso, potresti non voler consentire agli utenti di accedere a WordPress tramite Discourse. Dovrebbe essere possibile utilizzare semplicemente il link nella pagina del profilo per consentire agli utenti di sincronizzare i propri account in modo che il loro campo Nome utente Discourse venga compilato automaticamente. Non dovresti dover abilitare l’accesso a WordPress tramite Discourse affinché ciò funzioni.

Un possibile svantaggio di questo approccio è che gli utenti dovranno avviarlo. Non fornirebbe un pulsante che gli amministratori potrebbero cliccare per ottenere il nome utente Discourse di un utente.

Sembra sciocco. Abbiamo un SSO centralizzato. Non dovremmo dover configurare alcuni dei nostri servizi per utilizzare altri servizi casuali come provider di autenticazione solo per farli funzionare insieme. È una strada verso la follia.

Non lasciarti ingannare dal nome (DiscourseConnect). Se la funzionalità che ho descritto funzionasse come dovrebbe, sarebbe solo un modo per un utente di WordPress per confermare di avere un account Discourse con un indirizzo email corrispondente e ottenere il proprio nome utente Discourse automaticamente compilato su WordPress. Non influirebbe sul sistema di autenticazione del tuo sito.

Non ci sarà mai un meccanismo di identità che abbini un nome utente di Wordpress a un nome utente di Discourse nel plugin principale, nemmeno dietro un’impostazione. L’unica possibilità in questo contesto è l’abbinamento via email. Ho deciso di aggiungere l’abbinamento via email come meccanismo di fallback al webhook utente. Sarà nella prossima versione, che arriverà tra qualche settimana.

1 Mi Piace

Per chiudere il cerchio su questo, la versione più recente del plugin 2.5.4 ha incluso vari aggiornamenti ai webhook, tra cui la rimozione del requisito DiscourseConnect per l’impostazione “Abbina utenti per e-mail”. Vedi ulteriori informazioni su

1 Mi Piace

Penso che questo risolverà il nostro problema, almeno nel 99% dei casi. Grazie!!!

@jwheel A titolo informativo, ho proceduto ad attivare questa funzione sul nostro sito.

2 Mi Piace

Fantastico, terrò d’occhio questo per argomenti futuri con il plugin.

2 Mi Piace