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

Überblick

Am 16. Februar 2022 haben wir Pläne bekannt gegeben, Google OAuth-Interaktionen durch sicherere OAuth-Abläufe sicherer zu machen. In dieser Anleitung werden die erforderlichen Änderungen und Schritte für eine erfolgreiche Migration vom OAuth-Out-of-Band-Vorgang (OOB) zu unterstützten Alternativen erläutert.

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 Option zum manuellen Kopieren/Einfügen bezeichnet, ist ein Legacy-Vorgang, der für native Clients entwickelt wurde, die keinen Weiterleitungs-URI zum Akzeptieren der Anmeldedaten haben, nachdem ein Nutzer eine OAuth-Zustimmungsanfrage genehmigt hat. Der OOB-Ablauf birgt ein Remote-Phishing-Risiko und Clients müssen zu einer anderen Methode migrieren, um sich vor dieser Sicherheitslücke zu schützen.

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

Wichtige Compliancedaten

  • 28. Februar 2022 – Neue OAuth-Nutzung beim OOB-Vorgang blockiert
  • 5. September 2022: Für Nutzer wird möglicherweise eine Warnmeldung für nicht konforme OAuth-Anfragen angezeigt.
  • 3. Oktober 2022: Der OOB-Vorgang wird für OAuth-Clients, die vor dem 28. Februar 2022 erstellt wurden, eingestellt.
  • 31. Januar 2023: Alle vorhandenen Clients werden blockiert (einschließlich ausgenommener Clients)

Bei Anfragen, die gegen unsere Richtlinien verstoßen, wird eine Fehlermeldung an den Nutzer angezeigt. In der Nachricht wird den Nutzern mitgeteilt, dass die App blockiert ist. Außerdem wird die Support-E-Mail angezeigt, die Sie im OAuth-Zustimmungsbildschirm in der Google API Console registriert haben.

Der Migrationsprozess umfasst zwei Hauptschritte:
  1. Stellen Sie fest, ob Sie betroffen sind.
  2. Migrieren Sie zu einer sichereren Alternative, falls Sie betroffen sind.

Ermitteln, ob Sie betroffen sind

Diese Einstellung gilt nur für Produktionsanwendungen, d. h. Anwendungen, deren Veröffentlichungsstatus auf In Produktion gesetzt ist. Der Ablauf funktioniert weiterhin für Apps mit dem Veröffentlichungsstatus „Test“.

Prüfe deinen Veröffentlichungsstatus in der OAuth- Consent Screen pagevon Google API Console und fahre mit dem nächsten Schritt fort, wenn du den OOB-Ablauf in einem Projekt mit dem Veröffentlichungsstatus „In Produktion“ verwendest.

So ermitteln Sie, ob Ihre App den OOB-Ablauf verwendet

Prüfen Sie Ihren Anwendungscode oder den ausgehenden Netzwerkaufruf (falls Ihre Anwendung eine OAuth-Bibliothek verwendet), um festzustellen, ob für die von Ihrer Anwendung gesendete Google OAuth-Autorisierungsanfrage ein OOB-Weiterleitungs-URI-Wert verwendet wird.

Anwendungscode überprüfen

Prüfen Sie den Abschnitt Ihres Anwendungscodes, in dem Sie Aufrufe an die Google OAuth-Autorisierungsendpunkte senden, und ermitteln 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 einen OOB-Weiterleitungsvorgang 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 Netzwerkanruf prüfen

Die Methode zum Untersuchen von Netzwerkaufrufen hängt vom Typ des Anwendungsclients ab.
Suchen Sie bei der Prüfung von Netzwerkaufrufen nach Anfragen, die an die Autorisierungsendpunkte von Google OAuth gesendet wurden. Bestimmen 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 einen OOB-Weiterleitungsvorgang 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 du feststellst, dass deine App den OOB-Ablauf mit einem Android- oder iOS-OAuth-Clienttyp verwendet, solltest du zu unseren Google Log-in Mobile SDKs (Android, iOS) migrieren.

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

Die folgenden Dokumentationslinks enthalten Informationen zur Verwendung der Google Log-in SDKs für den Zugriff auf Google APIs ohne Verwendung eines OOB-Weiterleitungs-URI.

Auf Google APIs unter Android zugreifen

Serverseitiger (Offline-)Zugriff
Das folgende Beispiel zeigt, wie unter Android serverseitig auf Google APIs zugegriffen wird.
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
  GoogleSignInAccount account = task.getResult(ApiException.class);
  
  // request a one-time authorization code that your server exchanges for an
  // access token and sometimes refresh token
  String authCode = account.getServerAuthCode();
  
  // Show signed-in UI
  updateUI(account);

  // TODO(developer): send code to server and exchange for access/refresh/ID tokens
} catch (ApiException e) {
  Log.w(TAG, "Sign-in failed", e);
  updateUI(null);
}

In der Anleitung für den serverseitigen Zugriff erfahren Sie, wie Sie von der Serverseite aus auf Google APIs zugreifen.

Mit einer iOS-App auf Google APIs zugreifen

Clientseitiger Zugriff

Das folgende Beispiel zeigt, wie auf iOS-Geräten clientseitig auf Google APIs zugegriffen wird.

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. Fügen Sie dazu entweder das Zugriffstoken in den Header einer REST- oder gRPC-Anfrage (Authorization: Bearer ACCESS_TOKEN) ein oder verwenden Sie den Fetcher-Autorisierenr (GTMFetcherAuthorizationProtocol) mit der Google APIs-Clientbibliothek für Objective-C für REST.

In der Anleitung für clientseitigen Zugriff wird beschrieben, wie du clientseitig auf Google APIs zugreifen kannst. über den clientseitigen Zugriff auf Google APIs.

Serverseitiger (Offline-)Zugriff
Das folgende Beispiel zeigt, wie serverseitig auf Google APIs zugegriffen werden kann, 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 für den serverseitigen Zugriff erfahren Sie, wie Sie serverseitig auf Google APIs zugreifen.

Chrome-App-Client

Wenn Sie feststellen, dass Ihre Anwendung den OOB-Ablauf auf dem Chrome-App-Client verwendet, sollten Sie zur Chrome Identity API migrieren.

Das folgende Beispiel zeigt, wie Sie alle Nutzerkontakte abrufen können, 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 dazu, wie Sie mit der Chrome Identity API auf Nutzer authentifizieren und Google-Endpunkte aufrufen, finden Sie im Leitfaden zur Chrome Identity API.

Webanwendung

Wenn Sie feststellen, dass Ihre Anwendung den OOB-Ablauf für eine Webanwendung verwendet, sollten Sie zu einer unserer Google API-Clientbibliotheken migrieren. Clientbibliotheken für verschiedene Programmiersprachen sind hier aufgeführt.

Die Bibliotheken erleichtern den Zugriff auf Google APIs und die Verarbeitung aller Aufrufe an die Google-Endpunkte.

Serverseitiger (Offline-)Zugriff
Für den serverseitigen Zugriff (Offlinezugriff) 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 erhalten.
  • Konfigurieren Sie den Weiterleitungs-URI in der Credentials page der Google API Console

Das folgende Code-Snippet zeigt ein NodeJS-Beispiel für die Verwendung der Google Drive API, um die Google Drive-Dateien eines Nutzers auf der Serverseite ohne Verwendung eines OOB-Weiterleitungs-URI aufzulisten.

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

In der Anleitung zu serverseitigen Webanwendungen 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 zu clientseitigen Webanwendungen wird beschrieben, wie du clientseitig auf Google APIs zugreifen kannst.

Desktop-Client

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