Von GoogleAuthUtil und Plus.API migrieren

Wenn Sie Google Log-in in der Vergangenheit mit GoogleAuthUtil.getToken oder Plus.API integriert haben, sollten Sie zur neuesten Sign-In API migrieren, um die Sicherheit und Nutzerfreundlichkeit zu verbessern.

Anti-Muster für Zugriffstokens migrieren

Sie sollten keine Zugriffstokens, die Sie mit GoogleAuthUtil.getToken erhalten haben, als Identitätsbestätigung an Ihren Back-End-Server senden. Da Sie nicht leicht prüfen können, ob das Token an Ihr Back-End ausgestellt wurde, sind Sie anfällig für das Einfügen eines Zugriffstokens durch einen Angreifer.

Wenn Ihr Android-Code beispielsweise wie im folgenden Beispiel aussieht, sollten Sie Ihre App zu den aktuellen Best Practices migrieren.

Android-Code

In diesem Beispiel verwenden Zugriffstokenanfragen oauth2: plus 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 mit GoogleAuthUtil.getToken erworben wurde, entweder den ID-Token-Ablauf oder den Autorisierungscode-Vorgang.

Zum ID-Token-Ablauf migrieren

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

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

Android-Clientseite

  • Auf Anforderung die Berechtigung „GET_ACCOUNTS“ (Kontakte) entfernen
  • Ändern Sie jeden Code mit GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() oder AccountManager.newChooseAccountIntent() in Auth.GOOGLE_SIGN_IN_API mit der GoogleSignInOptions.Builder.requestIdToken(...)-Konfiguration.

Serverseitig

Zum Vorgang mit Serverauthentifizierungscode migrieren

Wenn Ihr Server auf andere Google APIs wie Google Drive, YouTube oder Kontakte zugreifen muss, verwenden Sie den Vorgang mit Serverauthentifizierungscode.

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

Android-Clientseite

  • Auf Anforderung die Berechtigung „GET_ACCOUNTS“ (Kontakte) entfernen
  • Ändern Sie jeden Code mit GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() oder AccountManager.newChooseAccountIntent() in Auth.GOOGLE_SIGN_IN_API mit der GoogleSignInOptions.Builder.requestServerAuthCode(...)-Konfiguration.

Serverseitig

Sie können weiterhin die API-Zugriffslogik zwischen dem alten und dem neuen Endpunkt 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);
}

Aus dem Vorgang mit dem GoogleAuthUtil-ID-Token migrieren

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

Wenn Ihr Android-Code beispielsweise wie das folgende Beispiel aussieht, sollten Sie ihn migrieren:

Android-Code

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

Der neue Vorgang für ID-Tokens für die Log-in-API bietet folgende Vorteile:

  • Optimierte Anmeldung mit nur einem Tippen
  • Ihr Server kann ohne zusätzlichen Netzwerkaufruf Nutzerprofilinformationen abrufen

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

Android-Clientseite

  • Auf Anforderung die Berechtigung „GET_ACCOUNTS“ (Kontakte) entfernen
  • Ändern Sie jeden Code mit GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() oder AccountManager.newChooseAccountIntent() in Auth.GOOGLE_SIGN_IN_API mit der GoogleSignInOptions.Builder.requestIdToken(...)-Konfiguration.

Serverseitig

Im Gegensatz zu GoogleAuthUtil.getToken, das ein verworfenes Format verwendet, gibt die neue Sign-In API ID-Tokens aus, die der OpenID Connect-Spezifikation entsprechen. Insbesondere ist der Aussteller jetzt https://accounts.google.com mit dem Schema https.

Während der Migration muss Ihr Server das ID-Token Ihrer alten und neuen Android-Clients verifizieren. Um beide Formate des Tokens zu prüfen, nehmen Sie die Änderung vor, die der von Ihnen verwendeten Clientbibliothek entspricht (falls Sie eine verwenden):

  • Java (Google APIs-Clientbibliotheken): Upgrade auf Version 1.21.0 oder höher
  • PHP (Clientbibliotheken für Google APIs): Wenn Sie Version 1 verwenden, führen Sie ein Upgrade auf Version 1.1.6 oder höher und bei Verwendung von Version 2 auf Version 2.0.0-RC1 oder höher durch.
  • Node.js: Upgrade auf Version 0.9.7 oder höher
  • Python oder Ihre eigenen Implementierungen: Akzeptieren Sie die beiden folgenden Aussteller: https://accounts.google.com und accounts.google.com.

Vom GoogleAuthUtil-Server mit Autorisierungscode-Vorgang migrieren

Wenn Sie GoogleAuthUtil zum Abrufen eines Server-Authentifizierungscodes verwenden, sollten Sie zum neuen Authentifizierungscode-Vorgang für die Sign-In API migrieren.

Wenn Ihr Android-Code beispielsweise wie das folgende Beispiel aussieht, sollten Sie ihn migrieren:

Android-Code

Im Beispiel verwenden Server-Authentifizierungscodeanfragen 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).

Der neue Vorgang mit Autorisierungscode für die Log-in-API bietet folgende Vorteile:

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

Nehmen Sie die folgenden Änderungen vor, um zum neuen Autorisierungscode-Vorgang zu migrieren:

Android-Clientseite

  • Auf Anforderung die Berechtigung „GET_ACCOUNTS“ (Kontakte) entfernen
  • Ändern Sie jeden Code mit GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() oder AccountManager.newChooseAccountIntent() in Auth.GOOGLE_SIGN_IN_API mit der GoogleSignInOptions.Builder.requestServerAuthCode(...)-Konfiguration.

Serverseitig

Behalten Sie Ihren aktuellen Code bei, geben Sie aber beim Erstellen des GoogleAuthorizationCodeTokenRequest-Objekts https://oauth2.googleapis.com/token als Tokenserver-Endpunkt an. So können Sie ein ID-Token mit der E-Mail-Adresse, der Nutzer-ID und den Profilinformationen des Nutzers abrufen, ohne dass ein weiterer Netzwerkaufruf erforderlich ist. Dieser Endpunkt ist vollständig abwärtskompatibel. Der folgende Code funktioniert für Server-Authentifizierungscodes, die von Ihren alten und neuen Android-Clientimplementierungen 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);
...