REST API dla strony internetowej, która używa Facebook do uwierzytelniania

Mamy stronę internetową, gdzie tylko sposób logowania się i uwierzytelniania się z witryny jest z Facebook (to nie był mój wybór). Po pierwszym zalogowaniu się za pomocą Facebook, konto zostanie automatycznie utworzone dla Ciebie.

Chcemy teraz stworzyć aplikację na iPhone ' a dla naszej strony, a także publiczne API, aby inni mogli korzystać z naszej usługi.

To pytanie dotyczy sposobu uwierzytelniania naszej strony internetowej z aplikacji / API i jest podzielone na 2 części:

  1. Jaki jest prawidłowy sposób obsługi uwierzytelniania REST z API do strony internetowej, która używa tylko Facebook OAuth jako metody uwierzytelniania?

    Czytałem i badałem wiele o standardowych metodach uwierzytelniania dla REST API. Nie możemy używać takich metod jak Basic Auth over HTTPS, ponieważ nie ma żadnych poświadczeń dla użytkownika jako takiego. Coś w rodzaju to wydaje się być tylko do uwierzytelniania aplikacji za pomocą API.

    Obecnie, najlepszym sposobem, jaki mogę myśleć, jest trafienie / autoryzacja punktu końcowego w naszym API, przekierowuje do Facebook OAuth, a następnie przekierowuje z powrotem do strony i zapewnia "token", który użytkownik API może użyć do uwierzytelniania kolejnych żądań.

  2. W przypadku oficjalnej aplikacji, którą tworzymy, niekoniecznie musimy używać publicznego API w ten sam sposób. Jaki byłby najlepszy sposób, aby porozmawiać z naszą stroną internetową i uwierzytelnić użytkowników?

Rozumiem (myślę) jak uwierzytelniaj aplikacje innych firm, które korzystają z naszego API, używając kluczy API (publicznych) i kluczy tajnych (prywatnych). Jednak, jeśli chodzi o uwierzytelnianie użytkownika, który korzysta z aplikacji, jestem coraz bardziej zdezorientowany, jak to zrobić, gdy jedynym sposobem, w jaki mamy 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 odpoczynku, więc wszelkie porady i pomoc będą bardzo mile widziane.

Author: Community, 2012-08-22

3 answers

Aktualizacja: patrz poniżej

Też się nad tym zastanawiałem. Nie jest to dla mnie do końca jasne, ale oto trasa, którą zamierzam wybrać. Tworzę REST API i moi użytkownicy Tylko auth z Facebook connect.

Na kliencie:

  1. Użyj Facebook API, aby zalogować się i uzyskać kod OAUTH2.
  2. wymień ten kod na token dostępu.
  3. w każdym wywołaniu do mojego niestandardowego API będę zawierać identyfikator użytkownika Facebook i dostęp token.

W API (dla każdej metody wymagającej uwierzytelnienia użytkownika):

  1. Złóż prośbę na wykresie / me Facebook używając tokena dostępu z góry.
  2. sprawdź, czy zwrócony identyfikator użytkownika Facebook odpowiada identyfikatorowi użytkownika przekazanemu do mojego API z góry.
  3. jeśli token dostępu wygasł, wymagana jest dodatkowa komunikacja.
Jeszcze tego nie przetestowałem. Jak to brzmi?

- - - aktualizacja: 27 lipca 2014, aby odpowiedzieć na pytanie ---

Używam powyższej wymiany tylko raz po zalogowaniu. Po określeniu, który Użytkownik się loguje, tworzę swój własny token dostępu i ten token jest używany od tego momentu. Więc nowy przepływ wygląda tak...

Na kliencie:

  1. Użyj Facebook API, aby zalogować się i uzyskać kod OAUTH2.
  2. wymień ten kod na token dostępu.
  3. W tym celu należy wysłać zapytanie do Facebook token z API, w tym do Facebook token jako parametr

Na API

  1. odbiór żądania tokena dostępu.
  2. Facebook Facebook access token jest używany do tworzenia wykresów i wykresów na Facebooku, a także do tworzenia wykresów i wykresów na Facebooku.]} Sprawdź, czy użytkownik Facebook istnieje i dopasuj go do użytkownika w mojej bazie danych]}
  3. utwórz własny token dostępu, zapisz go i zwróć klientowi, aby był używany od tego momentu do przodu
 85
Author: Chris Greenwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-28 10:18:49

To moja implementacja przy użyciu JWTs( JSON Web Tokens), zasadniczo podobna do zaktualizowanej odpowiedzi Chrisa. Używałem Facebook JS SDK i JWT.

Oto moja implementacja.
  1. Klient: Użyj Facebook JS SDK, aby zalogować się i uzyskać token dostępu.

  2. Klient: poproś JWT z mojego API, wywołując /verify-access-token endpoint.

  3. MyAPI: otrzymuje token dostępu, zweryfikuj go przez wywołanie /me punktu końcowego Facebook API.

  4. MyAPI: jeśli token dostępu jest ważny, odnajduje użytkownika z bazy danych, loguje użytkownika, jeśli istnieje. Utwórz JWT z wymaganymi polami jako payload, Ustaw wygaśnięcie, podpisz tajnym kluczem i odeślij do klienta.

  5. Klient: przechowuje JWT w magazynie lokalnym.

  6. Client: wysyła token wraz z żądaniem następnego wywołania API.

  7. MyAPI: Zatwierdź token tajnym kluczem, jeśli token jest ważny, wymień token na nowy, wyślij go z powrotem do Klienta wraz z odpowiedzią API. (Żadne zewnętrzne API nie wywołuje weryfikacji tokena tutaj po) [jeśli token jest nieprawidłowy/wygasł żądanie klienta uwierzytelnienia ponownie i powtórz od 1]

  8. Client zastępuje przechowywany token nowym i używa go do następnego wywołania API. Po wygaśnięciu tokenu token wygasa cofając dostęp do API.

Każdy token jest używany raz.

Czytaj więcej odpowiedzi na temat bezpieczeństwa i JWT

Jak bezpieczne jest JWT

Jeśli zdołasz rozszyfrować JWT jak są one bezpieczne?

JSON Web Tokens (JWT) jako tokeny identyfikacji i uwierzytelniania użytkowników

 13
Author: All Іѕ Vаиітy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:38

Próbuję odpowiedzieć na to samo pytanie i ostatnio dużo czytam...

Nie będę miał "odpowiedzi", ale sprawy stają się dla mnie nieco jaśniejsze. Czytałeś komentarze w artykule, o którym wspomniałeś ? Uważam je za bardzo interesujące i pomocne.

W rezultacie, i w świetle tego, jak rzeczy ewoluowały od pierwszego artykułu został napisany, oto co myślę, że zrobię:

  • HTTPS wszędzie-pozwala to na zapomnieć o HMAC, podpisaniu, nonce, ...

  • Użyj OAuth2:

    • Jeśli żądania uwierzytelniania pochodzą z moich własnych aplikacji/stron internetowych, użyj tej "sztuczki" (lub jej odmiany) opisanej w odpowiedzi na Artykuł wspomniany wcześniej.

    • W moim przypadku mam dwa typy użytkowników: tych z klasycznymi loginami/hasłami i tych, którzy zarejestrowali się za pomocą Facebook Connect.
      Więc podałbym zwykły formularz logowania z " Login z Facebook" guzik. Jeśli użytkownik loguje się za pomocą swoich "klasycznych" poświadczeń, po prostu wyślę je do mojego punktu końcowego OAuth2 z grant_type=password.
      Jeśli zdecyduje się zalogować przez Facebook, myślę, że będzie to proces dwuetapowy: {]}

        Po pierwsze, Użyj Facebook iOS SDK, aby otworzyć sesję FBSession [13]}
      • Kiedy to się skończy i aplikacja otrzyma kontrolę z powrotem, powinien być sposób, aby uzyskać identyfikator Facebook dla tego użytkownika. Wysłałbym ten identyfikator sam do mojego punktu końcowego OAuth2 z dotacją rozszerzenia rozumianą przez mój serwer jako "korzystanie z identyfikatora użytkownika FB".

Proszę zauważyć, że wciąż intensywnie badam te wszystkie rzeczy, więc może to nie być idealna odpowiedź... może nawet nie poprawny! Ale myślę, że to dobry punkt wyjścia. Pomysł korzystania z "dotacji rozszerzenia" dla uwierzytelniania Facebook może wiązać się z koniecznością zarejestrowania go, aby zrobić rzeczy prawidłowo? Nie jestem pewien.

W każdym razie, mam nadzieję, że byłem w stanie pomóc ci choć trochę, i że przynajmniej może rozpocznij dyskusję, aby znaleźć najlepsze rozwiązanie tego problemu:)

Update
Logowanie Facebook 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 robieniem tego w ten sposób:

  • Pokaż formularz logowania za pomocą przycisku "Facebook login"
  • jeśli ta metoda logowania jest wybrana, zachowaj się jak Facebook SDK: otwórz stronę internetową z serwera uwierzytelniania, który rozpocznie Login Facebook.
  • gdy użytkownik się zaloguje, Facebook użyje twojego adresu URL przekierowania, aby potwierdzić; aby adres URL wskazywał inny punkt końcowy serwera uwierzytelniania (ewentualnie z dodatkowym parametrem wskazującym, że połączenie pochodzi z aplikacji?)
  • po trafieniu punktu końcowego uwierzytelniania, uwierzytelnianie może bezpiecznie zidentyfikować użytkownika, zachować jego identyfikator użytkownika FB/sesję FB i zwrócić token dostępu do aplikacji za pomocą niestandardowego schematu URL, tak jak SDK Facebook do
Wygląda lepiej?
 5
Author: Olivier Lance,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-04 09:17:33