Do mojej pracy mamy niezłą usługę RESTful, którą zbudowaliśmy i używamy do prowadzenia kilku stron internetowych. Zasadniczo usługa internetowa pozwala tworzyć i obsługiwać zgłoszenia do pomocy technicznej, a strona internetowa jest odpowiedzialna za interfejs. Wszelkie żądania usług sieciowych wykorzystują nagłówek uwierzytelniania, którego używamy do sprawdzania poprawności użytkownika i hasła do każdego połączenia.
W tym roku chcemy rozszerzyć nasze opcje logowania, aby użytkownicy witryny mogli logować się za pośrednictwem Google, Twittera i Facebooka (ewentualnie innych). Mam jednak problemy z ustaleniem, jak to skonstruować, aby usługa mogła korzystać z zewnętrznych dostawców uwierzytelniania, aby upewnić się, że użytkownicy są tacy, za których się podają. Czy istnieją jakieś najlepsze praktyki, jak to zrobić?
Obecnie myślimy o tym, aby witryna obsługiwała uwierzytelnianie samych użytkowników, a następnie użyła nowego wywołania setSessionId, które rejestruje ich bieżącą sesję w zapleczu usługi WWW. Każde dodatkowe żądanie do serwisu internetowego przekaże ten sessionId i zweryfikuje je. Wydaje się to w porządku, ale mam wrażenie, że nie zastanawiam się nad tym, a całe moje forum przeglądania i czytania oauth i openid specyfikacji tylko mnie dezorientują. Wszelkie wskazówki, jak sobie z tym poradzić?
źródło
Odpowiedzi:
Wygląda na to, że są dwa cele:
Upoważnienie osób do korzystania z zasobów w Twojej witrynie sprawia, że OAuth2 jest preferowanym mechanizmem ze względu na popularność i dostępność bibliotek klienckich.
1. Łatwy dla użytkowników końcowych do uwierzytelnienia za pomocą istniejących kont społecznościowych
Użytkownik końcowy odwiedza witrynę korzystającą z interfejsu API i wybiera opcję logowania. Są one wysyłane na twoją stronę logowania OAuth. Strona logowania pokazuje normalną nazwę użytkownika i hasło do kont zarządzanych w Twojej witrynie oraz zestaw przycisków uwierzytelniania społecznościowego, w których można kliknąć, aby zalogować się za pośrednictwem strony takiej jak Facebook. Gdy użytkownik wybierze Facebooka, przekierowujesz go na Facebooka, aby zatwierdzić wybór (rozpoczynając przepływ uwierzytelniania na Facebooku). Gdy użytkownik końcowy zakończy logowanie na Facebooku, zostaje przekierowany z powrotem na twoją stronę.
Gdy użytkownik zostanie przekierowany z powrotem na twoją stronę z Facebooka, zapisujesz informacje tego użytkownika w rekordzie użytkownika w bazie danych, a następnie generujesz nową sesję dla tego użytkownika. Natychmiast przekierowujesz użytkownika końcowego do jego oryginalnej strony podrzędnej za pomocą tokena oauth access_token, uzupełniając oryginalny przepływ oauth.
2. Łatwe dla programistów korzystających z Twojej usługi internetowej
Jeśli jesteś dostawcą autoryzacji, powinieneś stworzyć prosty interfejs dla programistów, od którego nie będzie się zmieniać za każdym razem, gdy dodajesz nowego dostawcę autoryzacji, który nie wdraża doskonale. Dlatego uważam, że powinieneś wdrożyć witrynę dostawcy OAuth2, która powinna być konsumentem serwisów społecznościowych.
Deweloperowi korzystającemu z przyjemnego interfejsu API odpoczynku, nie będzie on świadomy interakcji na Facebooku, chyba że zdecydujesz się dać mu podpowiedź poprzez post przechwytywania sesji (na przykład).
TL; DR
Spraw, aby konsumenci Twoich interfejsów API byli tacy jak Ty, wdrażając OAuth2 i ukrywając złożoność uwierzytelniania społecznościowego. Możesz, podczas swojego oauth przepływu dla twoich dalszych stron, wywołać dodatkowy oauth flow za pomocą Facebooka.
Obraz, ponieważ obraz == słowa * 1000:
Czy możemy nazwać to oauth2-piggy-back?
Przepływ krok po kroku
state
na Facebooku, aby wiedzieć, skąd pochodzi użytkownikźródło
Jak sprawić, by był rozszerzalny
Najpierw powinieneś zauważyć, że wszystkie te api używają tego samego mechanizmu do logowania. Wszystkie używają OAuth do uwierzytelnienia. Musisz to wykorzystać, zaczynając od ogólnej biblioteki OAuth. Nie używaj własnych bibliotek do uwierzytelniania, będą one bezużyteczne dla innych dostawców. Jeśli wiesz, jak działa OAuth2, dość łatwo jest dodać więcej dostawców.
Potrzebujesz niestety dwóch z nich, ponieważ Twitter wciąż nie przeskoczył modemu OAuth2.
OAuth wymaga utworzenia interfejsu dla strony uwierzytelniającej. Tokeny zostaną wymienione między serwerami. Utwórz jeden punkt wejścia, który może obsłużyć całą komunikację.
Token powinien być przechowywany w oddzielnej tabeli od konta, ponieważ może to być wiele tokenów i wiele połączonych profili. Niektóre usługi dają dwa tokeny, jeden z nich to token odświeżania.
Teraz projektujesz interfejs, który zawiera inne potrzebne funkcje. Osobiście skonfigurowałbym do tego osobną usługę REST. W ten sposób możesz łatwo rozszerzyć uwierzytelnianie na inne miejsca.
Niektóre usługi używają JSON do komunikacji, inne używają XML itp. Dla użytkownika głównego musisz je wszystkie zunifikować. Jest to dość bolesny proces, ale można tu wyciągnąć pewne wspólne podstawy.
Innym problemem jest to, że nie wszystkie usługi zapewniają tę samą funkcjonalność. Może to oznaczać, że Twoje usługi nie mogą zapewnić pełnego interfejsu API, jak określono. Musisz mieć tutaj strategię, która pozwoli z wdziękiem obniżyć aplikację.
Wszystko to zapewni łatwe dodawanie nowych zewnętrznych dostawców usług.
Problemy z tokenami
Tokeny są ograniczone w czasie, dlatego potrzebujesz kilku zadań cron, które mogą sprawdzić, czy token jest nadal użyteczny, w przeciwnym razie musisz go usunąć. Możesz także odświeżyć token za pomocą tego mechanizmu.
Czasami zdarza się, że użytkownik cofa token. Przygotuj się na to.
Przechowywanie danych
Jeśli masz ten projekt, musisz pomyśleć o potrzebnych danych. Wynika to częściowo z właśnie utworzonego interfejsu. Zaprojektuj w tym celu kilka tabel i sprawdź, czy dane można w rzeczywistości odzyskać. Niektóre usługi nie pozwalają na pobranie dużej ilości danych. Należy również wziąć pod uwagę, że im więcej danych potrzebujesz, tym trudniejsze stają się komunikaty o prywatności. Bądź więc skromny w swoich potrzebach, w przeciwnym razie użytkownicy nie będą go używać.
W celu dodatkowej weryfikacji możesz przechowywać profile w osobnej, ale połączonej tabeli dla użytkowników. Zapewni to znacznie więcej informacji o kimś.
Sprawdź także lokalne przepisy, w przypadku niektórych danych potrzebujesz dodatkowych środków ostrożności.
Ostatnia rzecz Nie popełniaj błędu, gdy nie tworzysz konta we własnych usługach. Jeśli użytkownik zostanie zablokowany na Facebooku, nie będzie mógł zalogować się do Twojej usługi. Jest to sytuacja, której nie chcesz tworzyć. Jest to często pomijane.
źródło
Zdecydowanie wybrałbym rozwiązanie, które wygląda na to, że już się zorientowałeś: wdrożenie uwierzytelnienia strony trzeciej w witrynie skierowanej do klienta, a następnie powiązanie tych tokenów uwierzytelnienia strony trzeciej z kontami użytkowników witryny, a następnie w końcu wywołanie połączenia setSessionID Zaloguj Się.
W zależności od architektury witryny może okazać się bardzo pomocne korzystanie z biblioteki takiej jak EveryAuth lub Passport .
źródło
Moje dwa centy: nigdy wcześniej nie robiłem czegoś takiego, ani nie wiem, jak działają mechanizmy logowania do FB, Twittera lub Google, ale kilka problemów pojawiło się w mojej głowie, gdy tylko przeczytałem twoje pytanie:
Możemy rozwiązać te dwa problemy, wybierając powiązanie kont zewnętrznych z kontem wewnętrznym, a nie tylko identyfikatorem sesji. W takim przypadku zewnętrzny login może być tylko bramą do utworzenia konta wewnętrznego. Jeśli uwierzytelnię się przy użyciu więcej niż jednej metody logowania, możesz mi powiedzieć, że jestem już zalogowany. Jeśli zewnętrzny dostawca autoryzacji zmieni coś, na czym polegamy, możemy poprosić użytkownika o podanie nazwy i hasła konta wewnętrznego i utworzenie nowe skojarzenie dla przyszłych logowań.
Nie jestem pewien, czy rozwiązałem problemy, które miałeś na myśli, ale tak naprawdę nie wspomniałeś o żadnych konkretnych obawach. Mam nadzieję, że moja odpowiedź była pomocna.
źródło