Przegląd
16 lutego 2022 r. ogłosiliśmy plany zwiększenia bezpieczeństwa interakcji z OAuth Google przez używanie bezpieczniejszych przepływów OAuth. Z tego przewodnika dowiesz się, jakie zmiany i kroki są niezbędne, aby skutecznie przeprowadzić migrację z procesu adresu IP sprzężenia zwrotnego na obsługiwane alternatywy.
Jest to środek ochronny przed atakami phishingowymi i podszywaniem się pod aplikacje podczas interakcji z punktami końcowymi autoryzacji OAuth 2.0 Google.
Na czym polega proces adresu IP pętli zwrotnej?
Przepływ adresu IP pętli zwrotnej obsługuje użycie adresu IP pętli zwrotnej lublocalhost jako komponentu hosta w adresie URI przekierowania, do którego wysyłane są dane logowania po zatwierdzeniu przez użytkownika prośby o zgodę na OAuth. Ten proces jest podatny na ataki typu man in the middle, w których złośliwa aplikacja uzyskująca dostęp do tego samego interfejsu sprzężenia zwrotnego w niektórych systemach operacyjnych może przechwycić odpowiedź serwera autoryzacji na podany identyfikator URI przekierowania i uzyskać dostęp do kodu autoryzacji.
Procedura adresu IP sprzężenia zwrotnego jest wycofywana w przypadku klientów OAuth w aplikacjach na iOS, Androida i Chrome, ale będzie nadal obsługiwana w aplikacjach na komputery.
Najważniejsze daty związane z zgodnością
- 14 marca 2022 r. – blokowanie nowych klientów OAuth przed używaniem przepływu adresu IP Loopback
- 1 sierpnia 2022 r. – w przypadku niezgodnych żądań protokołu OAuth może być wyświetlany komunikat ostrzegawczy dla użytkownika.
- 31 sierpnia 2022 r. – zablokowanie przepływu adresu IP sprzężenia zwrotnego w przypadku klientów OAuth w aplikacjach na Androida, Chrome i iOS utworzonych przed 14 marca 2022 r.
- 21 października 2022 r. – wszyscy obecni klienci zostaną zablokowani (w tym klienci zwolnieni z obowiązku)
W przypadku żądań niezgodnych z zasadami będzie wyświetlany komunikat o błędzie dla użytkownika. Wiadomość będzie informować użytkowników, że aplikacja jest zablokowana, a także będzie zawierać adres e-mail pomocy zarejestrowany na ekranie zgody OAuth w konsoli Google Cloud.
- Sprawdź, czy zmiana wpłynie na Twoje treści.
- Jeśli dotyczy Cię ta zmiana, przejdź na obsługiwaną metodę alternatywną.
Sprawdź, czy zmiana wpłynie na Ciebie
Sprawdzanie typu identyfikatora klienta OAuth
Otwórz stronę Klienci w konsoli Google Cloud i sprawdź typ identyfikatora klienta OAuth w sekcji Identyfikatory klientów OAuth 2.0. Może to być jedna z tych platform: aplikacja internetowa, Android, iOS, uniwersalna platforma Windows (UWP), aplikacja Chrome, telewizory i urządzenia z ograniczonymi możliwościami wprowadzania danych, aplikacja na komputery.
Jeśli typ klienta to Android, aplikacja Chrome lub iOS i używasz przepływu adresu IP sprzężenia zwrotnego, przejdź do następnego kroku.
Jeśli używasz przepływu adresu IP sprzężenia zwrotnego w przypadku klienta OAuth w aplikacji na komputery, nie musisz nic robić w związku z tym wycofaniem, ponieważ korzystanie z tego typu klienta OAuth będzie nadal obsługiwane.
Jak sprawdzić, czy aplikacja korzysta z przepływu adresu IP pętli zwrotnej
Sprawdź kod aplikacji lub wychodzące wywołanie sieciowe (jeśli aplikacja korzysta z biblioteki protokołu OAuth), aby sprawdzić, czy żądanie autoryzacji protokołu OAuth Google wysyłane przez aplikację używa wartości identyfikatora URI przekierowania zwrotnego.
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 połączenia sieciowego
- Aplikacja internetowa - sprawdzanie aktywności sieci w Chrome
- Android - sprawdzanie ruchu w sieci za pomocą narzędzia Network Inspector
-
Aplikacje Chrome
- Otwórz stronę rozszerzeń do Chrome.
- Zaznacz pole wyboru Tryb programisty w prawym górnym rogu strony rozszerzenia.
- Wybierz rozszerzenie, które chcesz monitorować.
- W sekcji Sprawdzanie widoków na stronie rozszerzenia kliknij link strona w tle.
- Otworzy się wyskakujące okienko Narzędzia dla programistów, w którym możesz monitorować ruch w sieci na karcie Sieć.
- iOS - Analizowanie ruchu HTTP za pomocą narzędzia Instruments
- Aplikacje na komputery – użyj narzędzia do przechwytywania sieci dostępnego w systemie operacyjnym, w którym została opracowana aplikacja.
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>
Przejdź na obsługiwaną alternatywę
Klienci mobilni (Android / iOS)
Jeśli stwierdzisz, że Twoja aplikacja korzysta z przepływu z adresem IP pętli zwrotnej z klientem OAuth na Androida lub iOS, przenieś ją 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 za pomocą zalecanych pakietów SDK uzyskiwać dostęp do interfejsów API Google bez używania adresu IP sprzężenia zwrotnego ani identyfikatora URI przekierowania.
Dostęp do interfejsów API Google na Androidzie
Dostęp po stronie klienta
Poniższy 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ż authorizationResult do zdefiniowanej metody, aby zapisać treści w folderze na dysku użytkownika. Klasa authorizationResult ma metodę
getAccessToken(), która zwraca token dostępu.
Dostęp po stronie serwera (offline)
Poniższy przykład pokazuje, jak uzyskać dostęp do interfejsów API Google 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));
authorizationResult ma metodę
getServerAuthCode(), która zwraca kod autoryzacji, który możesz wysłać do backendu, aby uzyskać token dostępu i token odświeżania.
Dostęp do interfejsów API Google w aplikacji na iOS
Dostęp po stronie klienta
Poniższy przykład 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, dołączając go do nagłówka żądania REST lub gRPC (Authorization: Bearer ACCESS_TOKEN) albo używając autoryzatora modułu pobierania (GTMFetcherAuthorizationProtocol) z
biblioteką klienta interfejsów API Google dla języka Objective-C w przypadku 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. o tym, jak uzyskać dostęp do interfejsów API Google po stronie klienta.
Dostęp po stronie serwera (offline)
Poniższy przykład pokazuje, jak uzyskać dostęp do interfejsów API Google po stronie serwera, aby obsługiwać klienta 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 uzyskiwać dostęp do interfejsów API Google po stronie serwera.
Klient aplikacji Chrome
Jeśli stwierdzisz, że Twoja aplikacja korzysta z przepływu adresu IP sprzężenia zwrotnego na kliencie aplikacji Chrome, musisz przejść na interfejs Chrome Identity API.
Przykład poniżej pokazuje, jak uzyskać wszystkie kontakty użytkownika bez użycia identyfikatora 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 uwierzytelniać użytkowników i wywoływać punkty końcowe Google za pomocą interfejsu Chrome Identity API, znajdziesz w przewodniku po interfejsie Chrome Identity API.