Logowanie za pomocą powiązanego konta umożliwia logowanie jednym dotknięciem za pomocą Google użytkownikom, którzy mają już powiązane z Twoją usługą konto Google. Dzięki temu użytkownicy mogą logować się jednym kliknięciem, bez konieczności ponownego wpisywania nazwy użytkownika i hasła. Zmniejsza to też ryzyko, że użytkownicy będą tworzyć zduplikowane konta w Twojej usłudze.
Logowanie na połączone konto jest dostępne w ramach procesu logowania One Tap na Androidzie. Oznacza to, że nie musisz importować osobnej biblioteki, jeśli w aplikacji jest już włączona funkcja jednego kliknięcia.
Z tego dokumentu dowiesz się, jak zmodyfikować aplikację na Androida, aby obsługiwała logowanie za pomocą połączonego konta.
Jak to działa
- Podczas procesu logowania się za pomocą jednego kliknięcia możesz wyrazić zgodę na wyświetlanie połączonych kont.
- Jeśli użytkownik jest zalogowany w Google i połączył swoje konto Google z kontem w Twojej usłudze, zwrócony zostanie token identyfikacyjny powiązanego konta.
- Użytkownik zobaczy prośbę o zalogowanie się jednym dotknięciem z opcją zalogowania się w usłudze za pomocą powiązanego konta.
- Jeśli użytkownik zdecyduje się kontynuować z połączonym kontem, do Twojej aplikacji zostanie zwrócony token identyfikacyjny użytkownika. Porównaj go z tokenem wysłanym na serwer w kroku 2, aby zidentyfikować zalogowanego użytkownika.
Konfiguracja
Konfigurowanie środowiska programistycznego
Pobierz najnowsze Usługi Google Play na hoście deweloperskim:
- Otwórz Menedżera pakietu Android SDK.
W sekcji Narzędzia SDK znajdź Usługi Google Play.
Jeśli stan tych pakietów nie jest Ustawiony, zaznacz oba i kliknij Zainstaluj pakiety.
Konfigurowanie aplikacji
W pliku
build.gradle
na poziomie projektu dodaj repozytorium Maven firmy Google do sekcjibuildscript
iallprojects
.buildscript { repositories { google() } } allprojects { repositories { google() } }
Dodaj zależności do interfejsu „Połącz z Google” do pliku Gradle na poziomie modułu (aplikacji). Jest to zwykle
app/build.gradle
:dependencies { implementation 'com.google.android.gms:play-services-auth:21.3.0' }
Modyfikowanie aplikacji na Androida, aby obsługiwała logowanie na połączone konto
Pod koniec procesu logowania na połączone konto do aplikacji zwracany jest token identyfikatora. Przed zalogowaniem użytkownika należy sprawdzić integralność tokena identyfikatora.
Podany niżej przykładowy kod zawiera szczegółowe instrukcje pobierania i weryfikowania tokena identyfikacyjnego, a następnie logowania użytkownika.
Tworzenie aktywności służącej do otrzymywania wyniku intencji Logowanie
Kotlin
private val activityResultLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult()) { result -> if (result.resultCode == RESULT_OK) { try { val signInCredentials = Identity.signInClient(this) .signInCredentialFromIntent(result.data) // Review the Verify the integrity of the ID token section for // details on how to verify the ID token verifyIdToken(signInCredential.googleIdToken) } catch (e: ApiException) { Log.e(TAG, "Sign-in failed with error code:", e) } } else { Log.e(TAG, "Sign-in failed") } }
Java
private final ActivityResultLauncher<IntentSenderResult> activityResultLauncher = registerForActivityResult( new ActivityResultContracts.StartIntentSenderForResult(), result -> { If (result.getResultCode() == RESULT_OK) { try { SignInCredential signInCredential = Identity.getSignInClient(this) .getSignInCredentialFromIntent(result.getData()); verifyIdToken(signInCredential.getGoogleIdToken()); } catch (e: ApiException ) { Log.e(TAG, "Sign-in failed with error:", e) } } else { Log.e(TAG, "Sign-in failed") } });
Tworzenie żądania logowania
Kotlin
private val tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .supported(true) // Your server's client ID, not your Android client ID. .serverClientId(getString("your-server-client-id") .filterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Java
private final GoogleIdTokenRequestOptions tokenRequestOptions = GoogleIdTokenRequestOptions.Builder() .setSupported(true) .setServerClientId("your-service-client-id") .setFilterByAuthorizedAccounts(true) .associateLinkedAccounts("service-id-of-and-defined-by-developer", scopes) .build()
Uruchamianie intencji Oczekuję na logowanie
Kotlin
Identity.signInClient(this) .beginSignIn( BeginSignInRequest.Builder() .googleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener{result -> activityResultLauncher.launch(result.pendingIntent.intentSender) } .addOnFailureListener {e -> Log.e(TAG, "Sign-in failed because:", e) }
Java
Identity.getSignInClient(this) .beginSignIn( BeginSignInRequest.Builder() .setGoogleIdTokenRequestOptions(tokenRequestOptions) .build()) .addOnSuccessListener(result -> { activityResultLauncher.launch( result.getPendingIntent().getIntentSender()); }) .addOnFailureListener(e -> { Log.e(TAG, "Sign-in failed because:", e); });
Sprawdzanie integralności tokena tożsamości
Korzystanie z biblioteki klienta interfejsu API Google
Zalecane jest używanie biblioteki klienta interfejsu Google API w języku Java do weryfikowania tokenów Google ID w środowisku produkcyjnym.
Java
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;
import com.google.api.client.googleapis.auth.oauth2.GoogleIdTokenVerifier;
...
GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)
// Specify the CLIENT_ID of the app that accesses the backend:
.setAudience(Collections.singletonList(CLIENT_ID))
// Or, if multiple clients access the backend:
//.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3))
.build();
// (Receive idTokenString by HTTPS POST)
GoogleIdToken idToken = verifier.verify(idTokenString);
if (idToken != null) {
Payload payload = idToken.getPayload();
// Print user identifier
String userId = payload.getSubject();
System.out.println("User ID: " + userId);
// Get profile information from payload
String email = payload.getEmail();
boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
String name = (String) payload.get("name");
String pictureUrl = (String) payload.get("picture");
String locale = (String) payload.get("locale");
String familyName = (String) payload.get("family_name");
String givenName = (String) payload.get("given_name");
// Use or store profile information
// ...
} else {
System.out.println("Invalid ID token.");
}
Metoda GoogleIdTokenVerifier.verify()
weryfikuje podpis JWT, deklarację aud
, deklarację iss
i deklarację exp
.
Jeśli chcesz sprawdzić, czy token ID reprezentuje konto organizacji Google Workspace lub Cloud Identity, możesz zweryfikować hd
, sprawdzając nazwę domeny zwróconą przez metodę Payload.getHostedDomain()
.