Integrazione SSO / autenticazione con "servizio directory" esterno


15

Sto per iniziare a lavorare su un prototipo per un client e una delle funzionalità richieste è l'integrazione con un sistema di autenticazione / registrazione dell'utente interno.

Questo sistema fungerà da database utente autorevole e fornirà un'interfaccia RESTful per la creazione di nuovi utenti e l'autenticazione di utenti validi.

  1. Devo essere in grado di creare nuovi utenti in WP e come parte di tale processo effettuare una chiamata all'API di autenticazione esterna per creare / convalidare quell'utente.

  2. Una persona che è un utente valido ma non noto a WP dovrebbe essere in grado di accedere per commentare, senza la necessità di registrarsi sul sito WP stesso.

  3. Anche una persona che ha effettuato l'accesso al sito Web generale dovrebbe accedere automaticamente a WordPress.

Penso che la seguente sia la strada da percorrere.

  • Per (1) - esiste un hook di registrazione che posso usare?

  • Per (2) - Suppongo di aver agganciato il filtro di autenticazione, ad esempio quando qualcuno tenta di accedere, lo intrappolo, faccio una chiamata al sistema esterno e quindi elaboro il login WP o li reindirizzo al processo di registrazione dove ( 1) prende oer.

  • Per (3) - leggi il cookie di accesso impostato dal sito principale e procedi con (2)?

Immagino che dovrò anche inserire un record nella tabella degli utenti e usermeta.

Quindi, ha senso quanto sopra: non ho pensato a qualcosa. Chiunque ha avuto buone risorse per aiutare con questo (@hakre - ho visto che hai fatto un po 'di lavoro su questo !!).

Aggiornare

Quindi sto ancora sbattendo la testa un po 'contro questo, essenzialmente sto provando ad agganciarmi al filtro di autenticazione, e usando quello per:

  1. controlla se è impostato un cookie di accesso per il sito "principale" e, se lo è, riconvalida rispetto alla loro API di autenticazione e, se valido, forza un accesso WP con wp_signon(), utilizzando le informazioni contenute nel cookie del sito principale (e-mail e password con hash) come credenziali per WP
  2. se il cookie non è impostato, reindirizzare alla pagina di accesso al sito principale e ottenere un accesso / registrazione, quindi tornare al passaggio 1
  3. se non esiste un utente WP quando esiste un utente del sito principale autenticato, crearlo e quindi un accesso "trasparente" (ovvero l'utente non vede un modulo di accesso WP)

Fondamentalmente, voglio nascondere il modulo di accesso WP interamente per gli utenti che stanno solo commentando e in seguito troveranno un modo per consentire ad autori e amministratori di accedervi direttamente.

Sta andando abbastanza lentamente, ecco cosa potrei usare un aiuto con:

  • il filtro di autenticazione è quello giusto da usare? Non sembra essere chiamato in tutte le situazioni che mi aspetto - ad es. Il meta widget mostra i collegamenti di accesso / disconnessione senza l'autenticazione hook hooking

  • posso ottenere la wp_signon()restituzione di un WP_Useroggetto (che indica il successo), ma ciò non influisce sullo stato di accesso, ovvero il meta widget mostrerebbe comunque "Accesso" anche dopo l'aggiornamento.

Qualsiasi aiuto ricevuto con gratitudine :)


forse questa dovrebbe essere una domanda separata?
anu

oh, e non so se questo possa essere menzionato, ma sarei felice di pagare per mezza giornata o giù di lì per l'aiuto - i dettagli di contatto sul mio profilo.
anu

Risposte:


12

OK, l'approccio che funziona per me è il seguente:

  1. Supponiamo che il database degli utenti del sito principale sia autorevole. Il cookie di accesso al sito principale contiene un ID e un hash della password del sito.

  2. Ottieni il cookie dal sito principale e riconvalidalo rispetto all'API di autenticazione del sito principale

  3. Se valido, utilizzare l'indirizzo e-mail dal valore restituito come 'user_login'valore per WP e la password del sito con hash come password WP.

  4. Verifica se questo utente esiste in WP utilizzando wp_authenticate('user_login', 'user_pass'). Ciò restituisce un WP_Useroggetto in caso di successo o un WP_Erroroggetto in caso di errore.

  5. Se WP_Error/is_wp_error(), quindi utilizzare usa wp_update_user()per creare un utente (o aggiornare un utente con una password modificata).

  6. Accesso via wp_set_current_user(), wp_set_auth_cookie()edo_action('wp_login, id)

(Tutto questo è contenuto in una funzione collegata 'init'all'azione)

Sembra funzionare: gli utenti del sito validi sconosciuti a WP vengono creati automaticamente. Le modifiche alla password sono soddisfatte e, se il cookie del sito è impostato e l'utente WP esiste, l'SSO è automatico e piuttosto semplice.


1
+1 Descrizione / risposta fantastica. Spero che un giorno troverai il tempo di mostrare qualche dettaglio in più. Ci aiuterebbe gli altri ad evitare la maggior parte del processo / erro;)
kaiser

1
Questo è esattamente quello che sto cercando, puoi spiegare un po 'di più il processo? Specialmente i passaggi 1,2,3 non sono molto chiari per me. Grazie!!
chifliiiii,


1

Diverse funzioni correlate all'utente sono definite in modo condizionato !function_exists()in wp-includes/pluggable.phpe sono facili da sostituire con le proprie versioni.


1

L'attivazione del Single Sign-On in WordPress mi ha richiesto 18+ ore di lotta, ma potrebbe richiedere solo pochi minuti:

Fondamentalmente, ti consigliamo di utilizzare https://wordpress.org/plugins/wp-force-login/ e una versione modificata di https://as.wordpress.org/plugins/jwt-authenticator/ e quindi creare un'autenticazione endpoint protetto sul tuo sito principale che genera un JWT (token Web JSON) e reindirizza all'URL speciale del tuo sito WordPress.

Vedi il codice completo qui .


Grazie per la tua risposta. I collegamenti solo le risposte sono scoraggiati poiché i collegamenti possono svanire e renderebbero la tua risposta inutile. È meglio includere qui i bit rilevanti.
Kaiser
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.