Übersicht
Am 16. Februar 2022 haben wir angekündigt, dass wir Google OAuth-Interaktionen sicherer machen möchten, indem wir sicherere OAuth-Abläufe verwenden. Diese Anleitung hilft dir, die Änderungen und Schritte nachzuvollziehen, die zur Migration vom Loopback-IP-Adressfluss zu unterstützten Alternativen erforderlich sind.
Diese Maßnahme dient als Schutz vor Phishing- und App-Identitätsdiebstahl bei Interaktionen mit den OAuth 2.0-Autorisierungsendpunkten von Google.
Was ist der Ablauf einer Loopback-IP-Adresse?
Der Loopback-IP-Adressablauf unterstützt die Verwendung einer Loopback-IP-Adresse oderlocalhost
als Hostkomponente des Weiterleitungs-URI, an den Anmeldedaten gesendet werden, nachdem ein Nutzer eine OAuth-Einwilligungsanfrage genehmigt hat. Dieser Ablauf ist anfällig für Man-in-the-Middle-Angriffe, bei denen 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 kann.
Der Loopback-IP-Adress-Flow wird für die nativen OAuth-Clienttypen von iOS, Android und Chrome eingestellt, aber weiterhin für Desktop-Apps unterstützt.
Wichtige Termine für die Einhaltung der Richtlinien
- 14. März 2022: Neue OAuth-Clients können den Loopback-IP-Adressfluss nicht mehr verwenden
- 1. August 2022: Bei nicht konformen OAuth-Anfragen wird möglicherweise eine Warnmeldung 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)
Bei nicht konformen Anfragen wird eine Fehlermeldung angezeigt. Die Nachricht informiert Nutzer darüber, 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, sollten Sie zu einer unterstützten Alternative migrieren.
Prüfen, ob Sie betroffen sind
Typ der OAuth-Client-ID prüfen
Rufen Sie die der auf und sehen Sie sich den OAuth-Client-ID-Typ im Abschnitt OAuth 2.0-Client-IDs an. Es kann eine der folgenden Optionen sein: Webanwendung, Android, iOS, Universal Windows Platform (UWP), Chrome-App, Fernseher und Geräte mit eingeschränkter Eingabe oder Desktop-App.
Fahren Sie mit dem nächsten Schritt fort, wenn Ihr Clienttyp Android, Chrome App oder iOS ist und Sie den Loopback-IP-Adressablauf verwenden.
Wenn Sie den Loopback-IP-Adressablauf für einen OAuth-Client einer Desktopanwendung 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 App-Code oder den ausgehenden Netzwerkaufruf (falls Ihre App eine OAuth-Bibliothek verwendet), um festzustellen, ob die von Ihrer App gesendeten OAuth-Autorisierungsanfragen Loopschleifen-Weiterleitungs-URI-Werte verwenden.
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 Netzwerkaufruf prüfen
- Webanwendung – Netzwerkaktivitäten in Chrome prüfen
- Android: Netzwerkverkehr mit dem Netzwerk-Inspektionstool prüfen
-
Chrome-Apps
- Rufen Sie die Seite mit Chrome-Erweiterungen auf.
- Klicken Sie rechts oben auf der Seite der Erweiterung auf das Kästchen Entwicklermodus.
- Wählen Sie die Erweiterung aus, die Sie überwachen möchten.
- Klicken Sie auf der Seite der Erweiterung im Bereich Ansichten prüfen auf den Link Hintergrundseite.
- Ein Pop-up mit den Entwicklertools wird geöffnet. Auf dem Tab Netzwerk können Sie den Netzwerkverkehr überwachen.
- iOS – HTTP-Traffic mit Instruments analysieren
- Universal Windows Platform (UWP) – Netzwerkverkehr in Visual Studio prüfen
- Desktop-Apps: Verwenden Sie ein Netzwerk-Capture-Tool, das für das Betriebssystem verfügbar ist, 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-Adressablauf mit einem Android- oder iOS-OAuth-Clienttyp verwendet, sollten Sie zu den empfohlenen SDKs migrieren (Android, iOS).
Das SDK ermöglicht den einfachen Zugriff auf Google APIs und verarbeitet alle Aufrufe an die OAuth 2.0-Autorisierungsendpunkte von Google.
In den folgenden Links zur Dokumentation finden Sie Informationen dazu, wie Sie mit den empfohlenen SDKs auf Google APIs zugreifen, ohne einen Redirect-URI für eine Loopback-IP-Adresse zu verwenden.
Auf Google APIs auf Android-Geräten zugreifen
Clientseitiger Zugriff
Im folgenden Beispiel wird gezeigt, wie Sie mit der empfohlenen Android-Bibliothek für Google Identity Services auf der Clientseite auf Android-Geräten auf Google APIs 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. Der authorizationResult
hat die Methode
getAccessToken()
, die das Zugriffstoken zurückgibt.
Serverseitiger (offline) Zugriff
Das folgende Beispiel zeigt, wie Sie auf Android-Geräten serverseitig auf Google APIs 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
hat die Methode
getServerAuthCode()
, die den Autorisierungscode zurückgibt, den du an dein Backend senden kannst, um ein Zugriffs- und Aktualisierungstoken zu erhalten.
Auf Google APIs in einer iOS-App zugreifen
Clientseitiger Zugriff
Im folgenden Beispiel wird gezeigt, wie Sie auf der Clientseite unter iOS auf Google APIs 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() }
Rufe die API mit dem Zugriffstoken auf. Füge das Zugriffstoken entweder in den Header einer REST- oder gRPC-Anfrage (Authorization: Bearer ACCESS_TOKEN
) ein oder verwende den Abrufautorisierer (GTMFetcherAuthorizationProtocol
) mit der
Google API-Clientbibliothek für Objective-C für REST.
In der Anleitung zum clientseitigen Zugriff erfahren Sie, wie Sie clientseitig auf Google APIs zugreifen. Informationen zum clientseitigen Zugriff auf Google APIs.
Serverseitiger (offline) Zugriff
Im folgenden Beispiel wird gezeigt, wie Sie auf der Serverseite 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 }
In der Anleitung zum serverseitigen Zugriff erfahren Sie, wie Sie von der Serverseite auf Google APIs zugreifen.
Chrome App-Client
Wenn Sie feststellen, dass Ihre App den Loopback-IP-Adressfluss auf dem Chrome App-Client verwendet, sollten Sie zur Verwendung der Chrome Identity API migrieren.
Im folgenden Beispiel wird gezeigt, wie Sie alle Nutzerkontakte abrufen, ohne einen URI für die Weiterleitung an eine Loopback-IP-Adresse zu verwenden.
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 zum Aufrufen von Google-Endpunkten mit der Chrome Identity API finden Sie im Chrome Identity API-Leitfaden.