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.
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()
lubAccountManager.newChooseAccountIntent()
na kodAuth.GOOGLE_SIGN_IN_API
z konfiguracjąGoogleSignInOptions.Builder.requestIdToken(...)
.
Po stronie serwera
- Utwórz nowy punkt końcowy do uwierzytelniania za pomocą tokena identyfikującego.
- Wyłącz stary punkt końcowy po przeniesieniu aplikacji klienckich
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()
lubAccountManager.newChooseAccountIntent()
na kodAuth.GOOGLE_SIGN_IN_API
z konfiguracjąGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Po stronie serwera
- Utwórz nowy punkt końcowy dla przepływu kodu uwierzytelniania serwera.
- Wyłączanie starego punktu końcowego po migracji aplikacji klienta
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ść:
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()
lubAccountManager.newChooseAccountIntent()
na kodAuth.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.com
iaccounts.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:
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()
lubAccountManager.newChooseAccountIntent()
na kodAuth.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); ...