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, musisz przejść na najnowszy interfejs Sign-In API, aby zwiększyć bezpieczeństwo i wygodę użytkowników.

Migracja z wzorca zapobiegającego nadużyciom tokenów dostępu

Nie należy wysyłać tokenów dostępu uzyskanych za pomocą GoogleAuthUtil.getToken do serwera zaplecza jako oświadczenia tożsamości, ponieważ nie można łatwo zweryfikować, czy token został wydany do zaplecza. Może to narazić aplikację na wstawienie tokena dostępu przez atakującego.

Jeśli na przykład Twój kod na Androida wygląda jak w przykładzie poniżej, musisz przenieść aplikację do obecnych sprawdzonych metod.

Kod na Androida

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

Zamiast uwierzytelniania za pomocą tokena dostępu uzyskanego za pomocą GoogleAuthUtil.getToken, użyj przepływu tokena identyfikatora lub przepływu kodu uwierzytelniania.

Przejście na przepływ danych tokena identyfikacyjnego

Jeśli potrzebujesz tylko identyfikatora, adresu e-mail, nazwy lub adresu URL zdjęcia profilowego użytkownika, użyj przepływu danych identyfikatora.

Aby przejść na proces uwierzytelniania za pomocą tokena identyfikującego, wprowadź te zmiany:

Po stronie klienta na Androidzie

  • usunąć uprawnienia GET_ACCOUNTS (Kontakty), jeśli tego zażądasz.
  • Przełącz dowolny kod korzystający z funkcji GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent() na kod Auth.GOOGLE_SIGN_IN_API z konfiguracją GoogleSignInOptions.Builder.requestIdToken(...).

Po stronie serwera

Migracja na przepływ kodu autoryzacji serwera

Jeśli Twój serwer potrzebuje dostępu do innych interfejsów API Google, takich jak Dysk Google, YouTube czy Kontakty, użyj przepływu kodu uwierzytelniania serwera.

Aby przejść na proces uwierzytelniania za pomocą kodu na serwerze, wprowadź te zmiany:

Po stronie klienta na Androidzie

  • usunąć uprawnienia GET_ACCOUNTS (Kontakty), jeśli tego zażądasz.
  • Przełącz dowolny kod korzystający z funkcji GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent() na kod Auth.GOOGLE_SIGN_IN_API z konfiguracją GoogleSignInOptions.Builder.requestServerAuthCode(...).

Po stronie serwera

Nadal możesz udostępniać logikę dostępu do interfejsu API między starymi a nowymi punktami końcowymi. 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 obsługi tokena identyfikacyjnego GoogleAuthUtil

Jeśli do uzyskiwania tokenów identyfikacyjnych używasz interfejsu GoogleAuthUtil, musisz przejść na nowy proces uzyskiwania tokenów identyfikacyjnych API logowania.

Jeśli na przykład Twój kod na Androida wygląda jak w tym przykładzie, musisz go przenieść:

Kod Androida

W tym przykładzie żądania tokena identyfikatora wykorzystują audience:server:client_id oraz identyfikator klienta serwera WWW jako parametr „scope” wywołania GoogleAuthUtil.getToken (audience:server:client_id:9414861317621.apps.googleusercontent.com).

Nowy przepływ danych dotyczący tokena identyfikującego w ramach interfejsu Sign-In API zapewnia te korzyści:

  • Uproszczone logowanie jednym kliknięciem
  • Twój serwer może uzyskać informacje o profilu użytkownika bez dodatkowego wywołania sieci

Aby przejść na proces uwierzytelniania za pomocą tokena identyfikującego, wprowadź te zmiany:

Po stronie klienta na Androidzie

  • usunąć uprawnienia GET_ACCOUNTS (Kontakty), jeśli tego zażądasz.
  • Przełącz dowolny kod korzystający z funkcji GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent() na kod Auth.GOOGLE_SIGN_IN_API z konfiguracją GoogleSignInOptions.Builder.requestIdToken(...).

Po stronie serwera

Nowy interfejs Sign-In API wydaje tokeny identyfikatora zgodne ze specyfikacją OpenID Connect, w przeciwieństwie do GoogleAuthUtil.getToken, który używa wycofanego formatu. W szczególności wydawcą jest teraz https://accounts.google.com ze schematem https.

Podczas migracji serwer musi zweryfikować token identyfikacyjny zarówno starych, jak i nowych klientów Androida. Aby zweryfikować oba formaty tokena, wprowadź zmianę odpowiadającą używanej przez Ciebie bibliotece klienta (jeśli ją używasz):

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

Migracja z procesu kodu autoryzacji serwera w GoogleAuthUtil

Jeśli używasz interfejsu GoogleAuthUtil do uzyskiwania kodu autoryzacji serwera, musisz przejść na nowy proces kodu autoryzacji interfejsu Sign-In API.

Przeprowadź migrację, jeśli kod na Androida wygląda na przykład tak:

Kod Androida

W tym przykładzie w żądaniach kodu uwierzytelniania serwera jest używany identyfikator oauth2:server:client_id + identyfikator klienta serwera WWW jako parametr scope dla wywołania GoogleAuthUtil.getToken (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, podczas wymiany kodu autoryzacji Twój serwer może uzyskać token identyfikatora z informacjami o profilu użytkownika

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

Strona klienta Androida

  • usunąć uprawnienia GET_ACCOUNTS (Kontakty), jeśli tego zażądasz.
  • Przełącz dowolny kod korzystający z funkcji GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent() na kod Auth.GOOGLE_SIGN_IN_API z konfiguracją GoogleSignInOptions.Builder.requestServerAuthCode(...).

Po stronie serwera

Zachowaj obecny kod, ale podczas tworzenia obiektu GoogleAuthorizationCodeTokenRequest jako punktu końcowego serwera tokenów podaj adres https://oauth2.googleapis.com/token, aby można było uzyskać token identyfikacyjny z adresem e-mail użytkownika, jego identyfikatorem i informacjami z profilu bez konieczności wysyłania kolejnego wywołania sieci. Ten punkt końcowy jest w pełni zgodny ze starszymi wersjami, a podany niżej kod będzie działać w przypadku kodów autoryzacji serwera pobieranych zarówno ze starszych, jak i nowych implementacji klienta na Androida.

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