Dzięki przepływowi „niejawnemu” klient (prawdopodobnie przeglądarka) otrzyma token dostępu po tym, jak właściciel zasobu (tj. Użytkownik) udzieli dostępu.
Jednak przy przepływie „kodu autoryzacyjnego” klient (zazwyczaj serwer WWW) otrzymuje kod autoryzacyjny dopiero po tym, jak właściciel zasobu (tj. Użytkownik) udzieli dostępu. Za pomocą tego kodu autoryzacji klient wykonuje kolejne wywołanie API przekazując identyfikator_użytkownika i identyfikator_klienta wraz z kodem autoryzacji w celu uzyskania tokena dostępu. Wszystko dobrze opisane tutaj .
Oba przepływy mają dokładnie ten sam wynik: token dostępu. Jednak przepływ „niejawny” jest znacznie prostszy.
Pytanie: Po co zawracać sobie głowę przepływem „Kod autoryzacji”, skoro przepływ „Implikowany” jest w porządku? Dlaczego nie użyć także „Implicit” dla serwera WWW?
To więcej pracy zarówno dla dostawcy, jak i klienta.
źródło
Odpowiedzi:
tl; dr: To wszystko ze względów bezpieczeństwa.
OAuth 2.0 chciał spełnić te dwa kryteria:
Szczegóły poniżej:
Domniemany przepływ jest możliwy tylko w środowisku przeglądarki ze względów bezpieczeństwa:
W niejawnym przepływie token dostępu jest przekazywany bezpośrednio jako fragment skrótu (nie jako parametr adresu URL). Jedną ważną rzeczą dotyczącą fragmentu skrótu jest to, że po przejściu do łącza zawierającego fragment skrótu tylko przeglądarka rozpoznaje fragment skrótu. Przeglądarki przekażą fragment skrótu bezpośrednio do docelowej strony internetowej (identyfikator URI przekierowania / strona klienta). Fragment skrótu ma następujące właściwości:
Umożliwia to przekazanie tokena dostępu bezpośrednio do klienta bez ryzyka przechwycenia go przez serwer pośredniczący. Jest to możliwe tylko dlatego, że jest to możliwe po stronie klienta i wymaga javascript do uruchomienia po stronie klienta, aby użyć tokena dostępu.
Domniemany przepływ ma również problemy z bezpieczeństwem, które wymagają dalszej logiki w celu obejścia / uniknięcia, na przykład:
W przepływie kodu autoryzacji nie jest możliwe przekazanie tokena dostępu bezpośrednio w parametrze URL, ponieważ parametry URL są częścią żądania HTTP, dlatego każdy serwer / routery pośredniczące, przez które przeszedłoby twoje żądanie (mogą być setki), mogłyby przeczytaj token dostępu, jeśli nie korzystasz z szyfrowanego połączenia (HTTPS), pozwalającego na tak zwane ataki typu man-in-the-middle.
Przekazywanie tokena dostępu bezpośrednio w parametrze adresu URL mogłoby teoretycznie być możliwe, ale serwer uwierzytelniania musiałby upewnić się, że identyfikator URI przekierowania używa HTTPS z szyfrowaniem TLS i „zaufanym” certyfikatem SSL (zazwyczaj z urzędu certyfikacji, który nie jest bezpłatny) aby upewnić się, że serwer docelowy jest prawidłowy i że żądanie HTTP jest w pełni zaszyfrowane. Nakłonienie wszystkich programistów do zakupu certyfikatu SSL i prawidłowego skonfigurowania protokołu SSL w ich domenie byłoby ogromnym bólem i spowolniłoby jego wdrażanie. Z tego powodu dostarczany jest pośredni jednorazowy „kod autoryzacyjny”, że tylko prawowity odbiorca będzie mógł wymieniać (ponieważ potrzebujesz tajnego klienta) i że kod będzie bezużyteczny dla potencjalnych hakerów przechwytujących żądania za pomocą niezaszyfrowanych transakcji (ponieważ oni nie
Można również argumentować, że domniemany przepływ jest mniej bezpieczny, istnieją potencjalne wektory ataku, takie jak fałszowanie domeny po przekierowaniu - na przykład poprzez przejęcie adresu IP witryny klienta. Jest to jeden z powodów, dla których przepływ niejawny przyznaje tylko tokeny dostępu (które mają mieć ograniczony czas użytkowania) i nigdy nie odświeża tokenów (które są nieograniczone w czasie). Aby rozwiązać ten problem, radzę, aby w miarę możliwości hostować swoje strony internetowe na serwerze obsługującym HTTPS.
źródło
Auth Code
potencjalnie przesyłane są jawnie przez HTTP. AleAuth Code
jest bezużyteczne bez identyfikatora klienta / tajnego. Zasadniczo przepływ kodu OAuth polega na tym, że ciężar posiadania serwera obsługującego protokół SSL spoczywa na dostawcy OAuth (Google / Facebook itp.), A nie na użytkownikach interfejsów API (ty, ja).Niejawny przepływu sprawia, że cały strumień całkiem proste, ale również mniej bezpieczne .
Ponieważ aplikacja kliencka, która zwykle działa w przeglądarce JavaScript, jest mniej zaufana, nie są zwracane żadne tokeny odświeżania dla długotrwałego dostępu.
Z przepływu tego należy korzystać w przypadku aplikacji wymagających tymczasowego dostępu (kilka godzin) do danych użytkownika.
Zwrócenie tokena dostępu do klientów JavaScript oznacza również, że Twoja aplikacja przeglądarki musi zachować szczególną ostrożność - pomyśl o atakach XSS, które mogą wyciec token dostępu do innych systemów.
https://labs.hybris.com/2012/06/05/oauth2-the-implicit-flow-aka-aka-as-the-client-side-flow
źródło
Ze specyfikacji OAuth :
Co możemy rozważyć:
Odnosi się to do publicznego OAuth, tzn. Gdy klient nie musi być rejestrowany i nie ma swoich własnych tajemnic klienta. Ale jaki serwer uwierzytelniający sprawdza adres URL przekierowania i to w rzeczywistości wystarcza dla bezpieczeństwa.
Token dostępu pojawia się w pasku adresu przeglądarki, więc użytkownik może skopiować adres URL i wysłać go komuś innemu, a także zostaje zalogowany jako użytkownik, tzn. Przypomina to utrwalanie sesji. Ale przeglądarka dokonuje dodatkowego przekierowania, zastępując historię, aby usunąć fragment skrótu z adresu URL. Haker może również ukraść token dostępu, wykrywając ruch HTTP, ale można to łatwo zabezpieczyć za pomocą HTTPS. Niektóre złośliwe rozszerzenia przeglądarki mogą mieć dostęp do adresów URL z paska adresu, ale jest to ostatecznie zła sytuacja, np. Zepsuty certyfikat HTTPS. I nawet przepływ kodu Auth nie może pomóc w tym eterze. Widzę więc, że przekazywanie tokena dostępu przez fragment skrótu adresu URL jest całkowicie bezpieczne.
Rozdzielanie efemerycznych tokenów dostępu i tokenów odświeżania są bezużyteczne, gdy używa się HTTPS i, szczerze mówiąc, nie są tak przydatne nawet na surowym HTTP. Ale fakt, że klient za pośrednictwem niejawnego przepływu nie może odebrać tokenu odświeżania, również jest nonsensem.
Dlatego uważam, że powinniśmy wprowadzić nowy „przepływ ukryty”, który działa ściśle w stosunku do protokołu https, pozwala na token odświeżania (lub w ogóle powinniśmy się go pozbyć) i jest lepszy niż przepływ przydziałów Auth Cose
źródło
Dla nas nasi klienci chcieli móc raz uwierzytelnić się za pomocą naszej aplikacji na swoich telefonach i nie musieli logować się ponownie przez kilka tygodni. Dzięki przepływowi kodu otrzymasz token odświeżania wraz z tokenem dostępu. Niejawny przepływ nie daje tokena odświeżania. Token dostępu ma stosunkowo krótki termin ważności, ale tokeny odświeżania mogą mieć ważność do 90 dni. Za każdym razem, gdy wygasa token dostępu, kod klienta i serwera może użyć tego tokenu odświeżania, aby uzyskać nowy token dostępu i token odświeżania, wszystko za kulisami, bez żadnej interwencji użytkownika. Tokenu odświeżającego można użyć tylko raz. Nie możesz tego zrobić za pomocą Implicit Flow. Jeśli korzystasz z usługi Implicit Flow, a użytkownik nie będzie kontaktował się z Twoją aplikacją przez ponad godzinę, będzie musiał zalogować się ponownie po powrocie. To było nie do przyjęcia w naszym przypadku użycia,
Działa to i jest bezpieczne, ponieważ tokeny odświeżania można odwołać. Jeśli klient powie, że zgubił telefon lub laptop albo haker wszedł na pulpit, możemy po prostu odwołać wszystkie tokeny odświeżania dla tego użytkownika. Podczas całego procesu żadne dane osobowe nigdy nie wpływają na nasz kod - mianowicie hasło użytkownika.
Przepływ kodu jest niesamowity, ale wymaga więcej pracy. MS nie ma obecnie biblioteki Angulara do obsługi tego, więc musiałem napisać jedną. Jeśli jesteś zainteresowany, mogę ci w tym pomóc.
źródło
Moja odpowiedź brzmi: nie można wdrożyć niejawnego przepływu w bezpieczny i prosty sposób za pomocą serwera aplikacji WWW.
Proces autoryzacji aplikacji internetowej obejmuje interakcję użytkownika, dlatego serwer uwierzytelniania powinien przekierowywać przeglądarkę użytkownika z powrotem na stronę docelową aplikacji internetowej po uwierzytelnieniu użytkownika i wyrażeniu zgody (nie widzę innego sposobu na przekazanie użytkownika z powrotem do aplikacji internetowej po interakcji z Serwer uwierzytelniania).
Więc token powinien zostać przekazany do aplikacji internetowej przy użyciu przekierowującego adresu URL, prawda?
Jak wyjaśnił @NicolasGarnier w swojej odpowiedzi i komentarzach, nie ma możliwości przekazania tokena jako fragmentu adresu URL - nie dotrze on do serwera aplikacji WWW.
Przekazywanie tokena jako parametru adresu URL przekierowania byłoby niebezpieczne nawet w przypadku HTTPS: jeśli strona docelowa (niech to będzie „strona z pozdrowieniami”) zawiera zasoby (obrazy, skrypty itp.), Zasoby te zostaną uzyskane przez przeglądarkę za pośrednictwem serii żądań HTTP (S) (każde z nich ma
Referer
nagłówek HTTP zawierający dokładny adres URL „strony z pozdrowieniami”, w tym parametry adresu URL). W ten sposób token może wyciekać.Wygląda więc na to, że nie można przekazać tokena w adresie URL przekierowania. Dlatego potrzebujesz drugiego połączenia (z serwera uwierzytelniania do klienta (ale pod który adres URL?) Lub z klienta do serwera uwierzytelnienia (drugie połączenie w przepływie kodu autoryzacji))
źródło