Tło: Napisałem stosy klientów i serwerów dla OAuth 1.0a i 2.0.
Zarówno OAuth 1.0a, jak i 2.0 obsługują uwierzytelnianie dwunożne , w którym serwer ma pewność tożsamości użytkownika, oraz uwierzytelnianie trójnożne , w którym serwer zapewnia dostawca treści o tożsamości użytkownika. Uwierzytelnianie trójnożne to miejsce, w którym pojawiają się prośby o autoryzację i tokeny dostępu, i należy pamiętać, że OAuth 1 również je ma.
Złożony: uwierzytelnianie trójnożne
Głównym punktem specyfikacji OAuth jest zapewnienie dostawcy treści (np. Facebook, Twitter itp.) Zapewnienia serwerowi (np. Aplikacji internetowej, która chce rozmawiać z dostawcą treści w imieniu klienta), że klient ma pewną tożsamość . To, co oferuje trójnożne uwierzytelnianie, to możliwość, aby klient ani serwer nigdy nie musieli znać szczegółów tej tożsamości (np. Nazwa użytkownika i hasło).
Bez (?) Zagłębiania się w szczegóły OAuth:
- Klient przesyła żądanie autoryzacji do serwera, które potwierdza, że klient jest legalnym klientem jego usługi.
- Serwer przekierowuje klienta do dostawcy treści, aby poprosić o dostęp do jego zasobów.
- Dostawca treści sprawdza tożsamość użytkownika i często prosi o pozwolenie na dostęp do zasobów.
- Dostawca treści przekierowuje klienta z powrotem na serwer, powiadamiając go o sukcesie lub niepowodzeniu. To żądanie zawiera kod autoryzacyjny w przypadku powodzenia.
- Serwer wysyła żądanie pozapasmowe do dostawcy treści i wymienia kod autoryzacyjny na token dostępu.
Serwer może teraz wysyłać żądania do dostawcy treści w imieniu użytkownika, przekazując token dostępu.
Każda wymiana (klient-> serwer, serwer-> dostawca treści) obejmuje sprawdzanie poprawności wspólnego klucza tajnego, ale ponieważ OAuth 1 może działać przez niezaszyfrowane połączenie, każda walidacja nie może przekazać klucza tajnego.
Dokonano tego, jak zauważyłeś, z HMAC. Klient używa tajnego klucza udostępnianego serwerowi do podpisywania argumentów żądania autoryzacji. Serwer pobiera argumenty, sam je podpisuje kluczem klienta i może sprawdzić, czy jest to legalny klient (w kroku 1 powyżej).
Podpis ten wymaga, aby zarówno klient, jak i serwer uzgodnili kolejność argumentów (więc podpisują dokładnie ten sam ciąg), a jednym z głównych zarzutów dotyczących OAuth 1 jest to, że zarówno serwer, jak i klienci muszą sortować i podpisać identycznie. To jest dziwaczny kod i albo jest poprawny, albo dostajesz 401 Unauthorized
z niewielką pomocą. Zwiększa to barierę pisania klienta.
Wymagając, aby żądanie autoryzacji działało przez SSL, OAuth 2.0 eliminuje potrzebę sortowania i podpisywania argumentów. Klient przekazuje swój sekret do serwera, który weryfikuje go bezpośrednio.
Te same wymagania obowiązują w połączeniu serwer-> dostawca treści, a ponieważ jest to protokół SSL, który usuwa jedną barierę w pisaniu serwera, który uzyskuje dostęp do usług OAuth.
To sprawia, że jest dużo łatwiej w krokach 1, 2 i 5 powyżej.
W tym momencie nasz serwer ma token stałego dostępu, który jest nazwą użytkownika / hasłem równoważnym dla użytkownika. Może wysyłać żądania do dostawcy treści w imieniu użytkownika, przekazując token dostępu jako część żądania (jako argument zapytania, nagłówek HTTP lub dane formularza POST).
Jeśli dostęp do usługi treści jest uzyskiwany tylko za pośrednictwem protokołu SSL, to koniec. Jeśli jest dostępny przez zwykły HTTP, chcielibyśmy w jakiś sposób chronić ten token stałego dostępu. Każdy, kto wącha połączenie, może uzyskać dostęp do treści użytkownika na zawsze.
Rozwiązaniem w OAuth 2 jest token odświeżania . Token odświeżania staje się stałym ekwiwalentem hasła i jest zawsze przesyłany tylko przez SSL . Gdy serwer potrzebuje dostępu do usługi treści, wymienia token odświeżania na token dostępu krótkotrwały. W ten sposób wszystkie wąchalne dostępy HTTP są wykonywane za pomocą tokena, który wygaśnie. Google stosuje 5-minutowy okres ważności swoich interfejsów API OAuth 2.
Oprócz tokenów odświeżania OAuth 2 upraszcza całą komunikację między klientem, serwerem i dostawcą treści. A tokeny odświeżania istnieją tylko w celu zapewnienia bezpieczeństwa, gdy dostęp do zawartości jest niezaszyfrowany.
Uwierzytelnianie dwunożne
Czasami jednak serwer musi po prostu kontrolować dostęp do własnych treści. Uwierzytelnianie dwunożne umożliwia klientowi uwierzytelnienie użytkownika bezpośrednio na serwerze.
OAuth 2 standaryzuje niektóre rozszerzenia OAuth 1, które były szeroko stosowane. Ten, który znam najlepiej, został wprowadzony przez Twittera jako xAuth . Możesz to zobaczyć w OAuth 2 jako poświadczenia hasła właściciela zasobu .
Zasadniczo, jeśli możesz zaufać klientowi za pomocą poświadczeń użytkownika (nazwa użytkownika i hasło), może on wymienić je bezpośrednio z dostawcą treści na token dostępu. Dzięki temu OAuth jest znacznie bardziej przydatny w aplikacjach mobilnych - w przypadku uwierzytelniania trójnożnego musisz osadzić widok HTTP, aby obsłużyć proces autoryzacji z serwerem treści.
W przypadku OAuth 1 nie było to częścią oficjalnego standardu i wymagało takiej samej procedury podpisywania, jak w przypadku wszystkich innych żądań.
Właśnie wdrożyłem stronę OAuth 2 po stronie serwera za pomocą poświadczeń hasła właściciela zasobu, a z perspektywy klienta uzyskanie tokena dostępu stało się proste: zażądanie tokena dostępu z serwera, przekazanie identyfikatora / hasła klienta jako nagłówka autoryzacji HTTP i login / hasło użytkownika jako dane formularza.
Zaleta: prostota
Z punktu widzenia implementatora główne zalety, które widzę w OAuth 2, to zmniejszona złożoność. Nie wymaga procedury podpisywania żądań, co nie jest do końca trudne, ale z pewnością jest kłopotliwe. To znacznie zmniejsza nakład pracy niezbędny do działania jako klient usługi, czyli tam, gdzie (we współczesnym mobilnym świecie) najbardziej chcesz zminimalizować ból. Zmniejszona złożoność po stronie serwer-> dostawca treści czyni go bardziej skalowalnym w centrum danych.
I kodyfikuje w standardzie niektóre rozszerzenia OAuth 1.0a (takie jak xAuth), które są obecnie w powszechnym użyciu.