Logowanie na połączone konto (Android)

Logowanie za pomocą połączonego konta umożliwia logowanie jednym dotknięciem przez Google użytkownikom, którzy mają już konto Google połączone z Twoją usługą. Zwiększa to wygodę użytkowników, ponieważ mogą oni zalogować się jednym kliknięciem, bez konieczności ponownego wpisywania nazwy użytkownika i hasła. Zmniejsza to też prawdopodobieństwo, że użytkownicy utworzą zduplikowane konta w Twojej usłudze.

Logowanie za pomocą połączonego konta jest dostępne w ramach procesu logowania jednym dotknięciem na Androidzie. Oznacza to, że nie musisz importować osobnej biblioteki, jeśli w aplikacji jest już włączona funkcja One Tap.

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. Wyrażasz zgodę na wyświetlanie połączonych kont podczas logowania jednym dotknięciem.
  2. Jeśli użytkownik jest zalogowany w Google i połączył swoje konto Google z kontem w Twojej usłudze, zostanie zwrócony token identyfikacji dla połączonego konta.
  3. Użytkownik zobaczy prośbę o zalogowanie się jednym dotknięciem z opcją zalogowania się w Twojej usłudze za pomocą połączonego konta.
  4. Jeśli użytkownik zdecyduje się kontynuować korzystanie z połączonego konta, do aplikacji zostanie zwrócony token identyfikacji użytkownika. Dopasujesz go do tokena, który został wysłany na serwer w kroku 2, aby zidentyfikować zalogowanego użytkownika.

Konfiguracja

Aby skonfigurować logowanie za pomocą połączonego konta, skonfiguruj środowisko programistyczne i aplikację.

Konfigurowanie środowiska programistycznego

Pobierz najnowsze Usługi Google Play na hosta programistycznego:

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

  2. Jeśli stan tych pakietów nie jest określony jako Zainstalowane, wybierz oba i kliknij Zainstaluj pakiety.

Konfiguracja aplikacji

  1. W sekcjach buildscript i allprojects pliku build.gradle na poziomie projektu dodaj repozytorium Maven Google.

    buildscript {
        repositories {
            google()
        }
    }
    
    allprojects {
        repositories {
            google()
        }
    }
    
  2. Dodaj zależności interfejsu „Połącz z Google” do pliku gradle na poziomie aplikacji modułu, który zwykle ma nazwę app/build.gradle:

    dependencies {
      implementation 'com.google.android.gms:play-services-auth:21.3.0'
    }
    

Modyfikowanie aplikacji na Androida pod kątem obsługi logowania za pomocą połączonego konta

Na końcu procesu logowania za pomocą połączonego konta do aplikacji zwracany jest token identyfikatora. Przed zalogowaniem użytkownika należy sprawdzić integralność tokena identyfikatora.

Poniższy przykładowy kod przedstawia kroki, które należy wykonać, aby pobrać i zweryfikować token identyfikacji, a następnie zalogować użytkownika.

  1. Tworzenie aktywności do otrzymywania wyniku intencji logowania

    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ącej 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);
    });
    

Weryfikowanie integralności tokena identyfikacji

Korzystanie z biblioteki klienta interfejsu API Google

Zalecanym sposobem weryfikacji tokenów identyfikatora Google w środowisku produkcyjnym jest użycie biblioteki klienta interfejsu API Google dla języka Java.

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 identyfikacji reprezentuje konto organizacji Google Workspace lub Cloud, możesz zweryfikować deklarację hd, sprawdzając nazwę domeny zwracaną przez metodę Payload.getHostedDomain().