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ć:
- Użytkownik wypełnia nazwę użytkownika/hasło na Klienta.
- Klient łączy się z serwerem Auth przy użyciu przepływu Właściciel zasobu, uwierzytelnia użytkownika i automatycznie autoryzuje klienta.
- Użytkownik jest przekierowywany z serwera AUth z powrotem do klienta za pomocą podpisu Token + JWT zawierającego identyfikator użytkownika.
- Klient zapisuje token w sesji.
- Klient używa tokena i podpisanego użytkownika JWT do żądania danych z serwera zasobów.
- 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:
- Użytkownik klika login w Google/Facebook/LinkedIn.
- Użytkownik jest przekierowywany z klienta na serwer Auth firmy Google (nie mój).
- 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ę.
- Użytkownik jest przekierowywany z powrotem do klienta, z tokenem podpisanym Tokenem i zawierającym identyfikator użytkownika Google.
- Klient sprawdza poprawność JWT.
- Klient używa przepływu poświadczeń klienta, aby połączyć się z serwerem zasobów. Odbiera nowy token.
- Klient zapisuje token w sesji.
- Żądania klienta, aby przekonwertować identyfikator użytkownika Google na identyfikator użytkownika aplikacji. (To połączenie zostało nawiązane podczas rejestracji.)
- Serwer zasobów zwraca identyfikator użytkownika aplikacji. (Podpisany JWT)
- Klient używa tokena i podpisanego użytkownika JWT do żądania danych z serwera zasobów.
- 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.
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