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, sorunsuz cihaz geçişi için otomatik oturum açmayı destekler. Android, iOS ve web yüzeylerindeki platformlar arası yapısı sayesinde uygulamanızda herhangi bir cihazdan 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, geliştiriciler için daha kolay kullanıcı oryantasyonu ve kayıt sırasında daha az sorun anlamına gelir.

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ı yoksayabilirsiniz. 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ı 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

Uygulamanıza başlamak için Google ile 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 sağlanır. 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 yaptığınızdan emin olun. Böylece kullanıcılar, uygulamanızda oturumu 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 verileriyle ilgili sonucu 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.