2013-07-25 24 views
5

Próbuję użyć OAuth2 dla interfejsu API, który tworzę, ale mogę użyć wyjaśnienia, jak działa przepływ. Znalazłem podobne pytania (np. Securing my REST API with OAuth while still allowing authentication via third party OAuth providers (using DotNetOpenAuth)), ale nie wyjaśniają one loginu innej firmy.OAuth2 dla niestandardowego interfejsu API

Nie chcę używać OpenID (w każdym razie), zwłaszcza gdy uwierzytelnianie przez delegację może działać dobrze. Wydaje się to zbyt skomplikowane i nie ma wielu dobrze obsługiwanych bibliotek. (Używam PHP + laravel 4)

Problemem jest podzielone na 4 (ish) podmiotów:

  • zasobów Owner - Użytkownik końcowy
  • Client - Browser (Moja strona), mobilna app lub podobny
  • Serwer autoryzacji - mój serwer OAuth2
  • Serwer zasobów - moje API. Obsługuje dane użytkownika.

myślę, że zorientowali się, przepływ dla gdy użytkownik tworzy konto na mojego serwera uwierzytelniającego i zastosowań, które konto aby się zalogować:

  1. Użytkownik wypełnia nazwę użytkownika/hasło na Klienta.
  2. Klient łączy się z serwerem Auth przy użyciu przepływu Właściciel zasobu, uwierzytelnia użytkownika i automatycznie autoryzuje klienta.
  3. Użytkownik jest przekierowywany z serwera AUth z powrotem do klienta za pomocą podpisu Token + JWT zawierającego identyfikator użytkownika.
  4. Klient zapisuje token w sesji.
  5. Klient używa tokena i podpisanego użytkownika JWT do żądania danych z serwera zasobów.
  6. Serwer zasobów sprawdza poprawność JWT i zwraca dane w zależności od zakresów znaczników.

Nie testowałem jeszcze przepływu pracy, ale wygląda na to, że zadziała. Jednak logowanie osób trzecich okazało się trudniejsze. To, co mam do tej pory:

  1. Użytkownik klika login w Google/Facebook/LinkedIn.
  2. Użytkownik jest przekierowywany z klienta na serwer Auth firmy Google (nie mój).
  3. Użytkownik loguje się za pomocą user/pass i upoważnia Klienta do pobrania jakiegoś chronionego zasobu (userinfo.email) - To uwierzytelnia użytkownika przez delegację.
  4. Użytkownik jest przekierowywany z powrotem do klienta, z tokenem podpisanym Tokenem i zawierającym identyfikator użytkownika Google.
  5. Klient sprawdza poprawność JWT.
  6. Klient używa przepływu poświadczeń klienta, aby połączyć się z serwerem zasobów. Odbiera nowy token.
  7. Klient zapisuje token w sesji.
  8. Żądania klienta, aby przekonwertować identyfikator użytkownika Google na identyfikator użytkownika aplikacji. (To połączenie zostało nawiązane podczas rejestracji.)
  9. Serwer zasobów zwraca identyfikator użytkownika aplikacji. (Podpisany JWT)
  10. Klient używa tokena i podpisanego użytkownika JWT do żądania danych z serwera zasobów.
  11. Serwer zasobów sprawdza poprawność JWT i zwraca dane w zależności od zakresów znaczników.

To może zadziałać, ale wydaje się bardzo skomplikowane. Z pewnością musi istnieć sposób na pominięcie kilku z tych kroków? Jestem szczególnie zainteresowany krokiem 8-10. O ile mi wiadomo, użytkownik nigdy nie musi wchodzić w interakcje z moim serwerem Auth przy użyciu logowania zewnętrznego. Problem polega na tym, jak najlepiej połączyć udany id_token (lub coś takiego) z Google/Facebook/LinkedIn z zasobem "konto" w moim interfejsie API.

W tej chwili nie martwię się o żadnych innych klientów łączących się z API, ale jest to coś, co wydarzy się kiedyś w przyszłości.

+0

nie sądzę, każdy z tych interfejsów API dostarczyć e-mail użytkownika. Możesz więc nie mieć unikalnego identyfikatora, aby pogrupować wiele kont dzienników konta społecznościowego. Możesz poprosić użytkownika o podanie swoich danych po uwierzytelnieniu z interfejsu API. Po twojej stronie interfejsu API sugeruję użycie architektury API OAuth2. Mają wszystko, co zbuduje, co da ci więcej czasu na martwienie się innymi rzeczami. :) – astroanu

Odpowiedz

0

"Z tego co wiem, użytkownik nigdy nie musi wchodzić w interakcje z moim serwerem Auth przy użyciu logowania zewnętrznego." To tylko częściowo prawda. Teoretycznie możesz użyć tokena logowania zewnętrznego jako własnego. Więc to normalne żądanie zasobów byłoby: żąda

  1. Client zasób - wysyła żeton (od 3rd party) i typ logowania (facebook/google/etc)
  2. Serwer sprawdza wniosek, zaznaczając żeton z 3rd party Serwer autoryzacji i zwraca dane.

Wadą tego jest to, że twój serwer API musi rozmawiać z serwerem zewnętrznym za każdym razem, gdy zostanie wysłane żądanie (czy dane z nich są potrzebne czy nie). Zamiast tego, gdy generujesz własny token, masz większą kontrolę i łatwiej jest weryfikować żądania.

Mimo to trzymałbym się twojego workflow. Zrobiłem coś podobnego raz i moje kroki były prawie takie same. Podczas "liczenia" kroków należy również wziąć pod uwagę, że w kroku 2-4 zasadniczo nie trzeba robić nic, ponieważ Google, Facebook i spółka już wykonały dobrą robotę;)

Powiązane problemy