Migrationsanleitung für Loopback-IP-Adressenfluss

Übersicht

Am 16. Februar 2022 haben wir Pläne angekündigt, Google OAuth-Interaktionen sicherer zu machen, indem wir sicherere OAuth Abläufe verwenden. Diese Anleitung hilft Ihnen, die erforderlichen Änderungen und Schritte zu erfolgreich vom Loopback-IP-Adressen-Ablauf zu unterstützten Alternativen zu migrieren.

Diese Maßnahme dient dem Schutz vor Phishing- und App-Imitationsangriffen bei Interaktionen mit den OAuth 2.0-Autorisierungsendpunkten von Google.

Was ist der Loopback-IP-Adressen-Ablauf?

Der Loopback-IP-Adressen-Ablauf unterstützt die Verwendung einer Loopback-IP-Adresse oder localhost als Hostkomponente der Weiterleitungs-URI, an die Anmeldedaten gesendet werden, nachdem ein Nutzer eine OAuth-Zustimmungsanfrage 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 vom Autorisierungsserver an die angegebene Weiterleitungs-URI abfangen und Zugriff auf den Autorisierungscode erhalten kann.

Der Loopback-IP-Adressen-Ablauf wird für die OAuth-Clienttypen iOS, Android, und Chrome eingestellt, wird aber weiterhin für Desktop Apps unterstützt.

Wichtige Compliance-Termine

  • 14. März 2022 : Neue OAuth-Clients können den Loopback IP-Adressen-Ablauf nicht mehr verwenden.
  • 1. August 2022 : Für nicht konforme OAuth-Anfragen wird möglicherweise eine Warnmeldung für Nutzer angezeigt.
  • 31. August 2022 : Der Loopback-IP-Adressen-Ablauf wird blockiert für Android-, Chrome-App- und iOS-OAuth-Clients, die vor dem 14. März 2022 erstellt wurden.
  • 21. Oktober 2022 : Alle vorhandenen Clients werden blockiert (einschließlich ausgenommener Clients).

Für nicht konforme Anfragen wird eine Fehlermeldung für Nutzer angezeigt. In der Meldung wird Nutzern mitgeteilt, dass die App blockiert ist, und die Support-E-Mail-Adresse angezeigt, die Sie auf dem OAuth-Zustimmungsbildschirm in der Google Cloud Console registriert haben.

Für die Migration sind zwei Hauptschritte erforderlich:
  1. Prüfen Sie, ob Sie betroffen sind.
  2. Migrieren Sie zu einer unterstützten Alternative, wenn Sie betroffen sind.

Prüfen, ob Sie betroffen sind

OAuth-Client-ID-Typ überprüfen

Rufen Sie die Seite „Clients“ der Google Cloud Console auf und sehen Sie sich Ihren OAuth-Client-ID-Typ im Abschnitt „OAuth 2.0-Client-IDs“ an. Er kann einer der folgenden Typen sein: Webanwendung, Android, iOS, Universelle Windows-Plattform (UWP), Chrome-App, Fernseher und Geräte mit eingeschränkter Eingabe, Desktop-App.

Fahren Sie mit dem nächsten Schritt fort, wenn Ihr Clienttyp „Android“, „Chrome-App“ oder „iOS“ ist und Sie den Loopback-IP-Adressen-Ablauf verwenden.

Wenn Sie den Loopback-IP-Adressen-Ablauf für einen OAuth-Client vom Typ „Desktop-App“ verwenden, müssen Sie nichts im Zusammenhang mit dieser Einstellung unternehmen, da die Verwendung mit diesem OAuth-Clienttyp weiterhin unterstützt wird.

So prüfen Sie, ob Ihre App den Loopback-IP-Adressen-Ablauf verwendet

Prüfen Sie Ihren App-Code oder den ausgehenden Netzwerkaufruf (falls Ihre App eine OAuth-Bibliothek verwendet), um festzustellen, ob die Google OAuth Autorisierungsanfrage Ihrer App Loopback-Weiterleitungs-URI-Werte verwendet.

Anwendungscode prüfen

Prüfen Sie den Abschnitt Ihres Anwendungscodes, in dem Sie Aufrufe an die Google OAuth-Autorisierungsendpunkte ausführen, und stellen Sie fest, ob der redirect_uri Parameter 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
Eine Beispielanfrage für den Loopback-IP-Adressen-Weiterleitungsablauf sieht so aus:
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

Die Methode zum Prüfen von Netzwerkaufrufen variiert je nach Clienttyp Ihrer Anwendung.
Suchen Sie beim Prüfen von Netzwerkaufrufen nach Anfragen, die an die Google OAuth Autorisierungsendpunkte gesendet werden, und stellen Sie fest, ob der redirect_uri Parameter 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
Eine Beispielanfrage für den Loopback-IP-Adressen-Weiterleitungsablauf sieht so aus:
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-Adressen-Ablauf mit einem Android- oder iOS OAuth-Clienttyp verwendet, sollten Sie zu den empfohlenen SDKs (Android, iOS) migrieren.

Mit dem SDK können Sie ganz einfach auf Google APIs zugreifen und alle Aufrufe an die OAuth 2.0-Autorisierungsendpunkte von Google verwalten.

Die Links zur Dokumentation unten enthalten Informationen zur Verwendung der empfohlenen SDKs für den Zugriff auf Google APIs ohne Weiterleitungs-URI für Loopback-IP-Adressen.

Auf Google APIs unter Android zugreifen

Clientseitiger Zugriff

Das folgende Beispiel zeigt, wie Sie unter Android clientseitig auf Google APIs zugreifen. Dazu wird die empfohlene Google Identity Services Android Library verwendet.

  List requestedScopes = 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 Ihre definierte Methode, um Inhalte im Drive-Ordner des Nutzers zu speichern. Das authorizationResult hat die getAccessToken() Methode, die das Zugriffstoken zurückgibt.

Serverseitiger (Offline-)Zugriff
Das folgende Beispiel zeigt, wie Sie unter Android serverseitig auf Google APIs zugreifen.
  List requestedScopes = 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));

Das authorizationResult hat die getServerAuthCode() Methode, die den Autorisierungscode zurückgibt. Sie können ihn an Ihr Back-End senden, um ein Zugriffs- und Aktualisierungstoken zu erhalten.

In einer iOS-App auf Google APIs zugreifen

Clientseitiger Zugriff

Das folgende Beispiel zeigt, wie Sie unter iOS clientseitig 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()
}

Verwenden Sie das Zugriffstoken, um die API aufzurufen. Dazu können Sie das Zugriffstoken entweder in den Header einer REST- oder gRPC-Anfrage einfügen (Authorization: Bearer ACCESS_TOKEN), oder den Fetcher-Autorisierer (GTMFetcherAuthorizationProtocol) mit der Google APIs-Clientbibliothek für Objective-C für REST verwenden.

In der Anleitung zum clientseitigen Zugriff erfahren Sie, wie Sie clientseitig auf Google APIs zugreifen. wie Sie clientseitig auf Google APIs zugreifen.

Serverseitiger (Offline-)Zugriff
Das folgende Beispiel zeigt, 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
}

In der Anleitung zum serverseitigen Zugriff erfahren Sie , wie Sie serverseitig auf Google APIs zugreifen.

Chrome-App-Client

Wenn Sie feststellen, dass Ihre App den Loopback-IP-Adressen-Ablauf auf dem Chrome App-Client verwendet, sollten Sie zur Verwendung der Chrome Identity API migrieren.

Das folgende Beispiel zeigt, wie Sie alle Nutzerkontakte ohne Weiterleitungs-URI für Loopback-IP-Adressen 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 zum Aufrufen von Google Endpunkten mit der Chrome Identity API finden Sie in der Anleitung zur Chrome Identity API.