Logowanie na połączone konto (Android)

Logowanie się na połączone konto umożliwia użytkownikom logowanie się jednym dotknięciem przez Google którzy mają już swoje konto Google połączone z Twoją usługą. Dzięki temu użytkownicy mogą logować się 1 kliknięciem, bez konieczności ponownego nazwę użytkownika i hasło. Zmniejsza też ryzyko tworzenia zduplikowanych kont w 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 aplikacja ma już włączoną funkcję jednego dotknięcia.

Z tego dokumentu dowiesz się, jak zmodyfikować aplikację na Androida, aby obsługiwała Logowanie na połączone konto.

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 w usłudze, dla połączonego konta zostanie zwrócony token tożsamości koncie.
  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ć korzystanie z połączonego konta, token identyfikatora użytkownika w Twojej aplikacji. Udało Ci się dopasować ten token do tokena, który został wysłany na serwera w kroku 2, aby zidentyfikować zalogowanego użytkownika.

Konfiguracja

Konfigurowanie środowiska programistycznego

Pobierz najnowsze Usługi Google Play na hoście programisty:

  1. Otwórz aplikację Menedżer pakietów SDK na Androida
  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.

Konfiguracja aplikacji

  1. W pliku build.gradle na poziomie projektu uwzględnij repozytorium Google Maven w sekcjach buildscript i allprojects.

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

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

Modyfikowanie aplikacji na Androida w celu obsługi logowania na połączone konto

Po zakończeniu procesu logowania na połączone konto na konto zostanie zwrócony token tożsamości. . Przed zalogowaniem użytkownika należy sprawdzić integralność tokena identyfikatora.

W przykładowym kodzie poniżej znajdziesz szczegółowe instrukcje pobierania danych, zweryfikować token tożsamości, a następnie zaloguje użytkownika.

  1. Utwórz działanie, aby otrzymać wynik 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);
    });
    

Sprawdzanie integralności tokena tożsamości

Aby potwierdzić poprawność tokena, upewnij się, że: są spełnione kryteria:

  • Token tożsamości jest prawidłowo podpisany przez Google. Używanie kluczy publicznych Google (dostępny w JWK lub PEM) aby zweryfikować podpis tokena. Klucze te są regularnie poddawane rotacji, badanie nagłówka Cache-Control w odpowiedzi, aby określić, kiedy pobierz je ponownie.
  • Wartość aud w tokenie identyfikatora jest równa jednej z wartości identyfikatorów klientów. Jest to konieczne, aby zapobiec tokenom tożsamości wydanym złośliwemu hakerowi w celu uzyskania dostępu do danych tego samego użytkownika na serwerze backendu aplikacji.
  • Wartość iss w tokenie identyfikatora jest równa accounts.google.com lub https://accounts.google.com.
  • Nie upłynął czas ważności (exp) tokena identyfikatora.
  • Jeśli chcesz sprawdzić, czy token identyfikatora reprezentuje Google Workspace lub Cloud konta organizacji, możesz sprawdzić twierdzenie hd, które wskazuje, w domenie użytkownika. Tej opcji należy używać, gdy dostęp do zasobu mają tylko użytkownicy należący do określonych domen. Brak tego roszczenia oznacza, że konto nie należy do Domena hostowana przez Google.

Za pomocą pól email, email_verified i hd możesz określić, czy Google hostuje dany adres e-mail i jest dla niego autorytatywny. W przypadkach, w których autorytatywny jest Google, czy użytkownik jest znany jako faktyczny właściciel konta, więc możesz pominąć hasło lub inne a także metody testów.

Przypadki, w których Google ma wiarygodność:

  • To jest konto Gmail, adres email ma sufiks @gmail.com.
  • To jest konto G Suite, email_verified ma wartość prawda i ustawiono hd.

Użytkownicy mogą rejestrować się w Google, nie korzystając z Gmaila lub G Suite. Kiedy email nie zawiera sufiksu @gmail.com, a hd nie występuje, Google nie zalecamy wiarygodność i hasło lub inne metody weryfikujące weryfikację użytkownika. email_verified może również być prawdziwe, ponieważ początkowo firma Google zweryfikowała użytkownika przy tworzeniu konta Google, jednak własność firmy zewnętrznej konto e-mail mogło się od tego czasu zmienić.

Zamiast pisać własny kod do wykonania tych czynności weryfikacyjnych, zalecamy, zalecamy korzystanie z biblioteki klienta interfejsów API Google na swojej platformie lub do ogólnego przeznaczenia, Biblioteka JWT. Do programowania i debugowania możesz używać wywołania naszego tokeninfo punktu końcowego weryfikacji.

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, roszczenia: aud, iss i exp.

Jeśli chcesz sprawdzić, czy token identyfikatora reprezentuje Google Workspace lub Cloud konta organizacji, możesz zweryfikować własność domeny hd, sprawdzając nazwę domeny zwracanymi przez metodę Payload.getHostedDomain().

Wywołanie punktu końcowego tokeninfo

Aby w prosty sposób sprawdzić podpis tokena identyfikatora na potrzeby debugowania, wykonaj te czynności: użyj punktu końcowego tokeninfo. Wywołanie tego punktu końcowego wymaga: dodatkowe żądanie sieciowe, które wykonuje większość weryfikacji za Ciebie podczas testowania prawidłowych; weryfikacji i wyodrębniania ładunku w ramach własnego kodu. Nie nadaje się do użytku w środowisku produkcyjnym ponieważ żądania mogą być ograniczane lub w inny sposób powodować sporadyczne błędy.

Aby zweryfikować token tożsamości za pomocą punktu końcowego tokeninfo, utwórz protokół HTTPS POST lub GET do punktu końcowego i przekaż swój token tożsamości w polu id_token. Aby na przykład zweryfikować token „XYZ123”, wyślij to żądanie GET:

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

Jeśli token jest prawidłowo podpisany, a iss i exp ma oczekiwane wartości, otrzymasz odpowiedź HTTP 200, gdzie treść zawiera deklaracje tokena identyfikatora w formacie JSON. Oto przykładowa odpowiedź:

{
 // These six fields are included in all Google ID Tokens.
 "iss": "https://accounts.google.com",
 "sub": "110169484474386276334",
 "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "aud": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com",
 "iat": "1433978353",
 "exp": "1433981953",

 // These seven fields are only included when the user has granted the "profile" and
 // "email" OAuth scopes to the application.
 "email": "testuser@gmail.com",
 "email_verified": "true",
 "name" : "Test User",
 "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP/tIXL9Ir44LE/s99-c/photo.jpg",
 "given_name": "Test",
 "family_name": "User",
 "locale": "en"
}

Jeśli chcesz potwierdzić, że token identyfikatora reprezentuje konto Google Workspace, możesz to sprawdzić twierdzenie hd, które wskazuje hostowaną domenę użytkownika; Tej opcji należy użyć, gdy ograniczanie dostępu do zasobu wyłącznie członkom określonych domen. Brak tego roszczenia wskazuje, że konto nie należy do domeny hostowanej w Google Workspace.