Übersicht
Am 16. Februar 2022 haben wir angekündigt, dass wir Google OAuth-Interaktionen durch die Verwendung sichererer OAuth-Abläufe sicherer machen möchten. In diesem Leitfaden erfahren Sie, welche Änderungen und Schritte erforderlich sind, um erfolgreich vom Loopback-IP-Adressfluss zu unterstützten Alternativen zu migrieren.
Diese Maßnahme dient zum Schutz vor Phishing- und App-Imitationsangriffen bei der Interaktion mit den OAuth 2.0-Autorisierungsendpunkten von Google.
Was ist der Loopback-IP-Adressfluss?
Der Loopback-IP-Adressen-Ablauf unterstützt die Verwendung einer Loopback-IP-Adresse oderlocalhost
als Hostkomponente des Weiterleitungs-URI, an den Anmeldedaten gesendet werden, nachdem ein Nutzer einer OAuth-Einwilligungsanfrage zugestimmt hat. Dieser Ablauf ist anfällig für Man-in-the-Middle-Angriffe. Dabei kann eine schädliche App, die auf einigen Betriebssystemen auf dieselbe Loopback-Schnittstelle zugreift, die Antwort des Autorisierungsservers an die angegebene Weiterleitungs-URI abfangen und Zugriff auf den Autorisierungscode erhalten.
Der Loopback-IP-Adressen-Flow wird für die nativen OAuth-Client-Typen für iOS, Android und Chrome eingestellt, wird aber weiterhin für Desktop-Apps unterstützt.
Wichtige Termine für die Einhaltung der Richtlinie
- 14. März 2022: Neue OAuth-Clients können den Loopback-IP-Adressfluss nicht mehr verwenden.
- 1. August 2022: Nutzern wird möglicherweise eine Warnmeldung für nicht konforme OAuth-Anfragen angezeigt.
- 31. August 2022: Der Loopback-IP-Adressen-Ablauf wird für native Android-, Chrome-App- und iOS-OAuth-Clients blockiert, die vor dem 14. März 2022 erstellt wurden.
- 21. Oktober 2022: Alle bestehenden Kunden werden blockiert (einschließlich ausgenommener Kunden).
Für nicht konforme Anfragen wird eine Fehlermeldung für Nutzer angezeigt. In der Nachricht wird Nutzern mitgeteilt, dass die App blockiert ist. Außerdem wird die Support-E-Mail-Adresse angezeigt, die Sie auf dem OAuth-Zustimmungsbildschirm in der Google API Console registriert haben.
- Prüfen, ob Sie betroffen sind
- Wenn Sie betroffen sind, migrieren Sie zu einer unterstützten Alternative.
Prüfen, ob Sie betroffen sind
OAuth-Client-ID-Typ überprüfen
Rufen Sie die Clients page der Google Cloud Console auf und sehen Sie sich den Typ Ihrer OAuth-Client-ID im Abschnitt OAuth 2.0-Client-IDs an. Das kann eine der folgenden Optionen sein: Webanwendung, Android, iOS, Universal Windows Platform (UWP), Chrome-App, Fernseher und Geräte mit eingeschränkter Eingabe, Desktop-App.
Fahren Sie mit dem nächsten Schritt fort, wenn Ihr Client-Typ Android, Chrome-App oder iOS ist und Sie den Loopback-IP-Adressen-Ablauf verwenden.
Wenn Sie den Loopback-IP-Adressfluss in einem OAuth-Client für Desktop-Apps verwenden, müssen Sie nichts unternehmen, da die Verwendung mit diesem OAuth-Clienttyp weiterhin unterstützt wird.
So ermitteln Sie, ob Ihre App den Loopback-IP-Adressfluss verwendet
Prüfen Sie den Code Ihrer App oder den ausgehenden Netzwerkaufruf (falls Ihre App eine OAuth-Bibliothek verwendet), um festzustellen, ob die Autorisierungsanfrage von Google OAuth, die Ihre App stellt, Loopback-Weiterleitungs-URI-Werte verwendet.
Anwendungscode prüfen
redirect_uri
einen der folgenden Werte hat:
-
redirect_uri=http://127.0.0.1:<port>
z.B.redirect_uri=http://127.0.0.1:3000
-
redirect_uri=http://[::1]:<port>
z.B.redirect_uri=http://[::1]:3000
-
redirect_uri=http://localhost:<port>
z.B.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>
Ausgehenden Netzwerkanruf prüfen
- Webanwendung – Netzwerkaktivitäten in Chrome untersuchen
- Android – Netzwerkverkehr mit dem Network Inspector untersuchen
-
Chrome-Apps
- Rufen Sie die Seite Chrome-Erweiterungen auf.
- Klicken Sie rechts oben auf der Seite der Erweiterung das Kästchen Entwicklermodus an.
- Wählen Sie die Erweiterung aus, die Sie überwachen möchten.
- Klicken Sie auf der Erweiterungsseite im Bereich Ansichten prüfen auf den Link Hintergrundseite.
- Ein Pop-up-Fenster mit den Entwicklertools wird geöffnet. Dort können Sie den Netzwerkverkehr auf dem -Tab überwachen.
- iOS – HTTP-Traffic mit Instruments analysieren
- Universal Windows Platform (UWP) – Netzwerktraffic in Visual Studio untersuchen
- Desktop-Apps: Tool zur Netzwerkerfassung verwenden für das Betriebssystem, für das die App entwickelt wurde
redirect_uri
einen der folgenden Werte hat:
-
redirect_uri=http://127.0.0.1:<port>
z.B.redirect_uri=http://127.0.0.1:3000
-
redirect_uri=http://[::1]:<port>
z.B.redirect_uri=http://[::1]:3000
-
redirect_uri=http://localhost:<port>
z.B.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>
Zu einer unterstützten Alternative migrieren
Mobile Clients (Android / iOS)
Wenn Sie feststellen, dass Ihre App den Loopback-IP-Adressvorgang mit einem OAuth-Clienttyp für Android oder iOS verwendet, sollten Sie zu den empfohlenen SDKs (Android, iOS) migrieren.
Das SDK erleichtert den Zugriff auf Google APIs und verarbeitet alle Aufrufe der OAuth 2.0-Autorisierungsendpunkte von Google.
In den Dokumentationslinks unten finden Sie Informationen dazu, wie Sie mit den empfohlenen SDKs auf Google-APIs zugreifen können, ohne einen Loopback-IP-Adress-Weiterleitungs-URI zu verwenden.
Auf Google APIs unter Android zugreifen
Clientseitiger Zugriff
Im folgenden Beispiel wird gezeigt, wie Sie mit der empfohlenen Google Identity Services Android-Bibliothek auf Google-APIs auf der Clientseite unter Android zugreifen.
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));
Übergeben Sie authorizationResult
an die von Ihnen definierte Methode, um Inhalte im Drive-Ordner des Nutzers zu speichern. Das authorizationResult
hat die Methode
getAccessToken()
, die das Zugriffstoken zurückgibt.
Serverseitiger (Offline-)Zugriff
Das folgende Beispiel zeigt, wie Sie serverseitig auf Google APIs auf Android zugreifen.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));
Die authorizationResult
-Klasse hat die Methode
getServerAuthCode()
, die den Autorisierungscode zurückgibt, den Sie an Ihr Backend senden können, um ein Zugriffs- und Aktualisierungstoken zu erhalten.
Auf Google APIs in einer iOS-App zugreifen
Clientseitiger Zugriff
Das folgende Beispiel zeigt, wie Sie auf Google-APIs auf der Clientseite unter iOS zugreifen.
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() }
Verwenden Sie das Zugriffstoken, um die API aufzurufen. Dazu können Sie das Zugriffstoken entweder in den Header einer REST- oder gRPC-Anfrage (Authorization: Bearer ACCESS_TOKEN
) einfügen oder den Fetcher-Autorisierer (GTMFetcherAuthorizationProtocol
) mit der
Google API-Clientbibliothek für Objective-C für REST verwenden.
In der Anleitung für den clientseitigen Zugriff erfahren Sie, wie Sie clientseitig auf Google-APIs zugreifen. wie Sie clientseitig auf Google-APIs zugreifen können.
Serverseitiger (Offline-)Zugriff
Im folgenden Beispiel wird gezeigt, wie Sie serverseitig auf Google-APIs zugreifen, um einen iOS-Client zu unterstützen.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 }
Leitfaden für den serverseitigen Zugriff
Chrome-App-Client
Wenn Sie feststellen, dass Ihre App den Loopback-IP-Adressfluss auf dem Chrome-App-Client verwendet, sollten Sie zur Chrome Identity API migrieren.
Im folgenden Beispiel wird gezeigt, wie Sie alle Nutzerkontakte ohne Verwendung eines Loopback-IP-Adress-URI für die Weiterleitung abrufen.
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) }); }); }); };
Weitere Informationen zum Authentifizieren von Nutzern und Aufrufen von Google-Endpunkten mit der Chrome Identity API finden Sie im Leitfaden zur Chrome Identity API.