Google ile oturum açma özelliğiyle kullanıcı kimliklerini doğrulama

Google ile oturum açma, kullanıcı kimlik doğrulamasını Android uygulamanızla hızlı bir şekilde entegre etmenize yardımcı olur. Kullanıcılar, uygulamanızda oturum açmak, izin vermek ve profil bilgilerini uygulamanızla güvenli bir şekilde paylaşmak için Google Hesaplarını kullanabilir. Android'in Jetpack Kimlik Bilgisi Yöneticisi kitaplığı, bu entegrasyonu sorunsuz hale getirerek tek bir API kullanarak Android cihazlarda tutarlı bir deneyim sunar.

Bu dokümanda, Android uygulamalarında Google ile oturum açma özelliğini uygulama, Google ile oturum açma düğmesi kullanıcı arayüzünü ayarlama ve uygulama için optimize edilmiş tek dokunuşla kaydolma ve oturum açma deneyimlerini yapılandırma konularında size yol göstereceğiz. Google ile oturum açma özelliği, cihaz geçişinin sorunsuz olması için otomatik oturum açma özelliğini destekler. Android, iOS ve web platformlarında platformlar arası olması, uygulamanız için herhangi bir cihazda oturum açma erişimi sağlamanıza yardımcı olur.

Google ile oturum açma özelliğini ayarlamak için aşağıdaki iki ana adımı uygulayın:

Kimlik Bilgisi Yöneticisi'nin alt sayfa kullanıcı arayüzünde Google ile oturum açma seçeneğini yapılandırın. Bu ayar, kullanıcıdan otomatik olarak oturum açmasını isteyecek şekilde yapılandırılabilir. Geçiş anahtarları veya şifreler uyguladıysanız kullanıcının daha önce oturum açmak için kullandığı seçeneği hatırlamak zorunda kalmaması amacıyla ilgili tüm kimlik bilgisi türlerini aynı anda isteyebilirsiniz.

Kimlik Bilgisi Yöneticisi alt sayfası
Şekil 1. Kimlik Bilgisi Yöneticisi alt sayfası kimlik bilgisi seçim kullanıcı arayüzü

Google ile oturum açma düğmesini uygulamanızın kullanıcı arayüzüne ekleyin. Google ile oturum aç düğmesi, kullanıcıların Android uygulamalarına kaydolmak veya oturum açmak için mevcut Google Hesaplarını kullanmaları için kolay bir yol sunar. Kullanıcılar, alt sayfa kullanıcı arayüzünü kapatırsa veya kayıt ve oturum açma için açıkça Google Hesaplarını kullanmak isterse Google ile oturum açma düğmesini tıklar. Geliştiriciler için bu, kullanıcıların ilk katılım sürecini kolaylaştırır ve kaydolma sırasındaki zorlukları azaltır.

Google ile oturum açma akışını gösteren animasyon
Şekil 2. Kimlik Bilgisi Yöneticisi Google ile oturum açma düğmesi kullanıcı arayüzü

Bu dokümanda, Google kimliği yardımcı kitaplığı kullanılarak Google ile oturum açma düğmesinin ve alt sayfa iletişim kutusunun Kimlik Bilgisi Yöneticisi API'sine nasıl entegre edileceği açıklanmaktadır.

Google API'leri Konsolu projenizi ayarlama

  1. Projenizi API Konsolu'nda açın veya projeniz yoksa proje oluşturun.
  2. OAuth izin ekranı sayfasında, tüm bilgilerin eksiksiz ve doğru olduğundan emin olun.
    1. Uygulamanıza doğru uygulama adı, uygulama logosu ve uygulama ana sayfası atadığınızdan emin olun. Bu değerler, kayıt sırasındaki Google ile oturum açma izin ekranında ve Üçüncü taraf uygulamaları ve hizmetleri ekranında kullanıcılara sunulur.
    2. Uygulamanızın gizlilik politikasının ve hizmet şartlarının URL'lerini belirttiğinizden emin olun.
  3. Kimlik Bilgileri sayfasında, uygulamanız için henüz yoksa bir Android istemci kimliği oluşturun. Uygulamanızın paket adını ve SHA-1 imzasını belirtmeniz gerekir.
    1. Kimlik bilgileri sayfasına gidin.
    2. Kimlik bilgileri oluştur > OAuth istemci kimliği'ni tıklayın.
    3. Android uygulama türünü seçin.
  4. Kimlik bilgileri sayfasında, henüz yapmadıysanız yeni bir "Web uygulaması" istemci kimliği oluşturun. "Yetkilendirilmiş JavaScript Kaynakları" ve "Yetkilendirilmiş Yönlendirme URI'leri" alanlarını şimdilik yoksayabilirsiniz. Bu istemci kimliği, arka uç sunucunuz Google'ın kimlik doğrulama hizmetleriyle iletişim kurarken sunucunuzu tanımlamak için kullanılır.
    1. Kimlik bilgileri sayfasına gidin.
    2. Kimlik bilgileri oluştur > OAuth istemci kimliği'ni tıklayın.
    3. Web uygulaması türünü seçin.

Bağımlılıkları bildirme

Modülünüzün build.gradle dosyasında, Credential Manager'ın en son sürümünü 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 ile oturum açma isteği oluşturma

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

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

Öncelikle, setFilterByAuthorizedAccounts parametresi true olarak ayarlanmış şekilde API'yi çağırarak kullanıcının uygulamanızda oturum açmak için daha önce kullanılmış hesapları olup olmadığını kontrol edin. Kullanıcılar oturum açmak için mevcut hesaplar arasından seçim yapabilir.

Yetkili Google Hesabı yoksa kullanıcıdan mevcut hesaplarından biriyle kaydolması istenir. Bunu yapmak için API'yi tekrar çağırıp setFilterByAuthorizedAccounts değerini false olarak ayarlayarak kullanıcıdan onay alın. Kaydolma hakkında daha fazla bilgi

Geri gelen kullanıcılar için otomatik oturum açmayı etkinleştirme (önerilir)

Geliştiriciler, tek bir hesapla kaydolan kullanıcılar için otomatik oturum açma özelliğini etkinleştirmelidir. Bu sayede, özellikle cihaz taşıma sırasında kullanıcılar kimlik bilgilerini yeniden girmeden hesaplarına hızlıca erişebilir ve cihazlar arasında sorunsuz bir deneyim elde edebilir. Bu sayede, kullanıcılarınız daha önce oturum açmış durumdayken gereksiz sorunları ortadan kaldırır.

Otomatik oturum açmayı etkinleştirmek için setAutoSelectEnabled(true) simgesini kullanın. Otomatik oturum açma yalnızca aşağıdaki ölçütler karşılandığında mümkündür:

  • İstekle eşleşen tek bir kimlik bilgisi vardır. Bu kimlik bilgisi, Google Hesabı veya şifre olabilir ve Android cihazdaki varsayılan hesapla eşleşir.
  • Kullanıcı, oturumunu açık bir şekilde kapatmadı.
  • Kullanıcı, Google Hesabı ayarlarında otomatik oturum açmayı devre dışı bırakmamıştır.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Otomatik oturum açma özelliğini uygularken kullanıcıların uygulamanızdan açıkça oturumu kapattıktan sonra her zaman doğru hesabı seçebilmesi için oturumu kapatma işlemini doğru şekilde gerçekleştirmeyi unutmayın.

Güvenliği artırmak için tek seferlik bir sayı ayarlama

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

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

Google ile oturum açma akışını oluşturma

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

  1. Kimlik bilgilerini almak için bir GetCredentialRequest örneği oluşturun, ardından addCredentialOption() kullanarak daha önce oluşturulan googleIdOption'ı 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ı olduğunda, GoogleIdTokenCredential verilerinin sonucunu içeren CustomCredential öğesini ayıklayı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 olarak dönüştürün.
  5. Dönüşüm başarılı olursa GoogleIdTokenCredential kimliğini çıkarın, doğrulayın ve sunucunuzdaki kimlik bilgilerinin kimliğini doğrulayın.

  6. Dönüşüm 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 yakalayabilirsiniz.

val request: GetCredentialRequest = Builder()
  .addCredentialOption(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) {

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

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

    // GoogleIdToken credential
    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract the ID to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
          // You can use the members of googleIdTokenCredential directly for UX
          // purposes, but don't use them to store or control access to user
          // data. For that you first need to validate the token:
          // pass googleIdTokenCredential.getIdToken() to the backend server.
          GoogleIdTokenVerifier verifier = ... // see validation instructions
          GoogleIdToken idToken = verifier.verify(idTokenString);
          // To get a stable account identifier (e.g. for storing user data),
          // use the subject ID:
          idToken.getPayload().getSubject()
        } 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")
    }
  }
}

Google ile Oturum Açma düğmesi akışını tetikleme

Google ile oturum açma düğmesi akışını tetiklemek için GetGoogleIdOption yerine GetSignInWithGoogleOption kullanın:

val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder()
  .setServerClientId(WEB_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Döndürülen GoogleIdTokenCredential öğesini aşağıdaki kod örneğinde açıklandığı şekilde işleyin.

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

  when (credential) {
    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 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 isteğini örnekledikten sonra, kimlik doğrulama akışını Google ile oturum açma bölümünde belirtilene benzer şekilde başlatın.

Yeni kullanıcılar için kaydı etkinleştirin (önerilir)

Google ile oturum açma, kullanıcıların uygulamanızda veya hizmetinizde birkaç dokunuşla yeni hesap oluşturmasının en kolay yoludur.

Kayıtlı kimlik bilgisi bulunamazsa (getGoogleIdOption tarafından döndürülen Google Hesabı yoksa) kullanıcınızdan kaydolmasını isteyin. Öncelikle, daha önce kullanılmış hesap olup olmadığını görmek için setFilterByAuthorizedAccounts(true) değerini kontrol edin. Herhangi bir etkinlik bulunamazsa kullanıcıdan setFilterByAuthorizedAccounts(false) uygulamasını kullanarak Google Hesabı ile kaydolmasını isteyin

Örnek:

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

Google kaydolma isteğini örnekledikten sonra kimlik doğrulama akışını başlatın. Kullanıcılar kayıt için Google ile oturum açma özelliğini kullanmak istemiyorsa uygulamanızı otomatik doldurma için optimize edebilirsiniz. Kullanıcınız bir hesap oluşturduktan sonra, hesap oluşturma işleminin son adımı olarak kullanıcıyı geçiş anahtarlarına kaydetmeyi düşünebilirsiniz.

Oturumu kapatma

Bir kullanıcı uygulamanızdan çıktığında, mevcut kullanıcı kimlik bilgisi durumunu tüm kimlik bilgisi sağlayıcılardan temizlemek için API clearCredentialState() yöntemini çağırın. Bu işlem, tüm kimlik bilgisi sağlayıcıları belirli bir uygulamayla ilgili depolanan kimlik bilgisi oturumlarının temizlenmesi gerektiği konusunda bilgilendirir.

Kimlik bilgisi sağlayıcı, etkin bir kimlik bilgisi oturumu saklamış olabilir ve bunu gelecekteki kimlik bilgisi alma çağrıları için oturum açma seçeneklerini sınırlandırmak amacıyla kullanabilir. Örneğin, etkin kimlik bilgisine, mevcut diğer kimlik bilgilerine göre öncelik verebilir. Kullanıcınız uygulamanızda açıkça oturumu kapattığında ve bir dahaki sefere bütünsel oturum açma seçeneklerini almak için bu API'yi çağırarak sağlayıcının depolanan kimlik bilgisi oturumlarını temizlemesine izin vermelisiniz.