Migracja z GoogleAuthUtil i Plus.API

Jeśli w przeszłości Twoja aplikacja była zintegrowana z Logowaniem przez Google za pomocą GoogleAuthUtil.getToken lub Plus.API, zalecamy przejście na najnowszy interfejs Sign-In API, który 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 w ramach potwierdzenia tożsamości, ponieważ nie można łatwo sprawdzić, czy token został wydany do backendu, co naraża Cię na wstawienie tokena dostępu od atakującego.

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

Kod na Androida

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

Zamiast uwierzytelniać się za pomocą tokena dostępu uzyskanego z GoogleAuthUtil.getToken, użyj przepływu tokena tożsamości lub kodu autoryzacji.

Migracja do przepływu tokenów identyfikatora

Jeśli potrzebujesz tylko identyfikatora, adresu e-mail, imienia i nazwiska lub adresu URL zdjęcia profilowego użytkownika, skorzystaj z procedury obsługi tokena tożsamości.

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

Strona klienta Androida

  • Jeśli o nie prosisz, usuń uprawnienie GET_ACCOUNTS (Kontakty).
  • Przełącz dowolny kod, który korzysta z GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent(), na kod Auth.GOOGLE_SIGN_IN_API w konfiguracji GoogleSignInOptions.Builder.requestIdToken(...).

Po stronie serwera

Migracja do przepływu kodu uwierzytelniania serwera

Jeśli Twój serwer musi uzyskać dostęp do innych interfejsów API Google, takich jak Dysk Google, YouTube lub Kontakty, użyj przepływu kodu uwierzytelniania serwera.

Aby przejść do przepływu kodu uwierzytelniania serwera, wprowadź te zmiany:

Strona klienta Androida

  • Jeśli o nie prosisz, usuń uprawnienie GET_ACCOUNTS (Kontakty).
  • Przełącz dowolny kod, który korzysta z GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent(), na kod Auth.GOOGLE_SIGN_IN_API w konfiguracji GoogleSignInOptions.Builder.requestServerAuthCode(...).

Po stronie serwera

Nadal możesz udostępniać logikę dostępu przez interfejs API między starymi i 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 przepływu tokenów identyfikatora GoogleAuthUtil

Jeśli do uzyskiwania tokenów tożsamości używasz GoogleAuthUtil, przeprowadź migrację do nowego procesu tokenów identyfikatora interfejsu Sign-In API.

Jeśli na przykład Twój kod na Androida wygląda tak, jak ten przykład, musisz przeprowadzić migrację:

Kod na Androida

W tym przykładzie żądania tokena identyfikatora używają audience:server:client_id i identyfikatora klienta Twojego serwera WWW jako parametru „scope” dla wywołania GoogleAuthUtil.getToken (audience:server:client_id:9414861317621.apps.googleusercontent.com).

Nowy przepływ tokena identyfikatora interfejsu Sign-In API ma te zalety:

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

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

Strona klienta Androida

  • Jeśli o nie prosisz, usuń uprawnienie GET_ACCOUNTS (Kontakty).
  • Przełącz dowolny kod, który korzysta z GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent(), na kod Auth.GOOGLE_SIGN_IN_API w konfiguracji GoogleSignInOptions.Builder.requestIdToken(...).

Po stronie serwera

Nowy interfejs Sign-In API wystawia tokeny identyfikacyjne, które są zgodne ze specyfikacją OpenID Connect, w przeciwieństwie do klasy GoogleAuthUtil.getToken, która korzysta z wycofanego formatu. W szczególności wydawcą jest teraz https://accounts.google.com ze schematem https.

Podczas migracji serwer musi zweryfikować token tożsamości zarówno w starym, jak i w nowych klientach Androida. Aby sprawdzić oba formaty tokena, wprowadź zmianę odpowiadającą używanej bibliotece klienta (jeśli używasz jednej):

  • Java (biblioteki klienta interfejsów API Google): aktualizacja 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, a jeśli używasz 2.0.0-RC1 lub nowszej,
  • Node.js: aktualizacja do wersji 0.9.7 lub nowszej
  • Python lub własne implementacje: zaakceptuj oba tych wydawców: https://accounts.google.com i accounts.google.com

Migracja z przepływu kodu uwierzytelniania serwera GoogleAuthUtil

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

Jeśli na przykład Twój kod na Androida wygląda tak, jak ten przykład, musisz przeprowadzić migrację:

Kod na Androida

W tym przykładzie żądania kodu uwierzytelniania serwera używają oauth2:server:client_id + identyfikator klienta Twojego serwera WWW jako parametru scope wywołania GoogleAuthUtil.getToken (oauth2:server:client_id:9414861317621.apps.googleusercontent.com).

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

  • Usprawnione logowanie jednym kliknięciem
  • Jeśli postępujesz zgodnie z poniższym przewodnikiem po migracji, podczas wymiany kodów autoryzacji Twój serwer może uzyskać token identyfikatora zawierający informacje z profilu użytkownika

Aby przejść na nowy przepływ kodu autoryzacji, wprowadź te zmiany:

Strona klienta Androida

  • Jeśli o nie prosisz, usuń uprawnienie GET_ACCOUNTS (Kontakty).
  • Przełącz dowolny kod, który korzysta z GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() lub AccountManager.newChooseAccountIntent(), na kod Auth.GOOGLE_SIGN_IN_API w konfiguracji GoogleSignInOptions.Builder.requestServerAuthCode(...).

Po stronie serwera

Zachowaj bieżący kod, ale podczas tworzenia obiektu GoogleAuthorizationCodeTokenRequest określ https://oauth2.googleapis.com/token jako punkt końcowy serwera tokena. Dzięki temu uzyskasz token identyfikatora z adresem e-mail, identyfikatorem użytkownika i informacjami z profilu użytkownika bez konieczności ponownego wywoływania sieci. Ten punkt końcowy jest w pełni zgodny wstecznie, a poniższy kod będzie działać w przypadku kodów uwierzytelniania serwera pobranych zarówno ze starej, jak i nowej implementacji klienta 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);
...