Omówienie
16 lutego 2022 r. ogłosiliśmy, że zamierzamy zwiększyć bezpieczeństwo interakcji z protokołem OAuth Google, stosując bezpieczniejsze przepływy OAuth. Z tego przewodnika dowiesz się, jakie zmiany należy wprowadzić i co zrobić, aby przejść z obsługi adresów IP pętli zwrotnej na obsługiwane alternatywy.
Jest to środek zapobiegający phishingowi i atakom polegającym na podszywanie się pod aplikację podczas interakcji z punktami końcowymi autoryzacji OAuth 2.0 Google.
Jak wygląda proces tworzenia adresu IP loopback?
Przepływ adresu IP pętli zwrotnej obsługuje używanie adresu IP pętli zwrotnej lublocalhost
jako elementu hosta adresu URI przekierowania, do którego wysyłane są dane logowania po zaakceptowaniu przez użytkownika żądania zgody OAuth. Ten proces jest podatny na ataki typu man in the middle, w których złośliwa aplikacja korzystająca z tego samego interfejsu pętli w niektórych systemach operacyjnych może przechwycić odpowiedź serwera autoryzacji na dany adres URI przekierowania i uzyskać dostęp do kodu autoryzacji.
Procedura adresu IP sprzężenia zwrotnego jest wycofywana w przypadku klientów OAuth w natywnych aplikacjach na iOS, Androida i Chrome, ale nadal będzie obsługiwana w aplikacjach na komputery.
Ważne daty dotyczące zgodności
- 14 marca 2022 r. – nowi klienci OAuth nie mogą już używać adresów loopback do przesyłania żądań OAuth.
- 1 sierpnia 2022 r. – w przypadku żądań OAuth niezgodnych z zasadami może być wyświetlany użytkownikowi komunikat z ostrzeżeniem.
- 31 sierpnia 2022 r. – blokowanie przepływu adresów IP sprzężenia zwrotnego w przypadku klientów OAuth w natywnej aplikacji na Androida, Chrome i iOS utworzonych przed 14 marca 2022 r.
- 21 października 2022 r. – zablokowanie wszystkich dotychczasowych klientów (w tym tych z wyjątkiem)
W przypadku żądań niezgodnych z tymi zasadami wyświetlany będzie komunikat o błędzie dla użytkownika. Wiadomość będzie informować użytkowników, że aplikacja jest zablokowana, a e-mail pomocy będzie wyświetlany z adresu e-mail, który został zarejestrowany na ekranie zgody OAuth w Konsoli interfejsów API Google.
- Sprawdź, czy dotyczy Cię ten problem.
- Przejdź na obsługiwaną metodę alternatywną, jeśli dotyczy Cię ten problem.
Sprawdź, czy dotyczy Cię ta zmiana
Sprawdź typ identyfikatora klienta OAuth
Otwórz i sprawdź typ identyfikatora klienta OAuth w sekcji Identyfikatory klienta OAuth 2.0. Może to być: aplikacja internetowa, Android, iOS, platforma Universal Windows Platform (UWP), aplikacja Chrome, telewizory i urządzenia z ograniczonym wejściem, aplikacja komputerowa.
Jeśli typ klienta to Android, aplikacja w Chrome lub iOS i używasz pętli adresu IP, przejdź do następnego kroku.
Jeśli używasz adresu IP pętli zwrotnej w kliencie OAuth aplikacji na komputer, nie musisz nic robić w związku z zaprzestaniem obsługi tego adresu, ponieważ ten typ klienta OAuth nadal będzie obsługiwany.
Jak sprawdzić, czy aplikacja używa pętli zwrotnej adresów IP
Sprawdź kod aplikacji lub wychodzące wywołanie sieci (jeśli aplikacja używa biblioteki OAuth), aby ustalić, czy żądanie autoryzacji OAuth Google wysyłane przez aplikację używa wartości identyfikatorów URI przekierowania pętli.
Sprawdzanie kodu aplikacji
redirect_uri
ma jedną z tych wartości:
-
redirect_uri=http://127.0.0.1:<port>
np.redirect_uri=http://127.0.0.1:3000
-
redirect_uri=http://[::1]:<port>
np.redirect_uri=http://[::1]:3000
-
redirect_uri=http://localhost:<port>
np.redirect_uri=http://localhost:3000
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
Sprawdzanie wychodzącego wywołania sieciowego
- Aplikacja internetowa – sprawdź aktywność sieci w Chrome
- Android – sprawdź ruch w sieci za pomocą narzędzia Network Inspector
-
Aplikacje w Chrome
- Otwórz stronę rozszerzeń Chrome.
- Zaznacz pole wyboru Tryb programisty w prawym górnym rogu strony rozszerzenia.
- Wybierz rozszerzenie, które chcesz monitorować.
- Na stronie rozszerzenia w sekcji Sprawdź widoki kliknij link strona w tle.
- Wyświetli się wyskakujące okienko Narzędzia dla programistów, w którym możesz monitorować ruch sieciowy na karcie Sieć.
- iOS – Analiza ruchu HTTP za pomocą Instruments
- Universal Windows Platform (UWP) – Sprawdzanie ruchu sieciowego w Visual Studio
- Aplikacje na komputery: skorzystaj z narzędzia do przechwytywania ruchu w siecidostępnego w systemie operacyjnym, na potrzeby którego aplikacja została opracowana.
redirect_uri
ma jedną z tych wartości:-
redirect_uri=http://127.0.0.1:<port>
np.redirect_uri=http://127.0.0.1:3000
-
redirect_uri=http://[::1]:<port>
np.redirect_uri=http://[::1]:3000
-
redirect_uri=http://localhost:<port>
np.redirect_uri=http://localhost:3000
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
Przechodzenie na obsługiwaną metodę alternatywną
Klienty mobilne (Android / iOS)
Jeśli ustalisz, że Twoja aplikacja korzysta z pętli zwrotnej adresu IP z typu klienta OAuth na Androida lub iOS, musisz przejść na zalecane pakiety SDK (Android, iOS).
Pakiet SDK ułatwia dostęp do interfejsów API Google i obsługuje wszystkie wywołania punktów końcowych autoryzacji OAuth 2.0 Google.
Linki do dokumentacji poniżej zawierają informacje o tym, jak używać zalecanych pakietów SDK do uzyskiwania dostępu do interfejsów API Google bez używania adresu URI przekierowania do adresu IP pętli zwrotnej.
Dostęp do interfejsów Google API na Androidzie
Dostęp po stronie klienta
Ten przykład pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie klienta na Androidzie za pomocą zalecanej biblioteki Google Identity Services na Androida.
ListrequestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA); AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build(); Identity.getAuthorizationClient(activity) .authorize(authorizationRequest) .addOnSuccessListener( authorizationResult -> { if (authorizationResult.hasResolution()) { // Access needs to be granted by the user PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage()); } } else { // Access already granted, continue with user action saveToDriveAppFolder(authorizationResult); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
Przekaż parametr authorizationResult
zdefiniowanej metodzie, aby zapisać treści w folderze Dysk użytkownika. Obiekt authorizationResult
zawiera metodę
getAccessToken()
, która zwraca token dostępu.
Dostęp po stronie serwera (offline)
Ten przykład pokazuje, jak uzyskać dostęp do interfejsów Google API po stronie serwera na Androidzie.ListrequestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA); AuthorizationRequest authorizationRequest = AuthorizationRequest.builder() .requestOfflineAccess(webClientId) .setRequestedScopes(requestedScopes) .build(); Identity.getAuthorizationClient(activity) .authorize(authorizationRequest) .addOnSuccessListener( authorizationResult -> { if (authorizationResult.hasResolution()) { // Access needs to be granted by the user PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage()); } } else { String authCode = authorizationResult.getServerAuthCode(); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
Usługa authorizationResult
udostępnia metodę
getServerAuthCode()
, która zwraca kod autoryzacji. Możesz go wysłać do backendu, aby uzyskać token dostępu i token odświeżania.
Dostęp do interfejsów Google API w aplikacji na iOS
Dostęp po stronie klienta
Przykład poniżej pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie klienta na iOS.
user.authentication.do { authentication, error in guard error == nil else { return } guard let authentication = authentication else { return } // Get the access token to attach it to a REST or gRPC request. let accessToken = authentication.accessToken // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for // use with GTMAppAuth and the Google APIs client library. let authorizer = authentication.fetcherAuthorizer() }
Użyj tokena dostępu do wywołania interfejsu API, umieszczając go w nagłówku żądania REST lub gRPC (Authorization: Bearer ACCESS_TOKEN
) albo używając autoryzatora pobierania (GTMFetcherAuthorizationProtocol
) z
biblioteką klienta interfejsów API Google dla języka Objective-C dla interfejsu REST.
Zapoznaj się z przewodnikiem po dostępie po stronie klienta, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie klienta. informacje o dostępie do interfejsów API Google po stronie klienta.
Dostęp po stronie serwera (w trybie offline)
Przykład poniżej pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie serwera, aby obsługiwać klienta na iOS.GIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in guard error == nil else { return } guard let user = user else { return } // request a one-time authorization code that your server exchanges for // an access token and refresh token let authCode = user.serverAuthCode }
Zapoznaj się z przewodnikiem po dostępie po stronie serwera, aby dowiedzieć się, jak uzyskać dostęp do interfejsów API Google po stronie serwera.
Klient aplikacji Chrome
Jeśli ustalisz, że Twoja aplikacja korzysta z procesu adresu IP sprzężenia zwrotnego w kliencie aplikacji Chrome, przejdź na korzystanie z interfejsu Chrome Identity API.
Przykład poniżej pokazuje, jak uzyskać wszystkie kontakty użytkownika bez użycia adresu URI przekierowania adresu IP pętli zwrotnej.
window.onload = function() { document.querySelector('button').addEventListener('click', function() { // retrieve access token chrome.identity.getAuthToken({interactive: true}, function(token) { // .......... // the example below shows how to use a retrieved access token with an appropriate scope // to call the Google People API contactGroups.get endpoint fetch( 'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY', init) .then((response) => response.json()) .then(function(data) { console.log(data) }); }); }); };
Więcej informacji o tym, jak uzyskiwać dostęp do danych użytkowników i wywoływać punkty końcowe Google za pomocą interfejsu Chrome Identity API, znajdziesz w przewodniku po tym interfejsie API.