Integracja SSO / uwierzytelniania z zewnętrzną „usługą katalogową”

15

Zaraz zacznę pracować nad prototypem dla klienta - a jedną z wymaganych funkcji jest integracja z wewnętrznym systemem uwierzytelniania / rejestracji użytkowników.

Ten system będzie działał jako autorytatywna baza danych użytkowników i zapewni interfejs RESTful do tworzenia nowych użytkowników i uwierzytelniania prawidłowych użytkowników.

  1. Muszę być w stanie utworzyć nowych użytkowników w WP i w ramach tego procesu nawiązać połączenie z zewnętrznym interfejsem API uwierzytelniania, aby utworzyć / zweryfikować tego użytkownika.

  2. Osoba, która jest prawidłowym użytkownikiem, ale nie jest znana WP, powinna mieć możliwość zalogowania się, aby skomentować, bez konieczności rejestracji na stronie WP.

  3. Osoba zalogowana do ogólnej witryny powinna również zostać automatycznie zalogowana do WordPress.

Myślę, że następująca jest droga.

  • Dla (1) - czy mogę użyć haka rejestracyjnego?

  • Dla (2) - Zakładam, że podpinam filtr uwierzytelniający - tzn. Gdy ktoś próbuje się zalogować, wychwytuję go, wykonuję połączenie z systemem zewnętrznym, a następnie albo przetwarzam login WP, albo przekierowuję go do procesu rejestracji, gdzie ( 1) trwa.

  • Dla (3) - przeczytaj plik cookie logowania ustawiony przez stronę główną i przejdź do (2)?

Chyba będę musiał także wstawić rekord do tabeli użytkowników i usermeta.

Czy powyższe ma sens - czy nie pomyślałem o czymś. Każdy ma jakieś dobre zasoby do pomocy w tym (@hakre - Widziałem, że trochę nad tym pracowałeś !!).

Aktualizacja

Więc wciąż walę z tym trochę głową, w zasadzie próbuję podłączyć się do filtra uwierzytelniania i użyć go do:

  1. sprawdź, czy ustawiony jest plik cookie logowania do witryny „wzorcowej”, a jeśli tak, dokonaj ponownej walidacji względem interfejsu API uwierzytelniania, a jeśli jest prawidłowy, wymuś logowanie WP przy wp_signon()użyciu informacji zawartych w pliku cookie witryny wzorcowej (adres e-mail i hasło z hasłem) jako poświadczenia dla WP
  2. jeśli plik cookie nie jest ustawiony, przekieruj na główną stronę logowania i uzyskaj login / rejestrację, a następnie wróć do kroku 1
  3. jeśli nie ma użytkownika WP, gdy istnieje uwierzytelniony użytkownik serwisu głównego, utwórz go, a następnie wpisz „przezroczyste” logowanie (tzn. aby użytkownik nie widział formularza logowania WP)

Zasadniczo chcę całkowicie ukryć formularz logowania WP dla użytkowników, którzy będą głównie komentować, a później znaleźć sposób, aby umożliwić autorom i administratorowi bezpośredni dostęp do niego.

Wszystko idzie powoli, oto, z czym mógłbym skorzystać:

  • czy odpowiedni jest filtr uwierzytelniający? Wygląda na to, że nie jest wywoływany we wszystkich sytuacjach, których oczekiwałbym - np. Meta widget wyświetla linki do logowania / wylogowywania bez uwierzytelniania podczas uruchamiania haka

  • Mogę wp_signon()zwrócić WP_Userobiekt (wskazując powodzenie), ale nie wpływa to na status zalogowanego użytkownika - tzn. meta widget nadal będzie wyświetlał „Logowanie” nawet po odświeżeniu.

Każda pomoc z wdzięcznością otrzymana :)

anu
źródło
może to powinno być osobne pytanie?
anu
och, i nie wiem, czy w ogóle można o tym wspomnieć, ale chętnie zapłaciłbym za około pół dnia pomocy - dane kontaktowe w moim profilu.
anu

Odpowiedzi:

12

OK, podejście, które działa dla mnie, jest następujące:

  1. Załóżmy, że główna baza danych użytkowników serwisu jest autorytatywna. Główny plik cookie logowania do witryny zawiera identyfikator i skrót hasła do witryny.

  2. Pobierz plik cookie z głównej witryny i ponownie zweryfikuj go w stosunku do interfejsu API uwierzytelniania głównej witryny

  3. Jeśli jest poprawny, użyj adresu e-mail z wartości zwracanej jako 'user_login'wartości WP, a hashowane hasło witryny jako hasło WP.

  4. Sprawdź, czy ten użytkownik istnieje w WP, używając wp_authenticate('user_login', 'user_pass'). Zwraca WP_Userobiekt w przypadku sukcesu lub WP_Errorobiekt w przypadku niepowodzenia.

  5. Jeśli WP_Error/is_wp_error(), użyj przycisku, wp_update_user()aby utworzyć użytkownika (lub zaktualizuj użytkownika przy użyciu zmienionego hasła).

  6. Zaloguj się za pomocą wp_set_current_user(), wp_set_auth_cookie()ido_action('wp_login, id)

(Wszystko to jest zawarte w funkcji dołączonej do 'init'akcji)

Wydaje się, że to działa - automatycznie tworzeni są użytkownicy witryny nieznani WP. Zmiany hasła są pokrywane, a jeśli plik cookie witryny jest ustawiony, a użytkownik WP istnieje, logowanie jednokrotne jest automatyczne i dość płynne.

anu
źródło
1
+1 Niesamowity opis / odpowiedź. Mam nadzieję, że pewnego dnia znajdziesz czas, aby pokazać trochę więcej szczegółów. Pomógłby nam innym uniknąć większości próby / błędu;)
Kaiser
1
Właśnie tego szukam, czy możesz wyjaśnić nieco więcej proces? Szczególnie kroki 1,2,3 nie są dla mnie bardzo jasne. Dzięki!!
chifliiiii
3

Cały system uwierzytelniania można podłączyć. Sugeruję przejrzenie istniejących wtyczek, aby dowiedzieć się, jak zastąpić system. Być może patrząc na niektóre wtyczki LDAP ?

Dougal Campbell
źródło
Tak i bez sensu być wrednym, to oczywiste !!
anu
Aby uzyskać informacje, które mogą pomóc w odzwierciedleniu statusu zalogowanego użytkownika, zobacz moją odpowiedź na inne pytanie: wordpress.stackexchange.com/questions/8998/...
Dougal Campbell
1

Kilka funkcji związanych z użytkownikiem jest zdefiniowanych warunkowo !function_exists()w wp-includes/pluggable.phpi można je łatwo zastąpić własnymi wersjami.

Rarst
źródło
1

Włączenie jednokrotnego logowania w WordPressie zajęło mi ponad 18 godzin walki, ale może zająć tylko kilka minut:

Zasadniczo będziesz chciał użyć https://wordpress.org/plugins/wp-force-login/ i zmodyfikowanej wersji https://as.wordpress.org/plugins/jwt-authenticator/, a następnie utworzyć auth - chroniony punkt końcowy w głównej witrynie, który generuje JWT (token sieciowy JSON) i przekierowuje z powrotem na specjalny adres URL witryny WordPress.

Zobacz pełny kod tutaj .

Ryan
źródło
Dziękuję za odpowiedź. Odpowiedzi tylko na linki są odradzane, ponieważ linki mogą zniknąć i uczynić cię bezużytecznym. Lepiej tutaj dołączyć odpowiednie bity.
kaiser