Kimlik Bilgisi Yöneticisi'ni Google ile oturum açma özelliğiyle entegre etme

Aralarından seçim yapabileceğiniz çeşitli kimlikleri gösteren Kimlik Bilgisi Yöneticisi tarafından etkinleştirilen alt sayfa.
Şekil 1. Credential Manager API'si ile entegrasyondan sonra Google ile oturum açma alt sayfa iletişim kutusu görünümü.

Bu dokümanda, Google Kimliği yardımcı kitaplığını kullanarak Google ile oturum aç iletişim kutusunun Google Kimlik Hizmetleri'nden (GIS) Kimlik Bilgileri Yöneticisi API'sine nasıl taşınacağı açıklanmaktadır.

Credential Manager API'sini kullanan bir uygulama, son kullanıcıya geçiş anahtarı etkin hesaplar da dahil olmak üzere kayıtlı oturum açma seçenekleri listesinden seçim yapmasına olanak tanıyan tutarlı bir Android kullanıcı arayüzü sunacak şekilde yapılandırılır. Bu, farklı kimlik bilgisi türlerini ve sağlayıcılarını birleştirmek için önerilen Android API'dir. Android 14'ten itibaren kullanıcılar, Credential Manager API ile üçüncü taraf şifre yöneticilerinden de yararlanabilir.

Bağımlılıkları bildirme

Modülünüzün build.gradle dosyasında, en son sürümü kullanarak bağımlılıkları tanımlayın:

dependencies {
  // ... other dependencies

  implementation "androidx.credentials:credentials:<latest version>"
  implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
  implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}

Google API konsolu projenizi ayarlamak için talimatları uygulayın. Bağımlılıkları ekleme rehberini yukarıda belirtilen talimatlarla değiştirin.

Google ile oturum açma isteği örneklendirme

Uygulamaya başlamak için bir Google oturum açma isteği örnek oluşturun. Kullanıcının Google Kimliği Jetonunu almak için GetGoogleIdOption kullanın.

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .build();

Öncelikle API'yi setFilterByAuthorizedAccounts parametresi true olarak ayarlanmış şekilde çağırmanız gerekir. Kullanılabilir kimlik bilgisi yoksa API'yi tekrar çağırın ve setFilterByAuthorizedAccounts öğesini false olarak ayarlayın.

Mümkün olduğunda kullanıcıların otomatik olarak oturum açmasını istiyorsanız GetGoogleIdOption isteğinizde setAutoSelectEnabled ile bu özelliği etkinleştirin. Aşağıdaki ölçütler karşılandığında otomatik oturum açılabilir:

  • Kullanıcının, uygulamanız için kaydedilmiş tam olarak bir kimlik bilgisi, yani kayıtlı bir şifre veya kayıtlı bir Google Hesabı vardır.
  • Kullanıcının otomatik oturum açmayı Google Hesabı ayarlarında devre dışı bırakmamış olması gerekir.

Oturum açma güvenliğini iyileştirmek ve tekrar oynatma saldırılarını önlemek için her isteğe tek seferlik bir sayı eklemek üzere setNonce özelliğini kullanın. Tek seferlik rastgele sayı oluşturma hakkında daha fazla bilgi edinin.

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(SERVER_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>);
  .build();

Google ile oturum aç

Google ile oturum açma akışını ayarlama adımları şunlardır:

  1. GetCredentialRequest örneğini somutlaştırın ve kimlik bilgilerini almak için yukarıda oluşturulan googleIdOption öğesini ekleyin.
  2. Kullanıcının mevcut kimlik bilgilerini almak için bu isteği getCredential() (Kotlin) veya getCredentialAsync() (Java) çağrısına iletin.
  3. API başarılı olduktan sonra GoogleIdTokenCredential verileri için sonucu barındıran CustomCredential dosyasını çıkarın.
  4. CustomCredential türü, GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL değerine eşit olmalıdır. GoogleIdTokenCredential.createFrom yöntemini kullanarak nesneyi GoogleIdTokenCredential biçimine dönüştürün.
  5. Dönüşüm başarılı olursa GoogleIdTokenCredential kimliğini çıkarıp doğrulayın ve sunucunuzda kimlik bilgisini doğrulayın.
  6. Dönüşüm bir GoogleIdTokenParsingException ile başarısız olursa Google ile oturum açma kitaplığı sürümünüzü güncellemeniz gerekebilir.
  7. Tanınmayan özel kimlik bilgisi türlerini yakalayın.

Kotlin

val request: GetCredentialRequest = Builder()
  .addGetCredentialOption(googleIdOption)
  .build()

coroutineScope.launch {
  try {
    val result = credentialManager.getCredential(
      request = request,
      context = activityContext,
    )
    handleSignIn(result)
  } catch (e: GetCredentialException) {
    handleFailure(e)
  }
}

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {
    is PublicKeyCredential -> {
      // Share responseJson such as a GetCredentialResponse on your server to
      // validate and authenticate
      responseJson = credential.authenticationResponseJson
    }

    is PasswordCredential -> {
      // Send ID and password to your server to validate and authenticate.
      val username = credential.id
      val password = credential.password
    }

    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract id to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      } else {
        // Catch any unrecognized custom credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

Java

GetCredentialRequest request = new GetCredentialRequest.Builder()
  .addGetCredentialOption(googleIdOption)
  .build();

// Launch sign in flow and do getCredential Request to retrieve the credentials
credentialManager.getCredentialAsync(
  requireActivity(),
  request,
  cancellationSignal,
  <executor>,
  new CredentialManagerCallback<GetCredentialResponse, GetCredentialException>() {
    @Override
    public void onResult(GetCredentialResponse result) {
      handleSignIn(result);
    }

    @Override
    public void onError(GetCredentialException e) {
      handleFailure(e);
    }
  }
);

public void handleSignIn(GetCredentialResponse result) {
  // Handle the successfully returned credential.
  Credential credential = result.getCredential();

  if (credential instanceof PublicKeyCredential) {
    String responseJson = ((PublicKeyCredential) credential).getAuthenticationResponseJson();
    // Share responseJson i.e. a GetCredentialResponse on your server to validate and authenticate
  } else if (credential instanceof PasswordCredential) {
    String username = ((PasswordCredential) credential).getId();
    String password = ((PasswordCredential) credential).getPassword();
    // Use id and password to send to your server to validate and authenticate
  } else if (credential instanceof CustomCredential) {
    if (GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL.equals(credential.getType())) {
      try {
        // Use googleIdTokenCredential and extract id to validate and
        // authenticate on your server
        GoogleIdTokenCredential googleIdTokenCredential = GoogleIdTokenCredential.createFrom(((CustomCredential) credential).getData());
      } catch (GoogleIdTokenParsingException e) {
        Log.e(TAG, "Received an invalid Google ID token response", e);
      }
    } else {
      // Catch any unrecognized custom credential type here.
      Log.e(TAG, "Unexpected type of credential");
    }
  } else {
    // Catch any unrecognized credential type here.
    Log.e(TAG, "Unexpected type of credential");
  }
}

Google ile oturum açma düğmesi

Google ile Oturum Aç Düğmesi, en yeni Google Kimliği yardımcı kitaplığına sahip Kimlik Bilgisi Yöneticisi tarafından desteklenir. Google ile oturum aç düğme akışını tetiklemek için GetGoogleIdOption yerine GetSignInWithGoogleOption öğesini kullanın ve döndürülen GoogleIdTokenCredential öğesini önceden olduğu gibi kullanın.

Google ile kaydolun

GetGoogleIdOption isteği örneklenirken ve GetCredentialsRequest öğesine iletilirken setFilterByAuthorizedAccounts değeri true olarak ayarlandıktan sonra hiçbir sonuç döndürülmezse bu durum, oturum açmak için yetkilendirilmiş hesap olmadığını gösterir. Bu noktada setFilterByAuthorizedAccounts(false) öğesini ayarlamanız ve Google ile kaydolun'u çağırmanız gerekir.

Kotlin

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Java

GetGoogleIdOption googleIdOption = new GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build();

Google kayıt isteğini örnek hale getirdikten sonra , kimlik doğrulama akışını Google ile oturum açma bölümünde belirtildiği şekilde başlatın.

Oturumu kapatma işlemini gerçekleştir

Bir kullanıcı, uygulamanızda oturumu kapattığında mevcut kullanıcı kimlik bilgisi durumunu temizlemek ve dahili oturum açma durumunu sıfırlamak için API clearCredentialState() yöntemini çağırın.