Google ile oturum açma özelliğini uygulama

Bu kılavuzda, Google ile oturum açma özelliğinin nasıl uygulanacağı açıklanmakta ve aşağıdaki adımlar ele alınmaktadır:

  • Uygulamanıza bağımlılık ekleyin.
  • CredentialManager öğesini oluşturun.
  • Alt sayfa akışını oluşturun.
  • Düğme akışını oluşturun.
  • Oturum açma yanıtını işleyin.
  • Hataları işleyin.
  • Oturumu kapatma işlemini gerçekleştirin.

Uygulamanıza bağımlılık ekleme

Modülünüzün build.gradle dosyasında, Kimlik Bilgisi Yöneticisi, Play Hizmetleri Auth ve googleid'ın en yeni sürümünü kullanarak bağımlılıkları bildirin:

Kotlin

dependencies {
    implementation("androidx.credentials:credentials:1.6.0-rc02")
    implementation("androidx.credentials:credentials-play-services-auth:1.6.0-rc02")
    implementation("com.google.android.libraries.identity.googleid:googleid:<latest version>")
}

Groovy

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

Kimlik Bilgisi Yöneticisi'ni başlatma

CredentialManager nesnesi oluşturmak için uygulamanızı veya etkinlik bağlamınızı kullanın.

// Use your app or activity context to instantiate a client instance of
// CredentialManager.
private val credentialManager = CredentialManager.create(context)

Alt sayfa akışını oluşturma

Alt sayfa, Kimlik Bilgisi Yöneticisi'nin yerleşik kullanıcı arayüzüdür. Bu kullanıcı arayüzünü kullanmak, şifreler, geçiş anahtarları ve Google ile oturum açma gibi tüm kimlik doğrulama yöntemlerinde tutarlı bir deneyim sağlar.

Daha önce yetkilendirilmiş hesaplar için oturum açma isteğini yapılandırma

Kullanıcının Google kimliği jetonunu almak için GetGoogleIdOption ile Google oturum açma isteğinde bulunun.

Aşağıdaki snippet'ler, hesabın yetkili bir hesap olup olmadığını kontrol eder.

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
    .setFilterByAuthorizedAccounts(true)
    .setServerClientId(WEB_CLIENT_ID)
    .setAutoSelectEnabled(true)
    .setNonce(generateSecureRandomNonce())
    .build()

İstek googleIdOption nesnesi aşağıdaki gibi yapılandırılır:

  • Daha önce yetkilendirilmiş hesapları filtreleme: Daha önce uygulamanızda oturum açmak için kullanılan yetkilendirilmiş hesapları almak üzere setFilterByAuthorizedAccounts değerini true olarak ayarlayın.

    setFilterByAuthorizedAccounts için varsayılan değerin true olduğunu unutmayın. Bu, alt sayfa kullanıcı arayüzünün varsayılan davranışının yalnızca daha önce yetkilendirilmiş hesapları göstermek olduğu anlamına gelir.

  • Sunucu istemci kimliğini ayarlayın: setServerClientId parametresini ayarlayın. webClientId, ön koşulları tamamlarken Google Cloud projenizde OAuth için ayarladığınız web istemcisi kimliğidir.

  • Otomatik oturum açmayı etkinleştirme (isteğe bağlı): Geri gelen kullanıcılar için otomatik oturum açmayı etkinleştirmek üzere setAutoSelectEnabled(true) ve setFilterByAuthorizedAccounts(true) kullanın. Uygulama kullanıcılarınız daha önce oturum açtıysa bu işlem gereksiz sorunları ortadan kaldırır.

    Otomatik oturum açma yalnızca aşağıdaki ölçütler karşılandığında mümkündür:

    • Cihazda yalnızca tek bir yetkili hesap vardır ve bu yetkili hesap daha önce cihazdaki uygulamada oturum açmak için kullanılmıştır. Cihazda birden fazla yetkili hesap varsa otomatik oturum açma devre dışı bırakılır.
    • Kullanıcı, önceki oturumunda uygulamadan açıkça çıkış yapmamışsa.
    • Kullanıcı, Google Hesabı ayarlarında otomatik oturum açmayı devre dışı bırakmamıştır.
  • Tek seferlik rastgele sayı ayarlama (isteğe bağlı): Gelişmiş güvenliği etkinleştirmek için sunucu tarafı doğrulaması için tek seferlik rastgele sayı ayarlayın. Yeniden oynatma saldırılarını önlemek için setNonce() ile sunucu tarafı doğrulama için bir nonce ekleyebilirsiniz. Sunucu tarafı kodunuzun, istek ve yanıt nonce'larının aynı olduğunu doğruladığından emin olun.

    Nonce oluşturmak için aşağıdaki işleve benzer bir işlev kullanın. Bu işlev, belirtilen uzunlukta kriptografik olarak güçlü bir rastgele nonce oluşturur ve Base64 kullanarak kodlar:

fun generateSecureRandomNonce(byteLength: Int = 32): String {
    val randomBytes = ByteArray(byteLength)
    SecureRandom().nextBytes(randomBytes)
    return Base64.encodeToString(randomBytes, Base64.NO_WRAP or Base64.URL_SAFE or Base64.NO_PADDING)
}

Oturum açma isteğinde bulunma

getCredential yöntemini çağırarak kullanıcının cihazda yetkili bir hesabı olup olmadığını kontrol edin:

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

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

Yetkili hesap yoksa oturum açma isteğini yapılandırma

Cihazda uygulamanız için yetkili kullanıcı yoksa CredentialManager NoCredentialException değerini döndürür. Bu senaryoda, kullanıcının kaydolmak için başka bir hesap kullanabilmesi amacıyla yetkili hesaplar filtresini devre dışı bırakın.

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

Ardından, yetkilendirilmiş hesaplarda yaptığınız gibi oturum açma isteğinde bulunun.

Düğme akışını oluşturma

Kullanıcıların aşağıdaki koşullarda Google ile oturum açabilmesini istiyorsanız düğme kullanın:

  • Kullanıcı, kimlik bilgisi yöneticisi alt sayfa kullanıcı arayüzünü kapattı.
  • Cihazda Google Hesabı yok.
  • Cihazdaki mevcut hesaplar için yeniden kimlik doğrulama yapılması gerekir.

Düğme kullanıcı arayüzünü oluşturma

Bu işlem Jetpack Compose düğmesiyle yapılabilir ancak Google ile Oturum Açma Markalama Kuralları sayfasından önceden onaylanmış bir marka simgesi de kullanabilirsiniz.

Oturum açma akışını oluşturma

Google kimlik jetonu almak için GetSignInWithGoogleOption ile Google oturum açma isteği oluşturun.

val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder(
    serverClientId = WEB_CLIENT_ID
).setNonce(generateSecureRandomNonce())
    .build()

Ardından, alt sayfa kullanıcı arayüzünde yaptığınız gibi oturum açma isteğinde bulunun.

Alt sayfa ve düğme için paylaşılan oturum açma işlevini oluşturun.

Oturum açma işlemini gerçekleştirmek için aşağıdaki adımları uygulayın:

  1. CredentialManager'ın getCredential() işlevini kullanın. Yanıt başarılıysa CustomCredential değerini çıkarın. Bu değerin türü GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL olmalıdır.
  2. Nesneyi GoogleIdTokenCredential.createFrom() yöntemini kullanarak GoogleIdTokenCredential biçimine dönüştürün.

  3. Bağlı taraf sunucunuzda kimlik bilgisini doğrulayın.

  4. Hataları uygun şekilde ele aldığınızdan emin olun.

fun handleSign(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 the ID for server-side validation.
                    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")
        }
    }
}

Hataları işleme

Kodunuzun olası tüm hata senaryolarını ele aldığından emin olmak için Sorun giderme bölümünde listelenen hataları inceleyin.

Oturumu kapatma işlemini yönetme

Kullanıcılarınızın uygulamanızda oturumu kapatabilmesi için bir mekanizma sağlamanız önemlidir. Örneğin, bir kullanıcının cihazında birden fazla Google Hesabı olabilir ve farklı bir hesapla oturum açmaya karar verebilir. Bunu örneğin ayarlar sayfanızda sağlayabilirsiniz.

Kimlik bilgisi sağlayıcı, etkin bir kimlik bilgisi oturumunu saklayabilir ve gelecekteki oturum açma istekleri için oturum açma seçeneklerini sınırlamak üzere kullanabilir. Örneğin, etkin kimlik bilgilerine diğer mevcut kimlik bilgilerine göre öncelik verebilir.

Bir kullanıcı uygulamanızın oturumunu kapattığında, mevcut kullanıcı kimliği bilgisi 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. Böylece, kullanıcılar bir sonraki oturum açma işleminde tüm oturum açma seçeneklerine erişebilir.