Mamy witrynę internetową, w której jedynym sposobem na zalogowanie się i uwierzytelnienie w witrynie jest Facebook (nie był to mój wybór). Przy pierwszym logowaniu za pomocą Facebooka konto jest tworzone automatycznie.
Chcemy teraz stworzyć aplikację na iPhone'a dla naszej strony, a także publiczne API, aby inni mogli korzystać z naszych usług.
To pytanie dotyczy sposobu uwierzytelniania w naszej witrynie z poziomu aplikacji / interfejsu API i jest podzielone na 2 części:
- Jaki jest prawidłowy sposób obsługi uwierzytelniania REST z interfejsu API do witryny internetowej, która używa tylko protokołu OAuth serwisu Facebook jako metody uwierzytelniania?
Dużo czytałem i badałem na temat standardowych metod uwierzytelniania dla REST API. Nie możemy używać takich metod, jak uwierzytelnianie podstawowe przez HTTPS , ponieważ nie ma poświadczeń dla użytkownika jako takiego. Coś jak to wydaje się tylko do uwierzytelniania aplikacji przy użyciu interfejsu API.
Obecnie najlepszym sposobem, o jakim mogę pomyśleć, jest trafienie / autoryzacja punktu końcowego w naszym API, przekierowanie do Facebooka OAuth, a następnie przekierowanie z powrotem do witryny i udostępnienie `` tokenu '', którego użytkownik API może użyć do uwierzytelnienia kolejnych upraszanie.
- W przypadku oficjalnej aplikacji, którą tworzymy, niekoniecznie musielibyśmy używać publicznego API w ten sam sposób. Jaki byłby najlepszy sposób na rozmowę z naszą witryną i uwierzytelnianie użytkowników?
Rozumiem (myślę), jak uwierzytelniać aplikacje innych firm, które używają naszego API, używając kluczy API (publicznych) i tajnych (prywatnych). Jednak jeśli chodzi o uwierzytelnianie użytkownika korzystającego z aplikacji, jestem raczej zdezorientowany, jak się do tego zabrać, skoro jedynym sposobem, w jaki musimy uwierzytelnić użytkownika, jest Facebook.
Czuję, że brakuje mi czegoś bardzo oczywistego lub nie do końca rozumiem, jak powinny działać publiczne interfejsy API REST, więc wszelkie porady i pomoc będą bardzo mile widziane.
Odpowiedzi:
UPDATE: patrz poniżej
Też intensywnie myślałem o tym pytaniu. Nie jest to jeszcze do końca jasne, ale oto trasa, o której myślę. Tworzę REST API i moi użytkownicy uwierzytelniają się tylko za pomocą połączenia z Facebookiem.
KLIENT:
W interfejsie API (dla każdej metody wymagającej uwierzytelnienia użytkownika):
Jeszcze tego nie przetestowałem. Jak to brzmi?
--- Aktualizacja: 27 lipca 2014 r., Aby odpowiedzieć na pytanie ---
Z powyższej giełdy korzystam tylko raz po zalogowaniu. Po ustaleniu, który użytkownik się loguje, tworzę własny token dostępu i ten token jest używany od tego momentu. Więc nowy przepływ wygląda tak ...
KLIENT:
Na API
źródło
To jest moja implementacja przy użyciu JWT (JSON Web Tokens), w zasadzie podobna do zaktualizowanej odpowiedzi Chrisa. Użyłem Facebook JS SDK i JWT.
Oto moja realizacja.
Klient: użyj Facebook JS SDK, aby zalogować się i uzyskać token dostępu.
Klient: zażądaj JWT z mojego interfejsu API, wywołując
/verify-access-token
punkt końcowy.MyAPI: odbiera token dostępu, zweryfikuj go, wywołując
/me
punkt końcowy interfejsu API Facebooka.MyAPI: Jeśli token dostępu jest ważny, znajduje użytkownika w bazie danych, loguje użytkownika, jeśli istnieje. Utwórz token JWT z wymaganymi polami jako ładunkiem, ustaw datę wygaśnięcia, podpisz się tajnym kluczem i odeślij do klienta.
Klient: przechowuje token JWT w pamięci lokalnej.
Klient: wysyła token (token JWT z kroku 5) wraz z żądaniem następnego wywołania interfejsu API.
MyAPI: zweryfikuj token tajnym kluczem, jeśli token jest ważny, wymień token na nowy, odeślij go z powrotem do klienta wraz z odpowiedzią API. (Żaden zewnętrzny interfejs API nie wywołuje weryfikacji tokena tutaj) [jeśli token jest nieprawidłowy / wygasł, poproś klienta o ponowne uwierzytelnienie i powtórzenie od 1]
Klient zastępuje przechowywany token nowym i używa go do następnego wywołania API. Po osiągnięciu wygaśnięcia tokenu token wygasa, odwołując dostęp do API.
Każdy żeton jest używany tylko raz.
Przeczytaj więcej odpowiedzi na temat bezpieczeństwa i JWT
Jak bezpieczny jest JWT
Jeśli możesz zdekodować tokeny JWT, w jaki sposób są one bezpieczne?
JSON Web Tokens (JWT) jako tokeny identyfikacji użytkownika i uwierzytelniania
źródło
/debug_token
, więc możesz sprawdzić, czy token jest rzeczywiście przeznaczony dla Twojej aplikacji.access_token
w kliencie. Użyj „przepływu pracy kodu”. Przechodzącode
do MyAPI i dokonać kolejnej rundy wycieczkę do Facebook do wymianycode
zaccess_token
. Dokładniej wyjaśniono to tutaj: developers.facebook.com/docs/facebook-login/securityPróbuję odpowiedzieć na to samo pytanie i ostatnio dużo czytałem ...
Nie otrzymam „odpowiedzi”, ale sprawy stają się dla mnie trochę jaśniejsze. Czy przeczytałeś komentarze we wspomnianym artykule ? Uważam, że są naprawdę interesujące i pomocne.
W rezultacie, w świetle tego, jak ewoluowały od czasu napisania pierwszego artykułu, oto, co myślę, że zrobię:
HTTPS wszędzie - dzięki temu zapomnisz o HMAC, podpisywaniu, nonce, ...
Użyj OAuth2:
Gdy żądania uwierzytelnienia pochodzą z moich własnych aplikacji / witryny, użyj tej „sztuczki” (lub jej odmiany) opisanej w odpowiedzi na wspomniany wcześniej artykuł .
W moim przypadku mam dwa typy użytkowników: tych z klasycznymi danymi logowania / hasła i tych, którzy zarejestrowali się za pomocą Facebook Connect.
Dlatego udostępniam zwykły formularz logowania z przyciskiem „Zaloguj się przez Facebooka”. Jeśli użytkownik zaloguje się przy użyciu swoich „klasycznych” poświadczeń, wyślę je po prostu do mojego punktu końcowego OAuth2 z rozszerzeniem
grant_type=password
.Myślę, że jeśli zdecyduje się zalogować przez Facebooka, będzie to proces dwuetapowy:
Zwróć uwagę, że nadal intensywnie badam te wszystkie rzeczy, więc może to nie być idealna odpowiedź ... może nawet nie poprawna! Ale myślę, że to byłby dobry punkt wyjścia. Pomysł wykorzystania „nadania rozszerzenia” do uwierzytelniania na Facebooku może wiązać się z koniecznością zarejestrowania go, aby wszystko działało poprawnie? Nie jestem do końca pewien.
Zresztą mam nadzieję, że udało mi się choć trochę pomóc i że przynajmniej może rozpocząć dyskusję o znalezieniu najlepszego rozwiązania tego problemu :)
Aktualizacja
Logowanie na Facebooku nie jest rozwiązaniem, jak wskazano w komentarzach: każdy może wysłać dowolny identyfikator użytkownika i zalogować się jako ten użytkownik w API.
A co z zrobieniem tego w ten sposób:
Wygląda lepiej?
źródło