Logowanie na połączone konto (Android)

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

  1. Podczas procesu logowania się za pomocą jednego kliknięcia możesz wyrazić zgodę na wyświetlanie połączonych kont.
  2. 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.
  3. Użytkownik zobaczy prośbę o zalogowanie się jednym dotknięciem z opcją zalogowania się w usłudze za pomocą powiązanego konta.
  4. 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:

  1. Otwórz Menedżera pakietu Android SDK.
  1. W sekcji Narzędzia SDK znajdź Usługi Google Play.

  2. Jeśli stan tych pakietów nie jest Ustawiony, zaznacz oba i kliknij Zainstaluj pakiety.

Konfigurowanie aplikacji

  1. W pliku build.gradle na poziomie projektu dodaj repozytorium Maven firmy Google do sekcji buildscriptallprojects.

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. 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.

  1. 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")
        }
    });
    
  2. 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()
    
  3. 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().