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

Überblick

Am 16. Februar 2022 haben wir Pläne angekündigt, Google OAuth-Interaktionen mithilfe sichererer OAuth-Abläufe sicherer zu machen. In diesem Leitfaden werden die erforderlichen Änderungen und Schritte für eine erfolgreiche Migration vom OAuth-Out-of-Band-Vorgang (OOB) zu unterstützten Alternativen erklärt.

Diese Maßnahme dient dem Schutz vor Phishing und Angriffen durch App-Identitätsdiebstahl bei Interaktionen mit den OAuth 2.0-Autorisierungsendpunkten von Google.

Was ist OOB?

OAuth Out-of-Band (OOB), auch als manuelle Kopieren/Einfügen-Option bezeichnet, ist ein Legacy-Ablauf, der zur Unterstützung nativer Clients entwickelt wurde, die keinen Weiterleitungs-URI haben, über den die Anmeldedaten akzeptiert werden, nachdem ein Nutzer eine OAuth-Zustimmungsanfrage genehmigt hat. Der OOB-Ablauf birgt ein Remote-Phishing-Risiko und Clients müssen zum Schutz vor dieser Sicherheitslücke zu einer alternativen Methode migrieren.

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

Wichtige Termine für die Einhaltung der Richtlinie

  • 28. Februar 2022 – Neue OAuth-Nutzung für OOB-Vorgang blockiert
  • 5. September 2022: Für nicht konforme OAuth-Anfragen wird möglicherweise eine an den Nutzer gerichtete Warnmeldung 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 Bestandskunden werden blockiert (einschließlich ausgenommener Clients)

Für nicht konforme Anfragen wird eine Fehlermeldung an den Nutzer angezeigt. In der Meldung wird den Nutzern mitgeteilt, dass die Anwendung blockiert ist. Gleichzeitig wird die Support-E-Mail angezeigt, die Sie auf dem 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, wenn Sie betroffen sind.

Ermitteln, ob Sie betroffen sind

Diese Einstellung gilt nur für Produktionsanwendungen, d. h. Apps, deren Veröffentlichungsstatus auf In Produktion gesetzt ist. Der Vorgang funktioniert weiterhin für Apps mit dem Veröffentlichungsstatus testen.

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

So stellst du fest, ob deine App den OOB-Ablauf verwendet

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

Anwendungscode prüfen

Prüfen Sie den Abschnitt Ihres Anwendungscodes, in dem Sie Aufrufe an die Autorisierungsendpunkte von Google OAuth senden, und stellen Sie fest, 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 zur Prüfung von Netzwerkaufrufen hängt vom Clienttyp Ihrer Anwendung ab.
Suchen Sie bei der Prüfung von Netzwerkaufrufen nach Anfragen, die an die Autorisierungsendpunkte von Google OAuth gesendet wurden. Prüfen Sie dann, 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
Hier sehen Sie ein Beispiel für eine OOB-Weiterleitungsanfrage:
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-Vorgang mit einem OAuth-Clienttyp für Android oder iOS verwendet, solltest du zu unseren mobilen Google Log-in-SDKs (Android, iOS) migrieren.

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

Unter den folgenden Dokumentationslinks erfährst du, wie du mit den Google Log-in SDKs ohne OOB-Weiterleitungs-URI auf Google APIs zugreifen kannst.

Auf Google APIs auf Android-Geräten zugreifen

Serverseitiger (Offline-)Zugriff
Das folgende Beispiel zeigt, wie der serverseitige Zugriff auf Google APIs unter Android erfolgt.
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 serverseitig auf Google APIs zugreifen können.

Mit einer iOS-App auf Google APIs zugreifen

Clientseitiger Zugriff

Das folgende Beispiel zeigt, wie Sie mit 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. 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-Autorisierungscode (GTMFetcherAuthorizationProtocol) mit der Google APIs-Clientbibliothek für Objective-C für REST.

Lesen Sie in der Anleitung für den clientseitigen Zugriff nach, wie Sie clientseitig auf Google APIs zugreifen können. wie Sie clientseitig auf Google APIs zugreifen.

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 können.

Chrome-App-Client

Wenn du feststellst, dass deine Anwendung den OOB-Ablauf auf dem Chrome-Anwendungsclient verwendet, solltest du zur Chrome Identity API migrieren.

Das folgende Beispiel zeigt, wie Sie alle Nutzerkontakte abrufen können, ohne eine 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. Hier finden Sie eine Liste der Clientbibliotheken für verschiedene Programmiersprachen.

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

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) für den Empfang des Autorisierungscodes.
  • Konfigurieren Sie den Weiterleitungs-URI in Credentials page der Google API Console

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

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 für serverseitige Webanwendungen erfahren Sie, wie Sie serverseitig auf Google APIs zugreifen können.

Clientseitiger Zugriff

Das folgende Code-Snippet in JavaScript zeigt ein Beispiel für die Verwendung der Google API, um auf der Clientseite auf 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 clientseitig auf Google APIs zugreifen können.

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.