FirebaseUI ile Android'de oturum açma

Bu codelab, Advanced Android in Kotlin kursunun bir parçasıdır. Bu kurstan en iyi şekilde yararlanmak için codelab'leri sırayla incelemeniz önerilir ancak bu zorunlu değildir. Kursla ilgili tüm codelab'ler Kotlin'de İleri Düzey Android codelab'leri açılış sayfasında listelenir.

Giriş

Android uygulaması geliştirirken kullanıcılarınızın giriş yapmasını desteklemenin birçok avantajı vardır. Kullanıcıların uygulamanızda kimlik oluşturmasına izin vererek onlara uygulamayla etkileşim kurmanın daha fazla yolunu sunabilirsiniz.

Kişiselleştirilmiş hesaplar sayesinde kullanıcılar uygulama içi deneyimlerini özelleştirebilir, diğer kullanıcılarla etkileşim kurabilir ve uygulamayı başka bir cihazda (ör. web veya yeni bir telefonda) kullanıyorlarsa verilerinin kalıcı olmasını ve aktarılmasını sağlayabilir.

Bu codelab'de, FirebaseUI kitaplığını kullanarak uygulamanızda oturum açmayı destekleme ile ilgili temel bilgileri öğreneceksiniz. FirebaseUI kitaplığı, diğer birçok özelliğinin yanı sıra giriş akışı oluşturmak isteyen geliştiricilerin işini kolaylaştırır ve kullanıcı hesaplarını yönetme işini sizin yerinize yapar.

Bilmeniz gerekenler

  • Android uygulaması geliştirmenin temelleri
  • LiveData ve ViewModel

Neler öğreneceksiniz?

  • Firebase'i projenize ekleme
  • Android uygulamanızda oturum açmayı destekleme
  • Uygulamanızın mevcut kimlik doğrulama durumunu gözlemleme
  • Kullanıcıların oturumunu kapatma

Yapacaklarınız

  • Firebase'i uygulamanıza entegre etmek için Firebase konsolunu kullanın.
  • Giriş özelliğini uygulayın.
  • Uygulamaya, oturum açmış kullanıcılar için özelleştirmeler ekleyin.
  • Kullanıcıların oturumunu kapatma özelliğini uygulayın.

LiveData ve ViewModel hakkında daha fazla bilgi

Bu codelab'deki uygulama için LiveData ve ViewModel hakkında temel bilgilere sahip olmanız gerekir. Bu kavramlar hakkında kısa bir genel bakış istiyorsanız LiveData ve ViewModel genel bakışlarını inceleyin.

Bu codelab'de karşılaşacağınız temel Android konuları hakkında bilgi edinmek için Kotlin ile Android Uygulamaları Geliştirme kursuna da katılabilirsiniz. Bu kurs hem Udacity kursu hem de codelabs kursu olarak sunulmaktadır.

Bu codelab'de, eğlenceli Android bilgileri gösteren bir uygulama oluşturacaksınız. Daha da önemlisi, uygulamada Giriş/Çıkış düğmesi bulunur. Kullanıcı uygulamaya giriş yaptığında, gösterilen tüm Android bilgileri, kişiselleştirme katmak için kullanıcıya yönelik bir selamlama içerir.

Örnek uygulamayı indirin. Şunlardan birini yapabilirsiniz:

Zip dosyasını indir

... veya aşağıdaki komutu kullanarak GitHub deposunu komut satırından klonlayın ve deponun start dalına geçin:

$  git clone https://github.com/googlecodelabs/android-kotlin-login

Önemli: Uygulamayı Firebase ile kullanmak üzere entegre edeceğiniz için başlangıç uygulamasının oluşturulup çalıştırılabilmesi için bazı ayarların yapılması gerekir. Bunu codelab'in bir sonraki adımında yapacaksınız.

1. adım: Firebase projesi oluşturun

Firebase'i Android uygulamanıza ekleyebilmeniz için öncelikle Android uygulamanıza bağlanacak bir Firebase projesi oluşturmanız gerekir.

  1. Firebase konsolunda Proje ekle'yi tıklayın.
  2. Proje adı seçin veya girin. Projenize istediğiniz adı verebilirsiniz ancak oluşturduğunuz uygulamayla alakalı bir ad seçmeye çalışın.
  3. Devam'ı tıklayın.
  4. Google Analytics'i ayarlamayı atlayabilir ve Şu An Değil seçeneğini belirleyebilirsiniz.
  5. Firebase projesini oluşturma işlemini tamamlamak için Proje Oluştur'u tıklayın.

2. adım: Uygulamanızı Firebase'e kaydedin

Firebase projeniz olduğuna göre Android uygulamanızı bu projeye ekleyebilirsiniz.

  1. Kurulum iş akışını başlatmak için Firebase konsolunun proje genel bakış sayfasının ortasındaki Android simgesini tıklayın.
  2. Android paket adı alanına uygulamanızın uygulama kimliğini girin. Uygulamanızı Firebase projenize kaydettikten sonra bu değeri ekleyemeyeceğiniz veya değiştiremeyeceğiniz için uygulamanızın kullandığı kimliği girdiğinizden emin olun.
  1. Uygulama kimliği bazen paket adı olarak da adlandırılır.
  2. Bu uygulama kimliğini modülünüzün (uygulama düzeyi) Gradle dosyasında bulun. Bu dosya genellikle app/build.gradle olur (örnek kimlik: com.yourcompany.yourproject).
  3. Hata ayıklama imza sertifikası SHA-1'i girin. Bu anahtarı, komut satırı terminalinize aşağıdaki komutu girerek oluşturabilirsiniz.
keytool -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v -storepass android
  1. Uygulamayı kaydet'i tıklayın.

3. adım: Firebase yapılandırma dosyasını projenize ekleyin

Firebase Android yapılandırma dosyasını uygulamanıza ekleyin:

  1. Firebase Android yapılandırma dosyanızı (google-services.json) edinmek için Download google-services.json'u (google-services.json dosyasını indir) tıklayın.
  • Firebase Android yapılandırma dosyanızı istediğiniz zaman tekrar indirebilirsiniz.
  • Yapılandırma dosyasına ek karakterler eklenmediğinden ve dosyanın yalnızca google-services.json olarak adlandırıldığından emin olun.
  1. Yapılandırma dosyanızı uygulamanızın modül (uygulama düzeyi) dizinine taşıyın.

4. adım: Android projenizi Firebase ürünlerini etkinleştirecek şekilde yapılandırın

  1. Uygulamanızda Firebase ürünlerini etkinleştirmek için Gradle dosyalarınıza google-services eklentisini ekleyin.
  1. Kök düzeyindeki (proje düzeyindeki) Gradle dosyanızda (build.gradle), Google Hizmetleri eklentisini dahil edecek kurallar ekleyin. Google'ın Maven deposunun da bulunduğundan emin olun.

build.gradle

buildscript {

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
  }

  dependencies {
    // ...

    // Add the following line:
    classpath 'com.google.gms:google-services:4.3.0'  // Google Services plugin
  }
}

allprojects {
  // ...

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
    // ...
  }
}
  1. Modül (uygulama düzeyi) Gradle dosyanızda (genellikle app/build.gradle) dosyanın en altına bir satır ekleyin.

app/build.gradle

apply plugin: 'com.android.application'

android {
  // ...
}

// Add the following line to the bottom of the file:
apply plugin: 'com.google.gms.google-services'  // Google Play services Gradle plugin

4. adım: Firebase bağımlılığını ekleyin

Bu codelab'de Firebase'i entegre etmenin temel nedeni, kullanıcı oluşturup yönetmenin bir yolunu bulmaktır. Bunun için, oturum açma işlemini uygulamanıza olanak tanıyan bir Firebase kitaplığı eklemeniz gerekir.

  1. SDK'yı uygulamanızda kullanabilmek için build.gradle (Module:app) dosyanıza aşağıdaki bağımlılığı ekleyin. build.gradle (Module:app) SDK, uygulamanızın kimliği doğrulanmış kullanıcılarının yönetilmesine olanak tanır.firebase-auth

app/build.gradle:

implementation 'com.firebaseui:firebase-ui-auth:5.0.0'
  1. Tüm bağımlılıkların uygulamanızda kullanılabilmesi için projenizi Gradle dosyalarıyla senkronize edin. İstem almazsanız Android Studio'da veya araç çubuğundan File > Sync Project with Gradle Files (Dosya > Projeyi Gradle Dosyalarıyla Senkronize Et) seçeneğini belirleyin.

5. adım: Uygulamayı çalıştırın ve kodu inceleyin

  1. Geliştirmeye başlamak için ortamınızın başarılı bir şekilde ayarlandığından emin olmak üzere uygulamayı bir emülatörde veya fiziksel cihazda çalıştırın.

İşlem başarılı olursa ana ekranda eğlenceli bir Android bilgisi ve sol üst köşede bir giriş düğmesi gösterilir. Giriş düğmesine dokunmak henüz herhangi bir işlem yapmaz.

Bu, genel olarak birden fazla parçası olan tek bir etkinlik uygulamasıdır. MainFragment, aşağıdaki ekranda gördüğünüz tüm kullanıcı arayüzünü içerir. (Bir sonraki codelab'de LoginFragment ve SettingsFragment ile çalışacaksınız.)

  1. Kod hakkında bilgi edinin. Özellikle şunlara dikkat edin:
  • FirebaseUserLiveData, uygulamayla ilişkili mevcut Firebase kullanıcısını gözlemlemek için uygulayacağınız sınıftır. Bu kullanıcı bilgilerini daha sonraki bir adımda almak için FirebaseAuth örneğini giriş noktası olarak kullanacaksınız.
  • MainFragment, LoginViewModel ile bağlantılıdır. LoginViewModel, authenticationState değişkeni oluşturmak için FirebaseUserLiveData'yi kullanmak üzere uygulayacağınız sınıftır. Bu authenticationState değişkenini kullanan MainFragment, kullanıcı arayüzünü buna göre güncellemek için değeri gözlemleyebilir.

Bu adımda, uygulamanızın desteklemesini istediğiniz kimlik doğrulama yöntemlerini ayarlamak için Firebase konsolunu kullanacaksınız. Bu codelab'de, kullanıcıların sağladıkları bir e-posta adresi veya Google Hesapları ile giriş yapmalarına izin vermeye odaklanacaksınız.

  1. Firebase konsoluna gidin. (Not: Hâlâ Firebase ekleme iş akışındaysanız konsola dönmek için sol üst köşedeki X'i tıklayın.
  2. Projenizde değilseniz projenizi seçin.
  3. Sol taraftaki gezinme menüsünü açın ve Geliştir > Kimlik Doğrulama 'yı seçin.

  1. Üst gezinme çubuğunda Oturum açma yöntemi sekmesini seçin.

  1. E-posta/Şifre satırını tıklayın.
  2. Pop-up pencerede Etkin anahtarını açın/kapatın ve Kaydet'i tıklayın.
  3. Benzer şekilde, Google satırını tıklayın.
  4. Etkin anahtarını açın, Proje destek e-posta adresi girin ve Kaydet'i tıklayın.

Bu görevde, kullanıcılarınız için giriş özelliğini uygulayacaksınız.

  1. MainFragment.kt adlı kişiyi aç.
  2. MainFragment düzeninde auth_button'e dikkat edin. Şu anda kullanıcı girişlerini işleyecek şekilde ayarlanmamıştır.
  3. onViewCreated(), bölümünde launchSignInFlow() adlı kullanıcıyı aramak için auth_button bölümüne onClickListener ekleyin.

MainFragment.kt

binding.authButton.setOnClickListener { launchSignInFlow() }
  1. MainFragment.kt bölümünde launchSignInFlow() yöntemini bulun. Şu anda TODO içeriyor.
  2. Aşağıda gösterildiği gibi launchSignInFlow() işlevini tamamlayın.

MainFragment.kt

private fun launchSignInFlow() {
   // Give users the option to sign in / register with their email or Google account.
   // If users choose to register with their email,
   // they will need to create a password as well.
   val providers = arrayListOf(
       AuthUI.IdpConfig.EmailBuilder().build(), AuthUI.IdpConfig.GoogleBuilder().build()

       // This is where you can provide more ways for users to register and 
       // sign in.
   )

   // Create and launch sign-in intent.
   // We listen to the response of this activity with the
   // SIGN_IN_REQUEST_CODE 
   startActivityForResult(
       AuthUI.getInstance()
           .createSignInIntentBuilder()
           .setAvailableProviders(providers)
           .build(),
       MainFragment.SIGN_IN_REQUEST_CODE
   )
}

Bu, kullanıcıların e-posta adresleriyle veya Google Hesaplarıyla kaydolup oturum açmasına olanak tanır. Kullanıcı e-posta adresiyle kaydolmayı seçerse oluşturduğu e-posta ve şifre kombinasyonu uygulamanıza özel olur. Bu kombinasyonla uygulamanıza giriş yapabilir ancak aynı kimlik bilgilerini kullanarak Firebase'in desteklediği diğer uygulamalara giriş yapamaz.

  1. MainFragment.kt içinde, oturum açma işleminin sonucunu dinlemek için aşağıda gösterildiği gibi onActivityResult() yöntemini uygulayabilirsiniz. Oturum açma sürecini SIGN_IN_REQUEST_CODE ile başlattığınız için SIGN_IN_REQUEST_CODE'nın onActivityResult()'ye geri gönderildiği zamanı filtreleyerek oturum açma sürecinin sonucunu da dinleyebilirsiniz. Kullanıcının başarılı bir şekilde oturum açıp açmadığını öğrenmek için bazı günlük ifadeleriyle başlayın.

MainFragment.kt

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
   super.onActivityResult(requestCode, resultCode, data)
   if (requestCode == SIGN_IN_REQUEST_CODE) {
       val response = IdpResponse.fromResultIntent(data)
       if (resultCode == Activity.RESULT_OK) {
           // User successfully signed in
           Log.i(TAG, "Successfully signed in user ${FirebaseAuth.getInstance().currentUser?.displayName}!")
       } else {
           // Sign in failed. If response is null the user canceled the
           // sign-in flow using the back button. Otherwise check
           // response.getError().getErrorCode() and handle the error.
           Log.i(TAG, "Sign in unsuccessful ${response?.error?.errorCode}")
       }
   }
}

Uygulamanız artık kullanıcıları kaydedip oturum açmalarını sağlayabilir.

  1. Uygulamayı çalıştırın ve Giriş düğmesine dokunduğunuzda giriş ekranının açıldığını doğrulayın.
  2. Artık e-posta adresiniz ve şifrenizle veya Google Hesabınızla oturum açabilirsiniz.
  3. Giriş yaptıktan sonra kullanıcı arayüzünde herhangi bir değişiklik olmaz (kullanıcı arayüzünü güncelleme işlemini bir sonraki adımda yapacaksınız). Ancak her şey doğru şekilde çalışıyorsa kayıt akışını tamamladıktan sonra Successfully signed in user ${your name}! günlük mesajını görmeniz gerekir.
  4. Ayrıca, Firebase konsoluna gidip Geliştir > Kimlik Doğrulama > Kullanıcılar'a giderek uygulamada artık kayıtlı bir kullanıcı olduğunu kontrol edebilirsiniz.
  5. Kullanıcılar uygulamanız için hesap oluşturduğunda bu hesabın yalnızca uygulamanıza özel olarak bağlandığını ve giriş işlevi için Firebase'i kullanan başka bir uygulamaya bağlanmadığını unutmayın.

Bu görevde, kimlik doğrulama durumuna göre kullanıcı arayüzünü güncellemeyi uygulayacaksınız. Kullanıcı giriş yaptığında adını göstererek ana ekranını kişiselleştirebilirsiniz. Kullanıcı oturum açtığında Giriş düğmesini Çıkış düğmesi olarak da güncelleyeceksiniz.

  1. Sizin için önceden oluşturulmuş olan FirebaseUserLiveData.kt sınıfını açın. Yapmanız gereken ilk şey, uygulamadaki diğer sınıfların kullanıcının oturum açtığını veya kapattığını bilmesini sağlayacak bir yöntem sunmaktır. Ancak LiveData değerinin güncellenmemesi nedeniyle sınıf henüz herhangi bir işlem yapmıyor.
  2. FirebaseAuth kitaplığını kullandığınız için FirebaseUI kitaplığının bir parçası olarak sizin için uygulanan FirebaseUser.AuthStateListener geri çağırma işleviyle oturum açmış kullanıcıda yapılan değişiklikleri dinleyebilirsiniz. Bu geri çağırma, kullanıcı uygulamanıza her giriş veya çıkış yaptığında tetiklenir.
  3. FirebaseUserLiveData.kt öğesinin authStateListener değişkenini tanımladığını unutmayın. Bu değişkeni, LiveData değerini depolamak için kullanırsınız. authStateListener değişkeni, uygulamanızın durumuna göre kimlik doğrulama durumundaki değişiklikleri uygun şekilde dinlemeye başlayıp durdurabilmeniz için oluşturuldu. Örneğin, kullanıcı uygulamayı arka plana alırsa olası bellek sızıntılarını önlemek için uygulamanın kimlik doğrulama durumu değişikliklerini dinlemeyi bırakması gerekir.
  4. authStateListener değerini, FirebaseUserLiveData değeriniz mevcut Firebase kullanıcısına karşılık gelecek şekilde güncelleyin.

FirebaseUserLiveData.kt

private val authStateListener = FirebaseAuth.AuthStateListener { firebaseAuth ->
   value = firebaseAuth.currentUser
}
  1. LoginViewModel.kt adlı kişiyi aç.
  2. LoginViewModel.kt içinde, yeni uyguladığınız FirebaseUserLiveData nesnesine dayalı bir authenticationState değişkeni oluşturun. Bu authenticationState değişkeni oluşturulduktan sonra diğer sınıflar artık LoginViewModel aracılığıyla kullanıcının giriş yapıp yapmadığını sorgulayabilir.

LoginViewModel.kt

val authenticationState = FirebaseUserLiveData().map { user ->
   if (user != null) {
       AuthenticationState.AUTHENTICATED
   } else {
       AuthenticationState.UNAUTHENTICATED
   }
}
  1. MainFragment.kt. uygulamasını aç
  2. MainFragment.kt'nın observeAuthenticationState() bölümünde, LoginViewModel'e yeni eklediğiniz authenticationState değişkenini kullanabilir ve kullanıcı arayüzünü buna göre değiştirebilirsiniz. Oturum açmış bir kullanıcı varsa authButton, Çıkış'ı göstermelidir.

MainFragment.kt

private fun observeAuthenticationState() {
   val factToDisplay = viewModel.getFactToDisplay(requireContext())

   viewModel.authenticationState.observe(viewLifecycleOwner, Observer { authenticationState ->
       when (authenticationState) {
           LoginViewModel.AuthenticationState.AUTHENTICATED -> {
               binding.authButton.text = getString(R.string.logout_button_text)
               binding.authButton.setOnClickListener {
                   // TODO implement logging out user in next step
               }

                // TODO 2. If the user is logged in, 
                 // you can customize the welcome message they see by
                 // utilizing the getFactWithPersonalization() function provided

           }
           else -> {
               // TODO 3. Lastly, if there is no logged-in user, 
                // auth_button should display Login and
                //  launch the sign in screen when clicked.
           }
       }
   })
}
  1. Kullanıcı giriş yapmışsa MainFragment içinde sağlanan getFactWithPersonalization() işlevini kullanarak gördüğü karşılama mesajını da özelleştirebilirsiniz.

MainFragment.kt

binding.welcomeText.text = getFactWithPersonalization(factToDisplay)
  1. Son olarak, oturum açmış bir kullanıcı yoksa (authenticationState, LoginViewModel.AuthenticationState.AUTHENTICATED dışında bir değer olduğunda) auth_button, Giriş yap'ı göstermeli ve tıklandığında oturum açma ekranını başlatmalıdır. Ayrıca, gösterilen mesajda kişiselleştirme olmamalıdır.

MainFragment.kt

binding.authButton.text = getString(R.string.login_button_text)
binding.authButton.setOnClickListener { launchSignInFlow() }
binding.welcomeText.text = factToDisplay

Tüm adımlar tamamlandığında, son observeAuthenticationState() yönteminiz aşağıdaki koda benzer şekilde görünmelidir.

MainFragment.kt

private fun observeAuthenticationState() {
   val factToDisplay = viewModel.getFactToDisplay(requireContext())

   viewModel.authenticationState.observe(viewLifecycleOwner, Observer { authenticationState ->
        // TODO 1. Use the authenticationState variable you just added 
         // in LoginViewModel and change the UI accordingly.
       when (authenticationState) {
            // TODO 2.  If the user is logged in, 
             // you can customize the welcome message they see by
             // utilizing the getFactWithPersonalization() function provided
           LoginViewModel.AuthenticationState.AUTHENTICATED -> {
               binding.welcomeText.text = getFactWithPersonalization(factToDisplay)
               binding.authButton.text = getString(R.string.logout_button_text)
               binding.authButton.setOnClickListener {
                   // TODO implement logging out user in next step
               }
           }
           else -> {
                // TODO 3. Lastly, if there is no logged-in user, 
                 // auth_button should display Login and
                 // launch the sign in screen when clicked.
               binding.welcomeText.text = factToDisplay

               binding.authButton.text = getString(R.string.login_button_text)
               binding.authButton.setOnClickListener {
                   launchSignInFlow()
               }
           }
       }
   })
}
  1. Uygulamanızı çalıştırın. Kullanıcının oturumunun açık olup olmamasına bağlı olarak kullanıcı arayüzü güncellenmelidir. Her şey düzgün çalışıyorsa ve oturumunuz açıksa ana ekranda artık bir Android bilgisi gösterilmesinin yanı sıra adınızla da karşılanırsınız. Giriş düğmesinde artık Çıkış yap seçeneği de gösterilir.

Bu görevde, oturumu kapatma özelliğini uygulayacaksınız.

Uygulama, kullanıcıların giriş yapmasına izin verdiğinden çıkış yapmalarına da olanak tanımalıdır. Tek bir kod satırıyla kullanıcı oturumunu kapatma örneğini aşağıda bulabilirsiniz:

AuthUI.getInstance().signOut(requireContext())
  1. MainFragment.kt adlı kişiyi aç.
  2. MainFragment.kt'nın observeAuthenticationState() bölümünde, oturum açmış bir kullanıcı olduğunda auth_button işlevinin doğru şekilde çalışması için oturumu kapatma mantığını ekleyin. Yöntemin nihai sonucu aşağıdaki koda benzer.

MainFragment.kt

private fun observeAuthenticationState() {
   val factToDisplay = viewModel.getFactToDisplay(requireContext())

   viewModel.authenticationState.observe(viewLifecycleOwner, Observer { authenticationState ->
       when (authenticationState) {
           LoginViewModel.AuthenticationState.AUTHENTICATED -> {
               binding.welcomeText.text = getFactWithPersonalization(factToDisplay)

               binding.authButton.text = getString(R.string.logout_button_text)
               binding.authButton.setOnClickListener {
                   AuthUI.getInstance().signOut(requireContext())
               }
           }
           else -> {
               binding.welcomeText.text = factToDisplay

               binding.authButton.text = getString(R.string.login_button_text)
               binding.authButton.setOnClickListener {
                   launchSignInFlow()
               }
           }
       }
   })
}
  1. Uygulamayı çalıştırın.
  2. Oturumu kapat düğmesine dokunun, kullanıcının oturumunun kapatıldığını ve düğmenin durumunun Oturum aç olarak değiştiğini doğrulayın.

Tamamlanmış uygulamanın son sürümünü https://github.com/googlecodelabs/android-kotlin-login adresinde bulabilirsiniz.

Bu codelab'de şunları öğrendiniz:

  • Gerekli bağımlılıkları Gradle dosyanıza ekleyip projeyi Firebase konsolunda ayarlayarak Firebase'i projenize ekleme
  • FirebaseUI kitaplığını kullanarak uygulamanızda oturum açma özelliğini nasıl uygulayacağınız ve kullanıcılarınızın nasıl oturum açmasına izin vermek istediğinizi belirtme. Kullanıcıların uygulamanızda oluşturduğu hesapların yalnızca uygulamanıza özel olduğunu ve giriş işlevi için Firebase'i kullanan tüm uygulamalarla paylaşılmadığını unutmayın.
  • LiveData kullanarak uygulamanızın mevcut kimlik doğrulama durumunu gözlemleme.
  • Kullanıcıların oturumunu kapatma

Bu kod laboratuvarında, Android uygulamalarında oturum açma özelliğini desteklemeyle ilgili temel bilgiler verilmiştir.

Bu codelab'de kullanıcıların e-posta adresleriyle kaydolmasına ve oturum açmasına izin verdiniz. Ancak FirebaseUI kitaplığıyla, telefon numarasıyla oturum açma gibi diğer kimlik doğrulama yöntemlerini de destekleyebilirsiniz. FirebaseUI kitaplığının özellikleri ve sağladığı diğer işlevlerden nasıl yararlanılacağı hakkında daha fazla bilgi edinmek için aşağıdaki kaynaklara göz atın:

Girişle ilgili en iyi uygulamalar hakkında daha fazla bilgi için aşağıdaki kaynaklara göz atın:

Codelab'ler:

Android geliştirici belgeleri:

Videolar:

Bu kurstaki diğer codelab'lerin bağlantıları için Advanced Android in Kotlin codelab'lerinin açılış sayfasına bakın.