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ıklar ekleyin.
  • CredentialManager örneğini oluşturun.
  • Alt sayfa akışını oluşturun.
  • Düğme akışını oluşturun.
  • Oturum açma yanıtını işleyin.
  • Hataları işleme
  • Oturum kapatma işlemini yönetme

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'un en yeni sürümünü kullanarak bağımlılıkları bildirin:

Kotlin

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

Groovy

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

Kimlik Bilgisi Yöneticisi'ni örneklendirme

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ü kullanıldığında şifreler, geçiş anahtarları ve Google ile oturum açma gibi tüm kimlik doğrulama yöntemlerinde tutarlı bir deneyim sunulur.

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

Kullanıcının Google kimlik jetonunu almak için GetGoogleIdOption ile Google oturum açma isteği gönderin.

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: Uygulamanızda oturum açmak için daha önce kullanılmış yetkili hesapları almak için 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 ayarlama: setServerClientId parametresini ayarlayın. webClientId, ön koşulları tamamlarken Google Cloud projenizde OAuth için ayarladığınız web istemci kimliğidir.

  • Otomatik Oturum Açma'yı etkinleştirme (isteğe bağlı): Geri gelen kullanıcılar için Otomatik Oturum Açma'yı etkinleştirmek üzere setAutoSelectEnabled(true) ve setFilterByAuthorizedAccounts(true) kullanın. Bu sayede, daha önce oturum açmış olan uygulama kullanıcılarınızın gereksiz adımlarla uğraşması önlenir.

    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çma'yı devre dışı bırakmamış olmalıdır.
  • Tek seferlik rastgele sayı ayarlama (isteğe bağlı): Gelişmiş güvenliği etkinleştirmek için sunucu tarafı doğrulama için tek seferlik rastgele sayı ayarlayın. Tekrar oynatma saldırılarını önlemek için setNonce() ile sunucu tarafı doğrulama için tek seferlik rastgele sayı ekleyebilirsiniz. Sunucu tarafı kodunuzun, istek ve yanıt için tek seferlik rastgele sayıların aynı olduğunu doğruladığından emin olun.

    Tek seferlik rastgele sayıyı oluşturmak için, belirtilen uzunlukta kriptografik olarak güçlü bir tek seferlik rastgele sayı oluşturan ve Base64 kullanarak kodlayan aşağıdaki işleve benzer bir işlev kullanın:

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ği

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()

// Use an activity-based context to avoid undefined system UI
// launching behavior.
val mutableContext = MutableContextWrapper(activityContext)
coroutineScope {
    try {
        val result = credentialManager.getCredential(
            request = request,            
            context = mutableContext // Use MutableContextWrapper to avoid memory leak during configuration changes
        )
        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, yetkili hesaplar için 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ın yeniden kimlik doğrulaması yapması gerekir.

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

Bu işlem bir Jetpack Compose düğmesiyle yapılabilir ancak Google ile oturum açma markalama kuralları sayfasındaki önceden onaylanmış bir marka simgesini de kullanabilirsiniz.

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

Google kimlik jetonu almak için GetSignInWithGoogleOption ile bir 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ıza benzer şekilde oturum açma isteğinde bulunun.

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

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

  1. CredentialManager'ın getCredential() işlevini kullanın. Yanıt başarılı olursa GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL türünde olması gereken CustomCredential değerini ayıklayın.
  2. GoogleIdTokenCredential.createFrom() yöntemini kullanarak nesneyi GoogleIdTokenCredential nesnesine dönüştürün.

  3. Güvenen 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 tüm olası hata senaryolarını işlediğinden emin olmak için Sorun giderme bölümünde listelenen hataları inceleyin.

Oturum kapatma işlemini yönetme

Kullanıcılarınıza uygulamanızda oturumu kapatma imkanı sunmanız önemlidir. Örneğin, bir kullanıcının cihazında birden fazla Google Hesabı olabilir ve farklı bir hesapla oturum açmak isteyebilir. Bu bilgiyi, örneğin ayarlar sayfanızda verebilirsiniz.

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

Bir kullanıcı uygulamanızda oturumu kapattığı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ılara, belirtilen uygulama için depolanan tüm kimlik bilgisi oturumlarının temizlenmesi gerektiğini bildirir. Böylece kullanıcılar bir sonraki seferde tüm oturum açma seçeneklerini görebilir.