OAuth 2.0 ma wiele przepływów pracy. Mam kilka pytań dotyczących tych dwóch.
- Przepływ kodu autoryzacji - użytkownik loguje się z aplikacji klienckiej, serwer autoryzacji zwraca kod autoryzacji do aplikacji. Następnie aplikacja wymienia kod autoryzacyjny na token dostępu.
- Niejawny przepływ przyznania - użytkownik loguje się z aplikacji klienckiej, serwer autoryzacji wystawia token dostępu bezpośrednio do aplikacji klienckiej.
Jaka jest różnica między tymi dwoma podejściami w zakresie bezpieczeństwa? Który z nich jest bezpieczniejszy i dlaczego?
Nie widzę powodu, dla którego dodatkowy krok (wymiana kodu autoryzacji na token) jest dodawany w jednym przepływie pracy, gdy serwer może bezpośrednio wystawić token Access.
Różne witryny internetowe podają, że przepływ kodu autoryzacji jest używany, gdy aplikacja kliencka może zapewnić bezpieczeństwo poświadczeń. Czemu?
Odpowiedzi:
To
access_token
jest to, czego potrzebujesz, aby wywołać chroniony zasób (interfejs API). W przepływie kodu autoryzacyjnego są 2 kroki, aby go uzyskać:code
zwrócić konsumentowi interfejsu API (nazywanego „Klientem”).code
otrzymane w # 1 naaccess_token
, uwierzytelniając się za pomocąclient_id
iclient_secret
access_token
.Tak więc istnieje podwójna kontrola: użytkownik, który jest właścicielem zasobów udostępnionych przez API i klient korzystający z API (np. Aplikacja internetowa). Oba są sprawdzane pod kątem przyznania dostępu. Zwróć uwagę na „autoryzacyjny” charakter protokołu OAuth: użytkownik udziela dostępu do swojego zasobu (poprzez
code
zwracany po uwierzytelnieniu) aplikacji, aplikacja pobiera anaccess_token
i wywołuje w imieniu użytkownika.W niejawnym przepływie krok 2 jest pomijany. Dlatego po uwierzytelnieniu użytkownika
access_token
zwracany jest bezpośrednio znak, którego można użyć w celu uzyskania dostępu do zasobu. API nie wie, kto wywołuje ten interfejs API. Każdy, kto ma takąaccess_token
możliwość, podczas gdy w poprzednim przykładzie tylko aplikacja internetowa (jej elementy wewnętrzne zwykle nie są dostępne dla nikogo).Niejawny przepływ jest zwykle używany w scenariuszach, w których przechowywanie
client id
iclient secret
nie jest zalecane (na przykład urządzenie, chociaż wiele z nich i tak to robi). To właśnie oznacza wyłączenie odpowiedzialności. Ludzie mają dostęp do kodu klienta i dlatego mogą uzyskać poświadczenia i udawać, że są klientami zasobów. W niejawnym przepływie wszystkie dane są ulotne i nic nie jest przechowywane w aplikacji.źródło
/authorize
prośba. Przeglądarka i witryna internetowa próbująca wywołać interfejs API (nazywana też klientem). To jestredirect_uri
+code
zwracany przez AS po pomyślnym uwierzytelnieniu. Na koniec klient dzwoni do AS za kulisami, zamieniająccode
plikaccess_token
. To jesttoken endpoint
w literaturze. Generalnie AS nigdy do nikogo nie dzwoni. Zawsze odpowiada.Dodam tutaj coś, co nie wydaje mi się jasne w powyższych odpowiedziach:
tl; dr nie używają przepływu niejawny jeśli nie ufasz maszynę użytkowników do tokenów ładowni ale zrobić zaufać własnych serwerów.
źródło
access_token
za pomocąauthorization code
.Różnica między nimi polega na tym, że:
W przepływie niejawnym token jest zwracany bezpośrednio przez adres URL przekierowania ze znakiem „#” i jest to używane głównie w klientach javascript lub aplikacjach mobilnych, które nie mają własnej strony serwera, a klient nie musi podawać swojego sekretu w niektórych implementacjach .
W przepływie kodu autoryzacji kod jest zwracany z „?” aby był możliwy do odczytania przez serwer, strona serwera musi tym razem podać klucz klienta do url tokenu, aby uzyskać token jako obiekt json z serwera autoryzacji. Jest używany w przypadku, gdy masz serwer aplikacji, który może to obsłużyć i przechowywać token użytkownika ze swoim profilem we własnym systemie i jest używany głównie do popularnych aplikacji mobilnych.
więc zależy to od rodzaju aplikacji klienckiej, który z nich jest bardziej bezpieczny, ponieważ żąda tajnego klucza na kliencie, a token może być przesyłany między serwerem autoryzacyjnym a aplikacją kliencką na bardzo zabezpieczonym połączeniu, a dostawca autoryzacji może ogranicz niektórym klientom używanie tylko „kodu autoryzacji” i nie zezwalaj na niejawne
źródło
Niejawne przyznanie jest podobne do nadania kodu autoryzacji z dwiema odrębnymi różnicami.
Jest przeznaczony do użytku dla klientów opartych na agentach użytkownika (np. Jednostronicowych aplikacji internetowych), które nie mogą utrzymywać klienta w tajemnicy, ponieważ cały kod aplikacji i pamięć masowa są łatwo dostępne.
Po drugie, zamiast zwracania przez serwer autoryzacji kodu autoryzacji, który jest wymieniany na token dostępu, serwer autoryzacyjny zwraca token dostępu.
Szczegóły znajdziesz tutaj http://oauth2.thephpleague.com/authorization-server/which-grant/
źródło
Niejawny przepływ
Zalety
Niedogodności
Przepływ kodu autoryzacji
Zalety
Niedogodności
Cytowanie: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows
źródło
Pozwólcie, że podsumuję punkty, których nauczyłem się z powyższych odpowiedzi i dodam kilka własnych wniosków.
Przepływ kodu autoryzacji !!!
Niejawny przepływ dotacji !!!
źródło
Oba są bezpieczne, zależy to od środowiska, w którym go używasz.
To jest proste. Twój klient nie jest bezpieczny. Zobaczmy to szczegółowo.
Weź pod uwagę, że tworzysz aplikację przeciwko
Instagram API
, więc rejestrujesz swoją aplikacjęInstagram
i określasz, którejAPI's
potrzebujesz.Instagram
zapewni Ciclient_id
iclient_secrect
Na swojej stronie internetowej ustawiasz link, który mówi. „Przyjdź i użyj mojej aplikacji”. Kliknięcie tej aplikacji internetowej powinno wywołać dwa wywołania
Instagram API
.First
wyślij zapytanie doInstagram Authentication Server
z poniższymi parametrami.Nie wysyłasz
client_secret
, nie możesz zaufać klientowi (Użytkownikowi i / lub jego przeglądarce, która próbuje użyć Twojej aplikacji). Klient może zobaczyć adres URL lub skrypt java iclient_secrect
łatwo znaleźć plik. Dlatego potrzebujesz kolejnego kroku.Otrzymujesz
code
istate
.code
Tu jesttemporary
i nie jest zapisany w każdym miejscu.Następnie
second
dzwonisz doInstagram API
(ze swojego serwera)Ponieważ połączenie jest wykonywane z naszego serwera, możemy bezpiecznie użyć
client_secret
(co pokazuje, jak jesteśmy), zcode
którego pokazuje, że użytkownik zezwoliłclient_id
na korzystanie z zasobu.W odpowiedzi będziemy mieć
access_token
źródło
Z praktycznego punktu widzenia (co zrozumiałem), głównym powodem posiadania przepływu kodu Authz jest:
„Serwer autoryzacji uwierzytelnia właściciela zasobu (za pośrednictwem agenta użytkownika) i ustala, czy właściciel zasobu przyznaje, czy odrzuca żądanie dostępu klienta”
Poza tym, korzystając z tokenów odświeżania, aplikacje mogą uzyskać długoterminowy dostęp do danych użytkownika.
źródło
Wydaje się, że istnieją dwa kluczowe punkty, dotychczas nie omówione, które wyjaśniają, dlaczego objazd w ramach typu przyznania kodu autoryzacji zwiększa bezpieczeństwo.
Krótka historia : Przyznanie kodu autoryzacji przechowuje poufne informacje z historii przeglądarki, a transmisja tokena zależy tylko od ochrony serwera autoryzacyjnego HTTPS.
Dłuższa wersja:
W dalszej części będę trzymał się terminologii OAuth 2 zdefiniowanej w RFC (to szybki odczyt): serwer zasobów , klient , serwer autoryzacji , właściciel zasobów .
Wyobraź sobie, że chcesz, aby aplikacja innej firmy (= klient) miała dostęp do określonych danych Twojego konta Google (= serwer zasobów). Załóżmy po prostu, że Google używa OAuth 2. Jesteś właścicielem zasobów konta Google, ale w tej chwili obsługujesz aplikację innej firmy.
Najpierw klient otwiera przeglądarkę, aby wysłać Cię pod bezpieczny adres URL serwera autoryzacji Google. Następnie zatwierdzasz żądanie dostępu, a serwer autoryzacji odsyła Cię z powrotem do adresu URL przekierowania podanego wcześniej przez klienta, z kodem autoryzacji w ciągu zapytania. A teraz dwie kluczowe kwestie:
W przypadku Authorization Code Grant Type token jest ostatecznie uzyskiwany poprzez wywołanie od klienta serwera autoryzacyjnego, gdzie bezpieczeństwo transmisji zależy tylko od serwera autoryzacyjnego , a nie od klienta.
źródło