Ciao, sto cercando di ottenere i gruppi a cui un utente appartiene. Sembra che dovrei poter recuperare queste informazioni tramite get_discourse_user, ma questa funzione non sembra restituire alcun dato sui gruppi. Secondo questo post, dovrebbe?
Stai chiamando la funzione WP Discourse get_discourse_user? Se sì, dovrebbe restituire i gruppi dell’utente nell’array "groups".
Sì, la sto chiamando in questo modo.
$discourseUser = \WPDiscourse\Utilities\Utilities::get_discourse_user( $current_user->ID, true );
var_dump($discourseUser);
E restituisce questo
object(stdClass)#2784 (25) { ["id"]=> int(7) ["username"]=> string(4) "chad" ["name"]=> string(13) "Chad Campbell" ["avatar_template"]=> string(59) "https://avatars.discourse.org/v4/letter/c/ecccb3/{size}.png" ["active"]=> bool(true) ["admin"]=> bool(false) ["moderator"]=> bool(false) ["last_seen_at"]=> string(24) "2019-10-25T15:59:45.439Z" ["last_emailed_at"]=> string(24) "2019-10-25T15:49:07.084Z" ["created_at"]=> string(24) "2019-10-24T21:22:40.526Z" ["last_seen_age"]=> float(2659.60627934) ["last_emailed_age"]=> float(3297.96116042) ["created_at_age"]=> float(69684.5193464) ["username_lower"]=> string(4) "chad" ["trust_level"]=> int(1) ["manual_locked_trust_level"]=> NULL ["flag_level"]=> int(0) ["title"]=> NULL ["suspended"]=> bool(false) ["time_read"]=> int(0) ["staged"]=> bool(false) ["days_visited"]=> int(2) ["posts_read_count"]=> int(0) ["topics_entered"]=> int(0) ["post_count"]=> int(0) }
Il parametro true nella chiamata alla funzione fa sì che questa cerchi l’utente su Discourse tramite il suo indirizzo email se non viene trovato un utente basato sull’ID dell’utente di WordPress. Ciò significa che l’utente non ha ancora effettuato l’accesso a Discourse tramite SSO. Quando un utente viene trovato tramite il suo indirizzo email, vengono restituite meno informazioni da Discourse rispetto a quando un utente viene trovato tramite il suo ID di WordPress.
È possibile che la funzione possa essere migliorata per rendere più chiaro il valore di ritorno. Per ora, se non è presente un array groups nella risposta, puoi sapere che l’utente è stato trovato tramite il suo indirizzo email.
Ho capito. Grazie per la spiegazione, Simon!
Ciao Simon,
Ho effettuato l’accesso a Discourse tramite SSO e ricevo questo errore quando imposto il parametro email su false.
object(WP_Error)#2718 (2) { ["errors"]=> array(1) { ["wpdc_response_error"]=> array(1) { [0]=> string(42) "Impossibile recuperare l'utente Discourse." } } ["error_data"]=> array(0) { } }
Quando lo imposto su True, i gruppi non vengono comunque restituiti.
Sono un po’ confuso perché la configurazione SSO mi fa accedere sia a WordPress che a Discourse (posso anche disconnettermi da entrambi tramite WordPress), quindi tutto sembra funzionare come previsto, ma non riesco comunque a vedere i gruppi restituiti.
Quando imposti il secondo parametro della chiamata alla funzione su false o lo ometti semplicemente (il valore predefinito è false), la funzione tenterà di recuperare l’utente da Discourse in base al suo ID WordPress. Se l’utente ha effettuato l’accesso a Discourse tramite SSO, la funzione dovrebbe restituire l’utente e i suoi gruppi.
Per eseguire il debug, vai alla pagina di amministrazione di Discourse relativa all’utente che stai cercando di recuperare. Scorri fino in fondo alla pagina e verifica se è presente una sezione Single Sign On. Se esiste, assicurati che l’External ID in quella sezione corrisponda all’ID utente WordPress che stai utilizzando nella chiamata a get_discourse_user.
Se non è presente alcuna sezione Single Sign On nella pagina di amministrazione di Discourse dell’utente, significa che l’utente non ha ancora effettuato l’accesso a Discourse tramite SSO.
Sì, non vedo che quella sezione esista per nessuno degli utenti che ho testato.
Sembra davvero che io stia accedendo tramite SSO.
Ecco il flusso. (non loggato su Wordpress o Discourse)
Da Wordpress clicco sul link Accedi con Discourse
Viene reindirizzato al sito Discourse
Accedo con le mie credenziali Discourse
Reindirizzato con successo al sito Wordpress
Ora sono loggato su entrambi i siti
Cosa mi manca nel processo per renderlo ufficialmente SSO?
Ora vedo il problema. Stai usando Discourse come provider SSO per WordPress. Questa funzione è destinata all’uso quando WordPress è il provider SSO per Discourse. Il nome della funzione è poco chiaro. Il nome dovrebbe rendere evidente il caso d’uso.
Per il caso in cui Discourse è il provider SSO per WordPress, ciò che devi fare è effettuare una richiesta API autenticata a /admin/users/$user_id.json. $user_id deve essere impostato sull’ID utente di Discourse. Per gli utenti che hanno effettuato l’accesso a WordPress tramite Discourse, puoi ottenere il loro ID utente Discourse con:
get_user_meta( $wp_user_id, 'discourse_sso_user_id', true );
Ah, ok. Inizierò a esplorare la tua documentazione API. Grazie per avermi indicato la strada giusta!