Ü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.
- Stellen Sie fest, ob Sie betroffen sind.
- 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
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
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
- Webanwendung – Netzwerkaktivität in Chrome prüfen
- Android – Netzwerkverkehr mit dem Network Inspector prüfen
-
Chrome-Apps
- Rufen Sie die Seite Chrome-Erweiterungen auf.
- Klicken Sie rechts oben auf der Erweiterungsseite das Kästchen Entwicklermodus an.
- Erweiterung auswählen, die überwacht werden soll
- Klicken Sie auf der Erweiterungsseite im Bereich Ansichten prüfen auf den Link Hintergrundseite.
- Das Pop-up-Fenster Entwicklertools wird geöffnet, in dem Sie den Netzwerkverkehr auf dem Tab „Netzwerk“ überwachen können.
- iOS – HTTP-Traffic mit Instrumenten analysieren
- Universal Windows Platform (UWP) – Netzwerktraffic in Visual Studio prüfen
- Desktopanwendungen: Verwenden Sie ein Netzwerkerfassungstool, das für das Betriebssystem verfügbar ist, für das die App entwickelt wurde.
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
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
- 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.