tl; dr: To wszystko ze względów bezpieczeństwa.
OAuth 2.0 chciał spełnić te dwa kryteria:
- Chcesz zezwolić programistom na używanie identyfikatora URI przekierowania innego niż HTTPS, ponieważ nie wszyscy programiści mają serwer z obsługą SSL, a jeśli tak, nie zawsze jest odpowiednio skonfigurowany (nie podpisane, zaufane certyfikaty SSL, zsynchronizowany zegar serwera ...).
- Nie chcesz, aby hakerzy mogli kraść tokeny dostępu / odświeżania, przechwytując żądania.
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:
- Nie są one częścią żądania HTTP, dlatego nie mogą być odczytane przez serwery i dlatego nie mogą zostać przechwycone przez serwery / routery pośredniczące (jest to ważne).
- Istnieją tylko w przeglądarce - po stronie klienta - więc jedynym sposobem na odczytanie fragmentu skrótu jest użycie JavaScript działającego na stronie.
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:
- Osoba atakująca może uzyskać token dostępu od użytkownika w innej witrynie / aplikacji (powiedzmy, że jest właścicielem innej witryny / aplikacji), zalogować token w swojej witrynie, a następnie przekazać go jako parametr adresu URL w witrynie dlatego podszywanie się pod użytkownika w Twojej witrynie. Aby tego uniknąć, musisz sprawdzić identyfikator klienta powiązany z tokenem dostępu (na przykład w Google możesz użyć punktu końcowego tokeninfo), aby upewnić się, że token został wydany z twoim własnym identyfikatorem klienta (tj. Przez własną aplikację) lub sprawdź podpis jeśli używasz IDToken (ale wymaga to tajnego klienta).
- Jeśli żądanie uwierzytelnienia nie pochodzi z Twojej własnej własności (zwanej atakami Session Fixation), aby tego uniknąć, będziesz chciał wygenerować losowy skrót z witryny, zapisz go w pliku cookie i przekaż ten sam skrót w stanie adresu URL parametru żądanie uwierzytelnienia, gdy użytkownik wróci, sprawdzasz parametr stanu z plikiem cookie i musi on być zgodny.
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.