Migrationsanleitung für Out-of-Band-Datenflüsse (OOB)

Ü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 OAuth-OOB-Vorgang (Out-of-Band) 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 OOB?

OAuth out-of-band (OOB), auch als manuelle Kopier-/Einfügeoption bezeichnet, ist ein älterer Ablauf, der entwickelt wurde, um native Clients zu unterstützen, die keinen Weiterleitungs-URI haben, um die Anmeldedaten zu akzeptieren, nachdem ein Nutzer eine OAuth-Einwilligungsanfrage genehmigt hat. Der OOB-Vorgang birgt ein Remote-Phishing-Risiko und Kunden müssen zu einer alternativen Methode migrieren, um sich vor dieser Sicherheitslücke zu schützen.

Der OOB-Vorgang wird für alle Clienttypen eingestellt, also für Webanwendungen, Android, iOS, Universal Windows Platform (UWP), Chrome-Apps, Fernseher und Geräte mit eingeschränkter Eingabe sowie Desktop-Apps.

Wichtige Termine für die Einhaltung der Richtlinien

  • 28. Februar 2022: Neue OAuth-Nutzung für den OOB-Vorgang blockiert
  • 5. September 2022: Bei nicht konformen OAuth-Anfragen wird Nutzern möglicherweise eine Warnung angezeigt.
  • 3. Oktober 2022: Der OOB-Ablauf wird für OAuth-Clients eingestellt, die vor dem 28. Februar 2022 erstellt wurden.
  • 31. Januar 2023: 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.

Die Migration umfasst zwei Hauptschritte:
  1. Prüfen, ob Sie betroffen sind
  2. Wenn Sie betroffen sind, sollten Sie zu einer sichereren Alternative migrieren.

Prüfen, ob Sie betroffen sind

Diese Einstellung gilt nur für Produktions-Apps, d. h. Apps, deren Veröffentlichungsstatus auf In Produktion festgelegt ist. Der Ablauf funktioniert weiterhin für Apps mit dem Veröffentlichungsstatus „Testen“.

Prüfe den im OAuth- und fahre mit dem nächsten Schritt fort, wenn du den OAuth-Out-of-Browser-Vorgang in einem Projekt mit dem Veröffentlichungsstatus „In Produktion“ verwendest.

So prüfen Sie, ob Ihre App den OOB-Ablauf 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 getätigte OAuth-Autorisierungsanfrage einen OOB-Weiterleitungs-URI-Wert verwendet.

Anwendungscode prüfen

Prüfen Sie den Abschnitt Ihres Anwendungscodes, in dem Sie die Autorisierungsendpunkte von Google OAuth aufrufen, und sehen Sie nach, ob der Parameter redirect_uri einen der folgenden Werte hat:
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Eine Beispielanfrage für den Ablauf einer OOB-Weiterleitung sieht so aus:
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
scope=<SCOPES>&
state=<STATE>&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
client_id=<CLIENT_ID>

Ausgehenden Netzwerkaufruf prüfen

Die Methode zur Prüfung von Netzwerkanrufen hängt vom Anwendungsclienttyp ab.
Suchen Sie bei der Prüfung von Netzwerkanrufen nach Anfragen, die an die Autorisierungsendpunkte von Google OAuth gesendet wurden, und prüfen Sie, ob der Parameter redirect_uri einen der folgenden Werte hat:
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob
  • redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
  • redirect_uri=oob
Eine Beispielanfrage für den Ablauf einer OOB-Weiterleitung sieht so aus:
https://accounts.google.com/o/oauth2/v2/auth?
response_type=code&
scope=<SCOPES>&
state=<STATE>&
redirect_uri=urn:ietf:wg:oauth:2.0:oob&
client_id=<CLIENT_ID>

Zu einer sicheren Alternative migrieren

Mobile Clients (Android / iOS)

Wenn Sie feststellen, dass in Ihrer App der OOB-Vorgang mit einem Android- oder iOS-OAuth-Clienttyp verwendet wird, sollten Sie zu den empfohlenen SDKs migrieren (Android, iOS).

Das SDK erleichtert den Zugriff auf Google APIs und verarbeitet alle Aufrufe an die OAuth 2.0-Autorisierungsendpunkte von Google.

In den folgenden Dokumentationslinks finden Sie Informationen dazu, wie Sie mit den empfohlenen SDKs auf Google APIs zugreifen, ohne eine OOB-Weiterleitungs-URI 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.

  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 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.
  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));

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 auf iOS-Geräten 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 es dazu 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 auf clientseitiger Seite 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 OOB-Vorgang auf dem Chrome App-Client verwendet, sollten Sie zur Chrome Identity API migrieren.

Im folgenden Beispiel wird gezeigt, wie Sie alle Nutzerkontakte abrufen, ohne einen OOB-Weiterleitungs-URI 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.

Webanwendung

Wenn Sie feststellen, dass Ihre App den OOB-Vorgang für eine Webanwendung verwendet, sollten Sie zu einer unserer Google API-Clientbibliotheken migrieren. Clientbibliotheken für verschiedene Programmiersprachen sind in dieser Liste aufgeführt.

Mit den Bibliotheken können Sie ganz einfach auf Google APIs zugreifen und alle Aufrufe an die Google-Endpunkte verarbeiten.

Serverseitiger (offline) Zugriff
Für den serverseitigen (offline) Zugriffsmodus müssen Sie Folgendes tun:
  • Richten Sie einen Server ein und definieren Sie einen öffentlich zugänglichen Endpunkt (den Weiterleitungs-URI), um den Autorisierungscode zu empfangen.
  • Konfigurieren Sie den Weiterleitungs-URI in der der .

Im folgenden Code-Snippet wird ein Node.js-Beispiel für die Verwendung der Google Drive API zum Auflisten der Google Drive-Dateien eines Nutzers auf der Serverseite ohne OOB-Weiterleitungs-URI gezeigt.

async function main() {
  const server = http.createServer(async function (req, res) {

  if (req.url.startsWith('/oauth2callback')) {
    let q = url.parse(req.url, true).query;

    if (q.error) {
      console.log('Error:' + q.error);
    } else {
      
      // Get access and refresh tokens (if access_type is offline)
      let { tokens } = await oauth2Client.getToken(q.code);
      oauth2Client.setCredentials(tokens);

      // Example of using Google Drive API to list filenames in user's Drive.
      const drive = google.drive('v3');
      drive.files.list({
        auth: oauth2Client,
        pageSize: 10,
        fields: 'nextPageToken, files(id, name)',
      }, (err1, res1) => {
        // TODO(developer): Handle response / error.
      });
    }
  }
}

Im Leitfaden für serverseitige Web-Apps erfahren Sie, wie Sie serverseitig auf Google APIs zugreifen.

Clientseitiger Zugriff

Das folgende Code-Snippet in JavaScript zeigt ein Beispiel für die Verwendung der Google API, um clientseitig auf die Kalendertermine von Nutzern zuzugreifen.


// initTokenClient() initializes a new token client with your
// web app's client ID and the scope you need access to

const client = google.accounts.oauth2.initTokenClient({
  client_id: 'YOUR_GOOGLE_CLIENT_ID',
  scope: 'https://www.googleapis.com/auth/calendar.readonly',
  
  // callback function to handle the token response
  callback: (tokenResponse) => {
    if (tokenResponse && tokenResponse.access_token) { 
      gapi.client.setApiKey('YOUR_API_KEY');
      gapi.client.load('calendar', 'v3', listUpcomingEvents);
    }
  },
});

function listUpcomingEvents() {
  gapi.client.calendar.events.list(...);
}

In der Anleitung für clientseitige Webanwendungen erfahren Sie, wie Sie von der Clientseite auf Google APIs zugreifen.

Desktop client

Wenn Sie feststellen, dass Ihre App den OOB-Ablauf auf einem Desktop-Client verwendet, sollten Sie zu Loopback-IP-Adressen (localhost oder 127.0.0.1) migrieren.