Migracja z GoogleAuthUtil i Plus.API

Jeśli w przeszłości integrowałeś(-aś) się z logowaniem przez Google za pomocą GoogleAuthUtil.getToken lub Plus.API, uaktualnij do najnowszej wersji Interfejs API logowania zapewnia większe bezpieczeństwo i większą wygodę użytkowników.

Migracja z antywzorca tokena dostępu

Nie wysyłaj tokenów dostępu uzyskanych za pomocą GoogleAuthUtil.getToken do serwera backendu jako potwierdzenia tożsamości, ponieważ nie można łatwo zweryfikować, że token został wystawiony do backendu, co zwiększa podatność na wstawienie tokenu dostępu otrzymanego od osoby przeprowadzającej atak.

Jeśli na przykład kod na Androida wygląda tak jak w przykładzie poniżej, przenieść aplikację do bieżących sprawdzonych metod.

Kod na Androida

W tym przykładzie żądania tokena dostępu używają parametru oauth2: oraz ciągu tekstowego zakresu jako Parametr scope dla wywołania GoogleAuthUtil.getToken (oauth2:https://www.googleapis.com/auth/plus.login).

Zamiast uwierzytelniania za pomocą tokena dostępu pozyskanego za pomocą GoogleAuthUtil.getToken, użyj procesu tokena identyfikatora lub kodu autoryzacji.

Migracja do procesu tokena identyfikatora

Jeśli potrzebujesz tylko identyfikatora użytkownika, adresu e-mail, imienia i nazwiska lub adresu URL zdjęcia profilowego, skorzystaj z procedury tokenów identyfikatora.

Aby przejść na przepływ tokenów tożsamości, wprowadź te zmiany:

Strona klienta Androida

  • Usuń uprawnienia aplikacji GET_ACCOUNTS (Kontakty), jeśli o nie poprosisz
  • Przełącz dowolny kod za pomocą: GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent() do Auth.GOOGLE_SIGN_IN_API z Konfiguracja usługi GoogleSignInOptions.Builder.requestIdToken(...).

Po stronie serwera

Migracja do przepływu kodu uwierzytelniania serwera

Jeśli serwer musi uzyskać dostęp do innych interfejsów API Google, takich jak Dysk Google, YouTube, lub Kontakty, skorzystaj z procedury uwierzytelniania serwera.

Aby przeprowadzić migrację do przepływu kodu uwierzytelniania serwera, wprowadź te zmiany:

Strona klienta Androida

  • Usuń uprawnienia aplikacji GET_ACCOUNTS (Kontakty), jeśli o nie poprosisz
  • Przełącz dowolny kod za pomocą: GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent() do Auth.GOOGLE_SIGN_IN_API z Konfiguracja usługi GoogleSignInOptions.Builder.requestServerAuthCode(...).

Po stronie serwera

Nadal możesz współdzielić logikę dostępu do interfejsu API między starym a nowym punktem końcowym. Przykład:

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

Migracja z procesu tokena identyfikatora GoogleAuthUtil ID

Jeśli używasz GoogleAuthUtil do uzyskiwania tokenów tożsamości, musisz przejść na nową Przepływ tokena identyfikatora interfejsu API logowania.

Jeśli kod na Androida wygląda jak w przykładzie poniżej, migrate:

Kod na Androida

W tym przykładzie w żądaniach tokena identyfikatora używane są parametry audience:server:client_id oraz klienta serwera WWW jako parametr „scope” dla parametru GoogleAuthUtil.getToken połączenie (audience:server:client_id:9414861317621.apps.googleusercontent.com).

Nowy proces tokena identyfikatora API logowania ma te zalety:

  • Uproszczone logowanie jednym kliknięciem
  • Serwer może uzyskiwać informacje o profilu użytkownika bez dodatkowego wywołania sieciowego

Aby przejść na przepływ tokenów tożsamości, wprowadź te zmiany:

Strona klienta Androida

  • Usuń uprawnienia aplikacji GET_ACCOUNTS (Kontakty), jeśli o nie poprosisz
  • Przełącz dowolny kod za pomocą: GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent() do Auth.GOOGLE_SIGN_IN_API z Konfiguracja usługi GoogleSignInOptions.Builder.requestIdToken(...).

Po stronie serwera

Nowy interfejs API logowania powoduje problemy z tokenami tożsamości zgodnymi z OpenID Connect. w przeciwieństwie do specyfikacji GoogleAuthUtil.getToken, która korzysta z wycofanego formatu. W szczególności teraz wydawcą jest https://accounts.google.com i https schemat.

W trakcie migracji serwer musi zweryfikować token tożsamości zarówno starych, jak i nowych klientów na Androida. Aby zweryfikować oba formaty tokena, umieść w tagu która odpowiada używanej przez Ciebie bibliotece klienta (jeśli z niej korzystasz):

  • Java (biblioteki klienta interfejsów API Google): uaktualnij do wersji 1.21.0 lub nowszej
  • PHP (biblioteki klienta interfejsów API Google): jeśli używasz wersji 1, uaktualnij ją do wersji 1.1.6 lub nowszej; jeśli używasz wersji 2, uaktualnij ją do wersji 2.0.0-RC1 lub nowszej
  • Node.js: uaktualnij do wersji 0.9.7 lub nowszej
  • Python lub Twoje własne implementacje: zaakceptuj obydwu tych wydawców: https://accounts.google.com i accounts.google.com

Migracja z procesu kodu autoryzacji serwera GoogleAuthUtil

Jeśli używasz GoogleAuthUtil do pobierania kodu uwierzytelniania serwera, przenieś się na nowy przepływ kodu autoryzacji interfejsu Sign-In API.

Jeśli kod na Androida wygląda jak w przykładzie poniżej, migrate:

Kod na Androida

W tym przykładzie w żądaniach kodu uwierzytelniania serwera jest używany ciąg oauth2:server:client_id + przycisk klienta serwera WWW jako parametru scope dla parametru GoogleAuthUtil.getToken połączenie (oauth2:server:client_id:9414861317621.apps.googleusercontent.com).

Nowy przepływ kodu uwierzytelniania interfejsu Sign-In API ma te zalety:

  • Uproszczone logowanie jednym kliknięciem
  • Jeśli zastosujesz się do poniższego przewodnika po migracji, Twój serwer może uzyskać token identyfikatora zawierające informacje o profilu użytkownika podczas wymiany kodu autoryzacji

Aby przejść do nowego przepływu kodu autoryzacji, wprowadź te zmiany:

Strona klienta Androida

  • Usuń uprawnienia aplikacji GET_ACCOUNTS (Kontakty), jeśli o nie poprosisz
  • Przełącz dowolny kod za pomocą: GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent() do Auth.GOOGLE_SIGN_IN_API z Konfiguracja usługi GoogleSignInOptions.Builder.requestServerAuthCode(...).

Po stronie serwera

Zachowaj bieżący kod, ale określ https://oauth2.googleapis.com/token jako punktu końcowego serwera tokenów podczas tworzenia GoogleAuthorizationCodeTokenRequest, aby uzyskać token identyfikatora z adresem e-mail, identyfikatorem użytkownika i informacjami profilowymi użytkownika bez potrzeby przez sieć. Ten punkt końcowy jest w pełni zgodny wstecznie, a poniższy kod będzie działał z kodami uwierzytelniania serwera pobranymi zarówno ze starego, jak i nowego Androida wdrożeniach u klienta.

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