Utwórz interfejs API do pojedynczego logowania w witrynie innej firmy


13

Moja witryna musi zostać zintegrowana z oprogramowaniem innej firmy, która będzie działać w jej własnej subdomenie, hostowanej przez firmę produkującą oprogramowanie. Muszę podać programistom zewnętrznym punkt końcowy, którego mogą używać do nawiązywania połączeń API (do mojej witryny wordpress), aby umożliwić użytkownikom mojej witryny dostęp do subdomeny.

Druga witryna musi uwierzytelniać użytkowników z mojej witryny za pomocą interfejsu API.

Nie jestem pewien, od czego zacząć, ale mam wrażenie, że ludzie inteligentniejsi ode mnie to odkryli. Z góry dziękuję!


1
Jakiego rodzaju wywołania API będą potrzebne? Co próbujesz zrobić? Czy sprawdziłeś obsługę WP-XML-RPC ( codex.wordpress.org/XML-RPC_Support )?
anu

Druga witryna musi weryfikować / uwierzytelniać użytkowników z mojej witryny WP.
emersonthis

Odpowiedzi:


16

Problemy ze skryptami między witrynami

Nie można przenosić plików cookie uwierzytelniania WP między domenami. Nie chcesz również przechowywać haseł w postaci zwykłego tekstu do logowania programowego do innej instalacji WP. Musisz więc zalogować użytkowników do WordPress, a następnie uzyskać dostęp do ich statusu logowania za pośrednictwem punktu końcowego interfejsu API z witryny innej firmy. Dzięki temu WordPress obsługuje wszystkie uwierzytelnienia. Jest dość bezpieczny, ponieważ użytkownik będzie musiał fizycznie zalogować się po stronie WP, aby punkt końcowy interfejsu API mógł udostępnić dane stronie trzeciej.

Utwórz punkt końcowy interfejsu API

Sprawdź ten artykuł, który właśnie napisałem tutaj: http://coderrr.com/create-an-api-endpoint-in-wordpress/

Demonstrację kodu można również zobaczyć tutaj: https://gist.github.com/2982319

Będziesz musiał zrozumieć logikę dla własnych potrzeb aplikacji, ale pozwoli ci to stworzyć punkt końcowy, w którym możesz obsłużyć wszystko, co chcesz od strony WordPress.

Ponieważ używasz WordPress jako strony uwierzytelniającej, możesz użyć czeku takiego jak is_user_logged_in (). Jeśli są zalogowani, zwróć obiekt użytkownika stronie trzeciej, podając wszelkie potrzebne informacje.

Logowanie się od strony trzeciej

Firmy zewnętrzne mogą połączyć się z Twoją stroną logowania, aby zapewnić bezproblemową obsługę za pomocą zapytania redirect_to var. Po zalogowaniu przekaże je z powrotem do witryny innej firmy.

http://sub.yourdomain.com/wp-login.php?redirect_to=http%3A%2F%2Fwww.third-party-domain.com

Zdalne logowanie

Jeśli musisz zalogować użytkowników do WordPress z witryny innej firmy, możesz użyć kilku prostych funkcji WP wymienionych na tej stronie: http://kuttler.eu/code/log-in-a-wordpress-user-programmatically/

Na pewno będziesz musiał użyć wspólnego sekretu i utworzyć hash oparty na czasie, aby zachować bezpieczeństwo. Zasadniczo wygląda to tak:

Firma zewnętrzna wysyła żądanie ze znacznikiem czasu i tokenem wygenerowanym przez wspólny klucz tajny:

$shared_secret = 'foobar'; //do not send this to the API endpoint
$timestamp = time();
$token = md5($shared_secret.$time_stamp);

Instalacja WordPress otrzymuje żądanie:

$shared_secret = 'foobar';
$timestamp = esc_attr($_GET['timestamp']);

if((time() - $timestamp) > 30) # Threshold is 30 seconds
    //do something here - TOKEN expired!

$token = md5($share_secret.$timestamp);
$token_to_check = esc_attr($_GET);

if($token == $token_to_check)
    //authenticated!

Dość pewne, że oprogramowanie innej firmy nie ma nic wspólnego z WP, więc zasadniczo jest to logowanie jednokrotne, ale WP działa jako dostawca uwierzytelniania.
anu

@anu: Zgadza się.
emersonthis

@Brian: Interesuje mnie pomysł przejścia na instalację w wielu witrynach, ale nie do końca rozumiem, co mówiłeś o plikach cookie. Wszystko, co musi się zdarzyć, to oprogramowanie zewnętrzne musi zweryfikować, czy jego użytkownik jest w rzeczywistości jednym z moich użytkowników. Oprogramowanie jest samowystarczalne i może dostarczać własne pliki cookie lub cokolwiek innego.
emersonthis

@ Emerson Widzę teraz. Przepraszam za zamieszanie. Możesz użyć idei punktu końcowego, którą utworzyłem, i użyć uwierzytelnionego tokena w meta użytkownika do uwierzytelnienia. Zwróć odpowiedź JSON do strony trzeciej, jeśli użytkownik istnieje.
Brian Fegter,

1
Bardzo fajne rozwiązanie. Może występować problem, jeśli aplikacje są instalowane na różnych serwerach iz jakiegoś powodu czas każdej maszyny jest inny. Sugerowałbym użyć counterzamiast time()i przekazać go wraz z żądaniem. Obie strony przekazują ostatni licznik, a gdy api otrzyma żądanie z nowym licznikiem, sprawdza, czy nowy jest większy niż ostatni. W ten sposób opóźnienie nie może wyrządzić żadnej szkody.
guyaloni
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.