Przegląd
16 lutego 2022 r. ogłosiliśmy plany zwiększenia bezpieczeństwa interakcji z OAuth Google przez używanie bezpieczniejszych procesów OAuth. Ten przewodnik pomoże Ci zrozumieć niezbędne zmiany i kroki, które musisz wykonać, aby pomyślnie przeprowadzić migrację z procesu adresu IP sprzężenia zwrotnego na obsługiwane alternatywy.
Działania te mają na celu ochronę przed phishingiem i atakami polegającymi na podszywaniu się pod aplikację podczas interakcji z punktami końcowymi autoryzacji OAuth 2.0 Google.
Czym jest proces adresu IP sprzężenia zwrotnego?
Proces adresu IP sprzężenia zwrotnego obsługuje używanie adresu IP sprzężenia zwrotnego lublocalhost jako komponentu hosta identyfikatora URI przekierowania, do którego
dane logowania są wysyłane po tym, jak użytkownik zatwierdzi prośbę o zgodę 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ź z serwera autoryzacji do danego
identyfikatora URI przekierowania i uzyskać dostęp do kodu autoryzacji.
Proces adresu IP sprzężenia zwrotnego jest wycofywany w przypadku natywnych klientów OAuth na iOS, Androida, i Chrome, ale nadal będzie obsługiwany w aplikacjach na komputery.
Najważniejsze daty związane z zgodnością
- 14 marca 2022 r. – blokowanie nowych klientów OAuth, którzy używają procesu adresu IP sprzężenia zwrotnego.
- 1 sierpnia 2022 r. – w przypadku niezgodnych żądań protokołu OAuth może się wyświetlać ostrzeżenie dla użytkownika.
- 31 sierpnia 2022 r. – blokowanie procesu adresu IP sprzężenia zwrotnego w przypadku natywnych klientów OAuth na Androida, w aplikacjach Chrome i na iOS utworzonych przed 14 marca 2022 r.
- 21 października 2022 r. – blokowanie wszystkich dotychczasowych klientów (w tym klientów zwolnionych z tego obowiązku).
W przypadku niezgodnych żądań będzie się wyświetlać komunikat o błędzie dla użytkownika. Komunikat będzie informować użytkowników, że aplikacja jest zablokowana, a jednocześnie będzie wyświetlać adres e-mail pomocy, który został zarejestrowany na ekranie zgody OAuth w Konsoli interfejsów API Google.
- Sprawdź, czy dotyczy Cię ta zmiana.
- Jeśli dotyczy Cię ta zmiana, przeprowadź migrację na obsługiwaną alternatywę.
Sprawdzanie, czy dotyczy Cię ta zmiana
Sprawdzanie typu identyfikatora klienta OAuth
Otwórz stronę Klienci w konsoli Google Cloud i w sekcji Identyfikatory klientów OAuth 2.0 sprawdź typ identyfikatora klienta OAuth. Może to być jedna z tych wartości: Aplikacja internetowa, Android, iOS, Platforma uniwersalna systemu 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 procesu adresu IP sprzężenia zwrotnego, przejdź do następnego kroku.
Jeśli używasz procesu adresu IP sprzężenia zwrotnego w przypadku klienta OAuth aplikacji na komputery, nie musisz podejmować żadnych działań związanych z tym wycofaniem, ponieważ używanie tego typu klienta OAuth będzie nadal obsługiwane.
Jak sprawdzić, czy aplikacja używa procesu adresu IP sprzężenia zwrotnego
Sprawdź kod aplikacji lub wychodzące połączenie sieciowe (jeśli aplikacja używa biblioteki OAuth), aby sprawdzić, czy żądanie autoryzacji OAuth Google wysyłane przez aplikację używa wartości identyfikatora URI przekierowania sprzężenia 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 sieciowej w Chrome
- Android – sprawdzanie ruchu w sieci za pomocą inspektora sieci.
-
Aplikacje Chrome
- Otwórz stronę rozszerzeń Chrome .
- Zaznacz pole wyboru Tryb programisty w prawym górnym rogu strony rozszerzeń.
- Wybierz rozszerzenie, które chcesz monitorować.
- W sekcji Sprawdź widoki 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ędzi
- 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>
Migracja na obsługiwaną alternatywę
Klienci mobilni (Android / iOS)
Jeśli stwierdzisz, że Twoja aplikacja używa procesu adresu IP sprzężenia zwrotnego z typem klienta OAuth na Androida lub iOS , powinna przejść na korzystanie z zalecanych pakietów SDK (Android, iOS).
Pakiet SDK ułatwia dostęp do interfejsów API Google i obsługuje wszystkie wywołania do 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 identyfikatora URI przekierowania adresu IP sprzężenia zwrotnego.
Dostęp do interfejsów API Google na Androidzie
Dostęp po stronie klienta
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 Dysku użytkownika. 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, aby wywołać interfejs API, dołączając token dostępu do
nagłówka żą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 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. 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 uzyskać dostęp do interfejsów API Google po stronie serwera.
Klient aplikacji Chrome
Jeśli stwierdzisz, że Twoja aplikacja używa procesu adresu IP sprzężenia zwrotnego w przypadku klienta aplikacji Chrome , powinna przejść na korzystanie z interfejsu Chrome Identity API.
Poniższy przykład pokazuje, jak uzyskać wszystkie kontakty użytkownika bez używania identyfikatora URI przekierowania adresu IP sprzężenia zwrotnego.
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.