W jaki sposób można obsługiwać uwierzytelnianie (na przykład lokalne i Facebook) za pomocą passport.js, za pośrednictwem interfejsu API RESTful zamiast interfejsu internetowego?
Konkretne obawy dotyczą obsługi przekazywania danych z wywołań zwrotnych do odpowiedzi RESTful (JSON) w porównaniu z użyciem typowego res.send ({data: req.data}), konfigurowania punktu końcowego początkowego / logowania, który przekierowuje do Facebooka (/ login nie może być dostępne przez AJAX, ponieważ nie jest to odpowiedź JSON - jest to przekierowanie do Facebooka z wywołaniem zwrotnym).
Znalazłem https://github.com/halrobertson/test-restify-passport-facebook , ale nie rozumiem tego.
Co więcej, w jaki sposób passport.js przechowuje dane uwierzytelniające? Serwer (czy jest to usługa?) Jest obsługiwany przez MongoDB i spodziewałbym się, że będą tam przechowywane poświadczenia (login i zasolony skrót pw), ale nie wiem, czy passport.js ma tego typu możliwości.
źródło
passport-facebook
. Gdy już to zrobisz, następnym krokiem jest zrozumienie, jak działa usługa Passport i jak przechowuje poświadczenia. Podłączenie go do Restify ( zobacz tutaj zaktualizowaną wersję tej, o której wspomniałeś) byłoby jednym z ostatnich kroków (lub możesz zaimplementować interfejs REST w Express).Odpowiedzi:
Zadawanych jest tutaj wiele pytań i wydaje się, że chociaż pytania są zadawane w kontekście Node i passport.js, prawdziwe pytania dotyczą bardziej przepływu pracy niż tego, jak to zrobić za pomocą określonej technologii.
Użyjmy przykładowej konfiguracji @Keith, nieco zmodyfikowanej w celu zwiększenia bezpieczeństwa:
https://example.com
obsługuje pojedynczą stronę aplikacji klienckiej Javascripthttps://example.com/api
zapewnia obsługę serwera dla bogatej aplikacji klienckiejhttps://example.com/api
https://example.com/api
ale nie wiedzą o serwerze WWW pod adresemhttps://example.com
.Pamiętaj, że używam bezpiecznego protokołu HTTP. Moim zdaniem jest to obowiązkowe dla każdej usługi, która jest dostępna na wolnym powietrzu, ponieważ poufne informacje, takie jak hasła i tokeny autoryzacyjne, są przesyłane między klientem a serwerem.
Uwierzytelnianie nazwy użytkownika / hasła
Przyjrzyjmy się najpierw, jak działa zwykłe stare uwierzytelnianie.
https://example.com
https://example.com/api
aby uzyskać dane użytkownika do wyświetlenia na stronie. Każde żądanie wysłane do usługi sieciowej będzie zawierało nazwę użytkownika i hasło, prawdopodobnie w formie podstawowego uwierzytelniania HTTP , ponieważ usługa RESTful nie może utrzymywać stanu klienta od jednego żądania do następnego. Ponieważ usługa sieciowa korzysta z bezpiecznego protokołu HTTP, hasło jest bezpiecznie szyfrowane podczas przesyłania.https://example.com/api
odbiera zestaw indywidualnych żądań, z których każde zawiera informacje uwierzytelniające. Nazwa użytkownika i hasło w każdym żądaniu są sprawdzane w bazie danych użytkowników i jeśli okaże się, że są prawidłowe, wykonywana jest żądana funkcja, a dane są zwracane do klienta w formacie JSON. Jeśli nazwa użytkownika i hasło nie są zgodne, do klienta wysyłany jest błąd w postaci kodu błędu 401 HTTP.Ważnym punktem wyjścia z tego przykładu jest to, że usługi sieciowe obsługujące REST wymagają uwierzytelniania przy każdym żądaniu .
Dodatkowa warstwa zabezpieczeń w tym scenariuszu dodałaby autoryzację aplikacji klienckiej oprócz uwierzytelniania użytkownika. Na przykład, jeśli masz klienta internetowego, aplikacje iOS i Android korzystające z usługi internetowej, możesz chcieć, aby serwer wiedział, który z trzech klientów danego żądania jest, niezależnie od tego, kto jest uwierzytelnionym użytkownikiem. Może to umożliwić usłudze internetowej ograniczenie niektórych funkcji do określonych klientów. W tym celu możesz użyć kluczy i kluczy API, zobacz tę odpowiedź, aby uzyskać kilka pomysłów na ten temat.
Uwierzytelnianie na Facebooku
Powyższy przepływ pracy nie działa w przypadku połączenia z Facebookiem, ponieważ logowanie za pośrednictwem Facebooka ma stronę trzecią, sam Facebook. Procedura logowania wymaga przekierowania użytkownika do witryny Facebooka, gdzie dane uwierzytelniające są wprowadzane poza naszą kontrolą.
Zobaczmy więc, jak to się zmienia:
https://example.com
https://example.com/auth/facebook
.https://example.com/auth/facebook
Trasy obsługiwane przez passport.js (patrz dokumentacja )https://example.com/auth/facebook/callback
https://example.com/auth/facebook/callback
trasy wywoła funkcję zwrotną, która odbiera token dostępu Facebooka i niektóre informacje o użytkowniku z Facebooka, w tym adres e-mail użytkownika.https://example.com/api
będą zawierały token dostępu Facebook do uwierzytelniania lub token dostępu do aplikacji wygenerowany z tokena Facebooka za pośrednictwem funkcji „get_access_token” w REST API.Mam nadzieję, że to odpowiada na większość pytań. Oczywiście możesz zastąpić Facebooka serwisem Twitter, Google lub inną usługą uwierzytelniania opartą na OAuth.
Chciałbym wiedzieć, czy ktoś ma prostszy sposób radzenia sobie z tym.
źródło
Every single request they send to the web service will include the username and password
, a jednak mówiszyou can have a "get_access_token" function in your RESTful service
. Stwierdzenie, że REST musi być bezstanowy, wydaje się sprzeczne, ale przechowywanie tokenów dostępu po stronie serwera jest w porządku, ponieważ ten akt przechowywania tokenów dostępu oznacza, że serwer jest teraz stanowy. Byłbym wdzięczny za wszelkie wyjaśnienia lub uzasadnienia w tej sprawie. Dzięki! :)Bardzo doceniam wyjaśnienie @ Miguel dotyczące pełnego przepływu w każdym przypadku, ale chciałbym dodać trochę w części dotyczącej uwierzytelniania na Facebooku.
Facebook zapewnia Javascript SDK, którego można użyć do uzyskania tokena dostępu bezpośrednio po stronie klienta, który jest następnie przesyłany do serwera i używany do dalszego pobierania wszystkich informacji o użytkowniku z Facebooka. Więc w zasadzie nie potrzebujesz żadnych przekierowań.
Co więcej, możesz użyć tego samego punktu końcowego API również dla aplikacji mobilnych. Po prostu użyj Android / iOS SDK dla Facebooka, uzyskaj dostęp do Facebooka po stronie klienta i przekaż go do serwera.
Jeśli chodzi o charakter bezstanowy, jak wyjaśniono, gdy get_access_token jest używany do generowania tokenu i przekazywany do klienta, ten token jest również przechowywany na serwerze. Więc jest tak dobry jak token sesji i uważam, że dzięki temu jest stanowy?
Tylko moje 2 centy ...
źródło
Oto niesamowity artykuł, który znalazłem, który może pomóc w uwierzytelnieniu za pomocą:
Łatwe uwierzytelnianie węzłów: konfiguracja i lokalne
źródło