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.
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()
lubAccountManager.newChooseAccountIntent()
, na kodAuth.GOOGLE_SIGN_IN_API
w konfiguracjiGoogleSignInOptions.Builder.requestIdToken(...)
.
Po stronie serwera
- Utwórz nowy punkt końcowy do uwierzytelniania tokena tożsamości.
- Po przeniesieniu aplikacji klienckich wyłącz stary punkt końcowy
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()
lubAccountManager.newChooseAccountIntent()
, na kodAuth.GOOGLE_SIGN_IN_API
w konfiguracjiGoogleSignInOptions.Builder.requestServerAuthCode(...)
.
Po stronie serwera
- Utwórz nowy punkt końcowy dla przepływu kodu uwierzytelniania serwera.
- Po przeniesieniu aplikacji klienckich wyłącz stary punkt końcowy
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ę:
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()
lubAccountManager.newChooseAccountIntent()
, na kodAuth.GOOGLE_SIGN_IN_API
w konfiguracjiGoogleSignInOptions.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
iaccounts.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ę:
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()
lubAccountManager.newChooseAccountIntent()
, na kodAuth.GOOGLE_SIGN_IN_API
w konfiguracjiGoogleSignInOptions.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); ...