Właśnie zaczynam pracę z Google API i OAuth2. Gdy klient autoryzuje moją aplikację, otrzymuję „token odświeżania” i krótkotrwały „token dostępu”. Teraz za każdym razem, gdy wygaśnie token dostępu, mogę wysłać mój token odświeżania do Google, a oni dadzą mi nowy token dostępu.
Moje pytanie brzmi: jaki jest cel wygasania tokena dostępu? Dlaczego zamiast tokena odświeżania nie może istnieć tylko długotrwały token dostępu?
Czy wygasa także token odświeżania?
Aby uzyskać więcej informacji o przepływie pracy Google OAuth2, zobacz Korzystanie z protokołu OAuth 2.0 w celu uzyskania dostępu do interfejsów API Google.
Kilka scenariuszy może pomóc zilustrować cel dostępu i odświeżania tokenów oraz kompromisy inżynieryjne w projektowaniu systemu oauth2 (lub dowolnego innego auth):
Scenariusz aplikacji internetowej
W scenariuszu aplikacji internetowej masz kilka opcji:
Wyobraźmy sobie, że komuś uda się porwać twoją sesję. Jedyne, co jest możliwe, to poprosić o swoje strony.
Porównywanie 1 i 2:
W 1, access_token i refresh_token poruszają się po sieci tylko na drodze między serwerem authorzation (Google w twoim przypadku) a serwerem aplikacji. Odbyłoby się to na bezpiecznym kanale. Haker może przejąć sesję, ale będzie mógł wchodzić w interakcje tylko z Twoją aplikacją internetową. W 2 haker może zabrać access_token i utworzyć własne żądania do zasobów, do których użytkownik udzielił dostępu. Nawet jeśli haker przejmie token dostępu, będzie miał tylko krótkie okno, w którym będzie mógł uzyskać dostęp do zasobów.
Tak czy inaczej, refresh_token i clientid / secret są znane tylko serwerowi, co uniemożliwia przeglądarce internetowej uzyskanie długoterminowego dostępu.
Wyobraźmy sobie, że wdrażasz oauth2 i ustaw długi limit czasu na tokenie dostępu:
W 1) Nie ma dużej różnicy między tokenem o krótkim i długim dostępie, ponieważ jest on ukryty na serwerze aplikacji. W 2) ktoś może uzyskać token_dostępu w przeglądarce, a następnie użyć go do bezpośredniego dostępu do zasobów użytkownika przez długi czas.
Scenariusz mobilny
Na telefonie komórkowym jest kilka znanych mi scenariuszy:
Przechowuj clientid / secret na urządzeniu i poproś urządzenie, aby uzyskało dostęp do zasobów użytkownika.
Użyj serwera aplikacji zaplecza, aby przechować identyfikator klienta / klucz tajny i zlecić mu wykonanie operacji. Użyj access_token jako rodzaju klucza sesji i przekaż go między klientem a serwerem aplikacji.
Porównywanie 1 i 2
W 1) Gdy już masz identyfikator klienta / sekret na urządzeniu, nie są one już tajne. Każdy może dekompilować, a następnie zacząć działać tak, jakby to był użytkownik, oczywiście za zgodą użytkownika. Access_token i refresh_token są również w pamięci i można uzyskać do nich dostęp na zaatakowanym urządzeniu, co oznacza, że ktoś może działać jako twoja aplikacja bez podania przez użytkownika ich poświadczeń. W tym scenariuszu długość access_token nie ma znaczenia dla hackability, ponieważ refresh_token znajduje się w tym samym miejscu, co access_token. W 2) klient / klucz tajny lub token odświeżania są zagrożone. Tutaj długość wygaśnięcia access_token określa, jak długo haker może uzyskać dostęp do zasobów użytkowników, jeśli je zdobędzie.
Okresy ważności
Tutaj zależy od tego, co zabezpieczasz w systemie uwierzytelniania, jak długo powinna trwać ważność twojego access_token. Jeśli jest to coś szczególnie cennego dla użytkownika, powinno być krótkie. Coś mniej cennego, może być dłuższe.
Niektóre osoby, takie jak Google, nie wygasają odświeżania. Niektóre takie jak Stackflow. Decyzja o wygaśnięciu jest kompromisem między łatwością obsługi a bezpieczeństwem. Długość tokenu odświeżania jest związana z długością zwracaną przez użytkownika, tj. Ustaw odświeżanie na to, jak często użytkownik powraca do Twojej aplikacji. Jeśli token odświeżania nie wygasa, jedynym sposobem na jego odwołanie jest jawne odwołanie. Zwykle logowanie nie zostanie cofnięte.
Mam nadzieję, że post o długości jest przydatny.
źródło
Oprócz innych odpowiedzi:
Po uzyskaniu tokeny dostępu są zazwyczaj wysyłane wraz z każdym żądaniem klientów do chronionych serwerów zasobów. Powoduje to ryzyko kradzieży i ponownego odtworzenia tokenu dostępu (zakładając oczywiście, że tokeny dostępu są typu „Nośnik” (jak zdefiniowano we wstępnej RFC6750).
Przykłady takich zagrożeń w prawdziwym życiu:
Serwery zasobów to zazwyczaj rozproszone serwery aplikacji i zazwyczaj mają niższe poziomy bezpieczeństwa w porównaniu do serwerów autoryzacji (niższa konfiguracja SSL / TLS, mniej hartowania itp.). Z drugiej strony serwery autoryzacji są zwykle uważane za krytyczną infrastrukturę bezpieczeństwa i podlegają bardziej surowemu zahartowaniu.
Tokeny dostępu mogą pojawiać się w śladach HTTP, dziennikach itp., Które są zbierane zgodnie z prawem do celów diagnostycznych na serwerach zasobów lub klientach. Ślady te można wymieniać w miejscach publicznych lub półpublicznych (narzędzia do śledzenia błędów, dział pomocy technicznej itp.).
Aplikacje zaplecza RS mogą być zlecane zewnętrznym stronom mniej lub bardziej godnym zaufania.
Z drugiej strony token odświeżania jest zwykle przesyłany tylko dwa razy przewodami i zawsze między klientem a serwerem autoryzacji: raz, gdy jest uzyskiwany przez klienta i raz, gdy jest używany przez klienta podczas odświeżania (skutecznie „wygasa” poprzednie odświeżenie znak). To drastycznie ograniczona możliwość przechwycenia i odtworzenia.
Ostatnia myśl, Odśwież Tokeny oferują bardzo małą ochronę, jeśli w ogóle, przed zagrożonymi klientami.
źródło
Jest to zasadniczo środek bezpieczeństwa. Jeśli Twoja aplikacja zostanie przejęta, osoba atakująca będzie miała dostęp tylko do krótkotrwałego tokena dostępu i nie będzie możliwości wygenerowania nowego.
Tokeny odświeżania również wygasają, ale mają żyć znacznie dłużej niż token dostępu.
źródło