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ıza hızlı bir şekilde entegre etmenize yardımcı olur. Kullanıcılar, Google Hesaplarını kullanarak uygulamanızda oturum açabilir, izin verebilir ve profil bilgilerini uygulamanızla güvenli bir şekilde paylaşabilir. Android'in Credential Manager Jetpack kitaplığı, tek bir API kullanarak Android cihazlarda tutarlı bir deneyim sunarak bu entegrasyonu sorunsuz hale getirir.

Bu belgede, 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 uygulamalar için optimize edilmiş tek dokunuşla kaydolma ve oturum açma deneyimlerini yapılandırma konularında size yol gösterilir. Google ile oturum açma, cihaz geçişini sorunsuz hale getirmek için otomatik olarak oturum açmayı destekler. Ayrıca Android, iOS ve web yüzeylerinde platformlar arası çalışabilmesi sayesinde uygulamanızda oturum açma erişimi sağlamanıza yardımcı olur. Uygulamanız için Firebase Authentication kullanıyorsanız Google ile Oturum Açma ve Credential Manager'ı entegre etme hakkında daha fazla bilgiyi Android'de Google ile kimlik doğrulama kılavuzunda bulabilirsiniz.

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

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

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

Google ile oturum açma düğmesini uygulamanızın kullanıcı arayüzüne ekleyin. Google ile oturum açma düğmesi, kullanıcıların mevcut Google Hesaplarını kullanarak Android uygulamalarına kaydolmalarını veya bu uygulamalarda oturum açmalarını kolaylaştırır. Kullanıcılar, alt sayfa kullanıcı arayüzünü kapatırsa veya kayıt ve oturum açma işlemleri için Google Hesaplarını kullanmak isterse Google ile oturum aç düğmesini tıklar. Bu değişiklik, geliştiriciler için kullanıcı oryantasyonunu kolaylaştırır ve kaydolma sürecinde daha az sorun yaşanmasını sağlar.

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

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

Projenizi oluşturma

  1. Projenizi 'da açın veya henüz projeniz yoksa proje oluşturun.
  2. bölümünde tüm bilgilerin eksiksiz ve doğru olduğundan emin olun.
    1. Uygulamanızın doğru bir uygulama adı, uygulama logosu ve uygulama ana sayfası atandığından emin olun. Bu değerler, kayıt sırasında Google ile oturum açma izni ekranında ve Üçüncü taraf uygulamaları ve hizmetleri ekranında kullanıcılara gösterilir.
    2. Uygulamanızın gizlilik politikası ve hizmet şartları URL'lerini belirttiğinizden emin olun.
  3. 'da henüz yoksa uygulamanız için bir Android istemci kimliği oluşturun. Uygulamanızın paket adını ve SHA-1 imzasını belirtmeniz gerekir.
    1. adresine gidin.
    2. Müşteri oluştur'u tıklayın.
    3. Android uygulama türünü seçin.
  4. bölümünde, henüz yapmadıysanız yeni bir "Web uygulaması" istemci kimliği oluşturun. Şimdilik "Yetkilendirilmiş JavaScript Kaynakları" ve "Yetkilendirilmiş yönlendirme URI'leri" alanlarını yok sayabilirsiniz. Bu istemci kimliği, arka uç sunucunuz Google'ın kimlik doğrulama hizmetleriyle iletişim kurduğunda sunucunuzu tanımlamak için kullanılır.
    1. adresine gidin.
    2. Müşteri oluştur'u 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 yeni sürümünü kullanarak bağımlılıkları bildirin:

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

Uygulamanıza başlamak için Google'da oturum açma isteği oluşturun. Kullanıcının Google kimliği jetonunu almak için GetGoogleIdOption kodunu kullanın.

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

Öncelikle, setFilterByAuthorizedAccounts parametresi true olarak ayarlanmış API'yi çağırarak kullanıcının daha önce uygulamanızda oturum açmak için kullanılan 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ıya istem gönderin. Kaydolma hakkında daha fazla bilgi edinin.

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

Geliştiriciler, tek hesaplarıyla kaydolan kullanıcılar için otomatik oturum açmayı etkinleştirmelidir. Bu sayede, özellikle cihaz taşıma sırasında cihazlar arasında sorunsuz bir deneyim sunulur. Kullanıcılar, kimlik bilgilerini yeniden girmeden hesaplarına hızlıca erişebilir. Bu sayede, daha önce oturum açmış olan kullanıcılarınız için gereksiz zorluklar ortadan kalkar.

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

  • İsteğe uygun tek bir kimlik bilgisi var. Bu kimlik bilgisi, Google Hesabı veya şifre olabilir ve Android destekli cihazdaki varsayılan hesapla eşleşir.
  • Kullanıcı, oturumu açıkça kapatmamışsa
  • Kullanıcı, Google Hesabı ayarlarında otomatik oturum açmayı devre dışı bırakmamışsa.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  // nonce string to use when generating a Google ID token
  .setNonce(nonce)
.build()

Otomatik oturum açma özelliğini uygularken oturum kapatma işlemini doğru şekilde ele almayı unutmayın. Böylece kullanıcılar, uygulamanızda oturumlarını açıkça kapattıktan sonra her zaman uygun hesabı seçebilir.

Güvenliği artırmak için nonce ayarlama

Oturum açma güvenliğini artırmak ve yeniden oynatma saldırılarını önlemek için her isteğe bir nonce eklemek üzere setNonce değerini 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)
  // nonce string to use when generating a Google ID token
  .setNonce(nonce)
.build()

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

Google ile oturum açma akışı oluşturma adımları şunlardır:

  1. GetCredentialRequest oluşturun, ardından kimlik bilgilerini almak için addCredentialOption() kullanarak daha önce 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 verilerinin sonucunu içeren CustomCredential öğesini çı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 ayıklayın, doğrulayın ve sunucunuzda kimlik bilgisini doğrulayın.

  6. Dönüştürme işlemi 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 yakalama

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

coroutineScope {
  try {
    val result = credentialManager.getCredential(
      request = request,
      context = activityContext,
    )
    handleSignIn(result)
  } catch (e: GetCredentialException) {
    // Handle failure
  }
}
fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential
  val responseJson: String

  when (credential) {

    // Passkey credential
    is PublicKeyCredential -> {
      // Share responseJson such as a GetCredentialResponse to 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.
          // see [validation instructions](https://developers.google.com/identity/gsi/web/guides/verify-google-id-token)
        } 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(
  serverClientId = WEB_CLIENT_ID
).setNonce(nonce)
  .build()

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

fun handleSignInWithGoogleOption(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 oluşturduktan sonra, Google ile oturum açma bölümünde belirtildiği gibi kimlik doğrulama akışını başlatın.

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

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

Kayıtlı kimlik bilgisi bulunamazsa (getGoogleIdOption tarafından Google Hesabı döndürülmezse) kullanıcınızdan kaydolmasını isteyin. Öncelikle, daha önce kullanılan hesapların olup olmadığını görmek için setFilterByAuthorizedAccounts(true) simgesini kontrol edin. Hiçbiri bulunamazsa kullanıcıdan setFilterByAuthorizedAccounts(false) kullanarak Google Hesabı ile kaydolmasını isteyin.

Örnek:

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

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

Oturumu kapatma

Bir kullanıcı uygulamanızın oturumunu kapattığında, mevcut kullanıcı kimliği bilgilerinin durumunu tüm kimlik bilgisi sağlayıcılarından temizlemek için clearCredentialState() API yöntemini çağırın. Bu işlem, belirtilen uygulama için depolanan tüm kimlik bilgisi oturumlarının temizlenmesi gerektiğini tüm kimlik bilgisi sağlayıcılarına bildirir.

Kimlik bilgisi sağlayıcı, etkin bir kimlik bilgisi oturumunu saklamış olabilir ve gelecekteki get-credential çağrıları için oturum açma seçeneklerini sınırlamak üzere bu oturumu kullanabilir. Örneğin, etkin kimlik bilgilerine diğer mevcut kimlik bilgilerine göre öncelik verebilir. Kullanıcınız uygulamanızdan açıkça çıktığında ve bir sonraki seferde bütünsel oturum açma seçeneklerini elde etmek için sağlayıcının depolanan kimlik bilgisi oturumunu temizlemesine izin vermek üzere bu API'yi çağırmanız gerekir.