Von GoogleAuthUtil und Plus.API migrieren

Wenn Sie Google Sign-In in der Vergangenheit mit GoogleAuthUtil.getToken oder Plus.API eingebunden haben, sollten Sie zur neuesten Sign-In API migrieren, um für mehr Sicherheit und eine bessere Nutzerfreundlichkeit zu sorgen.

Von Anti-Pattern für Zugriffstokens migrieren

Sie sollten keine mit GoogleAuthUtil.getToken erhaltenen Zugriffstokens als Identitätsbestätigung an Ihren Backend-Server senden, da Sie nicht einfach überprüfen können, ob das Token für Ihr Backend ausgestellt wurde. Sie sind dann anfällig für das Einschleusen eines Zugriffstokens durch einen Angreifer.

Wenn Ihr Android-Code beispielsweise so aussieht wie im Beispiel unten, sollten Sie Ihre App auf die aktuellen Best Practices umstellen.

Android-Code

In diesem Beispiel verwenden Zugriffstokenanfragen oauth2: und einen Bereichsstring als scope-Parameter für den GoogleAuthUtil.getToken-Aufruf (oauth2:https://www.googleapis.com/auth/plus.login).

Verwenden Sie anstelle der Authentifizierung mit einem Zugriffstoken, das Sie mit GoogleAuthUtil.getToken erhalten haben, entweder den ID-Token-Vorgang oder den Authentifizierungscode-Vorgang.

Zum ID-Token-Vorgang migrieren

Wenn Sie nur die ID, die E-Mail-Adresse, den Namen oder die Profilbild-URL des Nutzers benötigen, verwenden Sie den Vorgang für ID-Token.

Nehmen Sie die folgenden Änderungen vor, um zum ID-Token-Ablauf zu migrieren:

Android-Clientseite

  • Die Berechtigung GET_ACCOUNTS (Kontakte) entfernen, wenn Sie dies anfordern
  • Ersetzen Sie Code, der GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() oder AccountManager.newChooseAccountIntent() enthält, durch Auth.GOOGLE_SIGN_IN_API mit der Konfiguration GoogleSignInOptions.Builder.requestIdToken(...).

Serverseitig

Zum Server-Authentifizierungscode-Vorgang migrieren

Wenn Ihr Server auf andere Google APIs wie Google Drive, YouTube oder Kontakte zugreifen muss, verwenden Sie den Server-Authentifizierungscode.

Nehmen Sie die folgenden Änderungen vor, um zum Server-Authentifizierungscode-Ablauf zu migrieren:

Android-Clientseite

  • Die Berechtigung GET_ACCOUNTS (Kontakte) entfernen, wenn Sie dies anfordern
  • Ersetzen Sie Code, der GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() oder AccountManager.newChooseAccountIntent() enthält, durch Auth.GOOGLE_SIGN_IN_API mit der Konfiguration GoogleSignInOptions.Builder.requestServerAuthCode(...).

Serverseitig

Sie können die Logik für den API-Zugriff weiterhin zwischen Ihren alten und neuen Endpunkten teilen. Beispiel:

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...);
String accessToken = tokenResponse.getAccessToken();
String refreshToken = tokenResponse.getRefreshToken();
Long expiresInSeconds = tokenResponse.getExpiresInSeconds();

// Shared by your old and new implementation, old endpoint can pass null for refreshToken
private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) {
   GoogleCredential credential = new GoogleCredential.Builder()
           .setTransPort(...)
           ...
           .build();
   credential.setAccessToken(accessToken);
   credential.setExpiresInSeconds(expiresInSeconds);
   credential.setRefreshToken(refreshToken);
}

Von der GoogleAuthUtil-ID-Token-Abfolge migrieren

Wenn Sie GoogleAuthUtil zum Abrufen von ID-Tokens verwenden, sollten Sie zum neuen ID-Token-Ablauf der Sign-In API migrieren.

Wenn Ihr Android-Code beispielsweise wie im folgenden Beispiel aussieht, sollten Sie migrieren:

Android-Code

In diesem Beispiel wird für ID-Tokenanfragen audience:server:client_id und die Client-ID für Ihren Webserver als Parameter „scope“ für den GoogleAuthUtil.getToken-Aufruf (audience:server:client_id:9414861317621.apps.googleusercontent.com) verwendet.

Der neue Log-in API-ID-Token-Vorgang bietet folgende Vorteile:

  • Optimierte Anmeldung mit nur einem Tipp
  • Ihr Server kann Informationen zum Nutzerprofil ohne zusätzlichen Netzwerkaufruf abrufen

Nehmen Sie die folgenden Änderungen vor, um zum ID-Token-Ablauf zu migrieren:

Android-Clientseite

  • Die Berechtigung GET_ACCOUNTS (Kontakte) entfernen, wenn Sie dies anfordern
  • Ersetzen Sie Code, der GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() oder AccountManager.newChooseAccountIntent() enthält, durch Auth.GOOGLE_SIGN_IN_API mit der Konfiguration GoogleSignInOptions.Builder.requestIdToken(...).

Serverseitig

Die neue Sign-In API gibt ID-Tokens aus, die der OpenID Connect-Spezifikation entsprechen. GoogleAuthUtil.getToken verwendet dagegen ein nicht mehr unterstütztes Format. Insbesondere ist der Aussteller jetzt https://accounts.google.com mit einem https-Schema.

Während des Migrationsprozesses muss Ihr Server das ID-Token sowohl von Ihrem alten als auch von Ihrem neuen Android-Client verifizieren. Wenn Sie beide Formate des Tokens prüfen möchten, nehmen Sie die Änderung vor, die der von Ihnen verwendeten Clientbibliothek entspricht (falls vorhanden):

  • Java (Google APIs-Clientbibliotheken): Upgrade auf Version 1.21.0 oder höher
  • PHP (Google APIs-Clientbibliotheken): Für Version 1 führen Sie ein Upgrade auf Version 1.1.6 oder höher aus; für Version 2 ein Upgrade auf Version 2.0.0-RC1 oder höher.
  • Node.js: Upgrade auf Version 0.9.7 oder höher
  • Python oder eigene Implementierungen: Akzeptieren Sie beide Aussteller: https://accounts.google.com und accounts.google.com.

Vom GoogleAuthUtil-Server-Authentifizierungscodefluss migrieren

Wenn Sie GoogleAuthUtil verwenden, um einen Serverauthentifizierungscode abzurufen, sollten Sie zum neuen Authentifizierungscode-Vorgang der Log-in API migrieren.

Wenn Ihr Android-Code beispielsweise wie im folgenden Beispiel aussieht, sollten Sie migrieren:

Android-Code

Im Beispiel wird für Anfragen zum Serverauthentifizierungscode oauth2:server:client_id + die Client-ID für Ihren Webserver als scope-Parameter für den GoogleAuthUtil.getToken-Aufruf (oauth2:server:client_id:9414861317621.apps.googleusercontent.com) verwendet.

Der neue Autorisierungscode-Vorgang der Sign-In API bietet folgende Vorteile:

  • Optimierte Anmeldung mit nur einem Tippen
  • Wenn Sie der Anleitung unten folgen, kann Ihr Server beim Authentifizierungscode-Austausch ein ID-Token mit den Profilinformationen des Nutzers abrufen.

Nehmen Sie die folgenden Änderungen vor, um zum neuen Authentifizierungscode-Ablauf zu migrieren:

Android-Clientseite

  • Die Berechtigung GET_ACCOUNTS (Kontakte) entfernen, wenn Sie dies anfordern
  • Ersetzen Sie Code, der GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() oder AccountManager.newChooseAccountIntent() enthält, durch Auth.GOOGLE_SIGN_IN_API mit der Konfiguration GoogleSignInOptions.Builder.requestServerAuthCode(...).

Serverseitig

Behalten Sie Ihren aktuellen Code bei, geben Sie aber beim Erstellen des GoogleAuthorizationCodeTokenRequest-Objekts https://oauth2.googleapis.com/token als Tokenserverendpunkt an, damit Sie ein ID-Token mit der E-Mail-Adresse, der Nutzer-ID und den Profilinformationen des Nutzers abrufen können, ohne dass ein weiterer Netzwerkaufruf erforderlich ist. Dieser Endpunkt ist vollständig abwärtskompatibel und der folgende Code funktioniert für Server-Auth-Codes, die von Ihrer alten und neuen Android-Clientimplementierung abgerufen werden.

GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
                transport,
                jsonFactory,
                // Use below for tokenServerEncodedUrl parameter
                "https://oauth2.googleapis.com/token",
                clientSecrets.getDetails().getClientId(),
                clientSecrets.getDetails().getClientSecret(),
                authCode,
                REDIRECT_URI)
               .execute();

...

// You can also get an ID token from auth code exchange.
GoogleIdToken googleIdToken = tokenResponse.parseIdToken();
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
        .setAudience(Arrays.asList(SERVER_CLIENT_ID))
        .setIssuer("https://accounts.google.com")
        .build();
// Refer to ID token documentation to see how to get data from idToken object.
GoogleIdToken idToken = verifier.verify(idTokenString);
...