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.
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.
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.
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:
- 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 - jeśli plik cookie nie jest ustawiony, przekieruj na główną stronę logowania i uzyskaj login / rejestrację, a następnie wróć do kroku 1
- 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_User
obiekt (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 :)
Odpowiedzi:
OK, podejście, które działa dla mnie, jest następujące:
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.
Pobierz plik cookie z głównej witryny i ponownie zweryfikuj go w stosunku do interfejsu API uwierzytelniania głównej witryny
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.Sprawdź, czy ten użytkownik istnieje w WP, używając
wp_authenticate('user_login', 'user_pass')
. ZwracaWP_User
obiekt w przypadku sukcesu lubWP_Error
obiekt w przypadku niepowodzenia.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).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.
źródło
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 ?
źródło
Kilka funkcji związanych z użytkownikiem jest zdefiniowanych warunkowo
!function_exists()
wwp-includes/pluggable.php
i można je łatwo zastąpić własnymi wersjami.źródło
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 .
źródło