Logowanie na połączone konto (Android)

Logowanie za pomocą połączonego konta umożliwia użytkownikom logowanie jednym dotknięciem przez Google, jeśli mają już połączone konto Google z Twoją usługą. Ułatwia to użytkownikom logowanie się jednym kliknięciem bez konieczności ponownego wpisywania nazwy użytkownika i hasła. Zmniejsza to też prawdopodobieństwo utworzenia przez użytkowników duplikatów kont w Twojej usłudze.

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

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 kliknięciem.
  2. Jeśli użytkownik jest zalogowany w Google i powiązał swoje konto Google z kontem w Twojej usłudze, zostanie zwrócony token identyfikatora powiązanego konta.
  3. Użytkownikowi wyświetla się prośba 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 identyfikatora 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 hosta deweloperskiego:

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

  2. Jeśli stan tych pakietów nie jest ustawiony na Zainstalowano, wybierz oba i kliknij Zainstaluj pakiety.

Konfiguracja 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 dla interfejsu „Połącz z Google” do pliku Gradle na poziomie aplikacji modułu, który zwykle znajduje się w tym miejscu: app/build.gradle

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

Modyfikowanie aplikacji na Androida w celu obsługi logowania za pomocą połączonego konta

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

Poniższy przykładowy kod zawiera szczegółowe informacje o krokach, które należy wykonać, aby pobrać i zweryfikować token identyfikatora, 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. Uruchomienie intencji oczekującego logowania

    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 tożsamości

Korzystanie z biblioteki klienta interfejsu API Google

Korzystanie z biblioteki klienta interfejsu API Google dla języka Java to zalecany sposób weryfikowania tokenów identyfikatora Google 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 sygnaturę JWT, deklarację aud, deklarację iss i deklarację exp.

Jeśli musisz sprawdzić, czy token identyfikatora reprezentuje konto organizacji Google Workspace lub Cloud, możesz zweryfikować roszczenie hd, sprawdzając nazwę domeny zwróconą przez metodę Payload.getHostedDomain().