FirebaseUI ile Android uygulamanıza kolayca oturum açma işlemi ekleyin

FirebaseUI, uygulamanızda kullanılmak üzere açılır kullanıcı arayüzü akışları sağlayan Firebase Authentication SDK'nın üzerine kurulmuş bir kitaplıktır. FirebaseUI aşağıdaki avantajları sağlar:

  • Birden Çok Sağlayıcı: E-posta/şifre, e-posta bağlantısı, telefon ile kimlik doğrulama, Google ile Oturum Açma, Facebook Girişi, Twitter Girişi ve GitHub Girişi için oturum açma akışları.
  • Hesap Yönetimi: Hesap oluşturma ve şifre sıfırlama gibi hesap yönetimi görevlerini gerçekleştirmek için kullanılan akışlar.
  • Hesap Bağlama: Kullanıcı hesaplarını kimlik sağlayıcılar arasında güvenli bir şekilde bağlamaya yönelik akışlardır.
  • Anonim Kullanıcı Yükseltme - Anonim kullanıcıları güvenli bir şekilde yeni sürüme geçirme akışları.
  • Özel Temalar - FirebaseUI'nin görünümünü uygulamanızla eşleşecek şekilde özelleştirin. Ayrıca, FirebaseUI açık kaynak olduğundan projeyi çatallayabilir ve tam olarak ihtiyaçlarınıza göre özelleştirebilirsiniz.
  • Şifreler için Smart Lock - Cihazlar arasında hızlı oturum açma için Şifreler için Smart Lock ile otomatik entegrasyon.

Başlamadan önce

  1. Henüz yapmadıysanız Firebase'i Android projenize ekleyin.

  2. FirebaseUI için bağımlılıkları uygulama düzeyindeki build.gradle dosyanıza ekleyin. Facebook veya Twitter ile oturum açmayı desteklemek istiyorsanız Facebook ve Twitter SDK'larını da ekleyin:

    dependencies {
        // ...
    
        implementation 'com.firebaseui:firebase-ui-auth:7.2.0'
    
        // Required only if Facebook login support is required
        // Find the latest Facebook SDK releases here: https://goo.gl/Ce5L94
        implementation 'com.facebook.android:facebook-android-sdk:8.x'
    }
    

    FirebaseUI Auth SDK'sının Firebase SDK'sı ve Google Play Hizmetleri SDK'sına geçişli bağımlılıkları vardır.

  3. Firebase konsolunda Kimlik Doğrulama bölümünü açın ve desteklemek istediğiniz oturum açma yöntemlerini etkinleştirin. Bazı oturum açma yöntemleri, genellikle hizmetin geliştirici konsolunda bulunan ek bilgiler gerektirir.

  4. Google ile Oturum Açma özelliğini etkinleştirdiyseniz:

    1. Konsolda istendiğinde, Google ile Oturum Açma için gerekli OAuth istemci bilgilerini içeren güncellenmiş Firebase yapılandırma dosyasını (google-services.json) indirin.

    2. Güncelliğini yitirmiş ilgili yapılandırma dosyasını değiştirerek bu güncellenmiş yapılandırma dosyasını Android Studio projenize taşıyın. (Firebase'i Android projenize ekleme başlıklı makaleyi inceleyin.)

    3. Uygulamanızın SHA dijital parmak izini henüz belirtmediyseniz Firebase konsolunun Ayarlar sayfasından bunu yapın. Uygulamanızın SHA parmak izini nasıl alacağınızla ilgili ayrıntılar için İstemcinizin Kimlik Doğrulaması bölümüne bakın.

  5. Facebook veya Twitter ile oturum açmayı destekliyorsanız strings.xml öğesine her bir sağlayıcının gerektirdiği tanımlayıcı bilgileri belirten dize kaynakları ekleyin:

    
    <resources>
      <!-- Facebook application ID and custom URL scheme (app ID prefixed by 'fb'). -->
      <string name="facebook_application_id" translatable="false">YOUR_APP_ID</string>
      <string name="facebook_login_protocol_scheme" translatable="false">fbYOUR_APP_ID</string>
    </resources>
    

Oturum aç

FirebaseUI Etkinlik sonucu sözleşmesi için geri çağırma kaydeden bir ActivityResultLauncher oluşturun:

Kotlin+KTX

// See: https://developer.android.com/training/basics/intents/result
private val signInLauncher = registerForActivityResult(
    FirebaseAuthUIActivityResultContract(),
) { res ->
    this.onSignInResult(res)
}

Java

// See: https://developer.android.com/training/basics/intents/result
private final ActivityResultLauncher<Intent> signInLauncher = registerForActivityResult(
        new FirebaseAuthUIActivityResultContract(),
        new ActivityResultCallback<FirebaseAuthUIAuthenticationResult>() {
            @Override
            public void onActivityResult(FirebaseAuthUIAuthenticationResult result) {
                onSignInResult(result);
            }
        }
);

FirebaseUI oturum açma akışını başlatmak için tercih ettiğiniz oturum açma yöntemlerini kullanarak bir oturum açma amacı oluşturun:

Kotlin+KTX

// Choose authentication providers
val providers = arrayListOf(
    AuthUI.IdpConfig.EmailBuilder().build(),
    AuthUI.IdpConfig.PhoneBuilder().build(),
    AuthUI.IdpConfig.GoogleBuilder().build(),
    AuthUI.IdpConfig.FacebookBuilder().build(),
    AuthUI.IdpConfig.TwitterBuilder().build(),
)

// Create and launch sign-in intent
val signInIntent = AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .build()
signInLauncher.launch(signInIntent)

Java

// Choose authentication providers
List<AuthUI.IdpConfig> providers = Arrays.asList(
        new AuthUI.IdpConfig.EmailBuilder().build(),
        new AuthUI.IdpConfig.PhoneBuilder().build(),
        new AuthUI.IdpConfig.GoogleBuilder().build(),
        new AuthUI.IdpConfig.FacebookBuilder().build(),
        new AuthUI.IdpConfig.TwitterBuilder().build());

// Create and launch sign-in intent
Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .build();
signInLauncher.launch(signInIntent);

Oturum açma akışı tamamlandığında onSignInResult sonucunu alırsınız:

Kotlin+KTX

private fun onSignInResult(result: FirebaseAuthUIAuthenticationResult) {
    val response = result.idpResponse
    if (result.resultCode == RESULT_OK) {
        // Successfully signed in
        val user = FirebaseAuth.getInstance().currentUser
        // ...
    } 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.
        // ...
    }
}

Java

private void onSignInResult(FirebaseAuthUIAuthenticationResult result) {
    IdpResponse response = result.getIdpResponse();
    if (result.getResultCode() == RESULT_OK) {
        // Successfully signed in
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        // ...
    } 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.
        // ...
    }
}

Oturum açma yöntemlerini ayarlama

  1. Firebase konsolunda Kimlik Doğrulama bölümünü açın. Oturum açma yöntemi sekmesinde E-posta/Şifre sağlayıcısını etkinleştirin. E-posta bağlantısı ile oturum açmayı kullanmak için e-posta/şifre ile oturum açmanın etkinleştirilmesi gerektiğini unutmayın.

  2. Aynı bölümde, E-posta bağlantısı (şifresiz oturum açma) oturum açma yöntemini etkinleştirin ve Kaydet'i tıklayın.

  3. Ayrıca, e-posta bağlantısıyla oturum açmayı kullanmak için Firebase Dynamic Links'i etkinleştirmeniz gerekir. Firebase konsolunda, gezinme çubuğundaki Etkileşim'in altındaki Dinamik Bağlantılar'ı tıklayın. Başlarken'i tıklayın ve bir alan ekleyin. Seçtiğiniz alan, kullanıcılarınıza gönderilen e-posta bağlantılarında yansıtılır.

  4. EmailBuilder örneğinde enableEmailLinkSignIn yöntemini çağırarak FirebaseUI'de e-posta bağlantısı oturum açma özelliğini etkinleştirebilirsiniz. Ayrıca, setHandleCodeInApp öğesinin doğru değerine ayarlandığı geçerli bir ActionCodeSettings nesnesi sağlamanız gerekir. Ayrıca, setUrl için ilettiğiniz URL'yi beyaz listeye eklemeniz gerekir. Bu işlemi Firebase konsolunda Kimlik Doğrulama -> Oturum Açma Yöntemleri -> Yetkilendirilen alanlar altında yapabilirsiniz.

    Kotlin+KTX

    val actionCodeSettings = ActionCodeSettings.newBuilder()
        .setAndroidPackageName( // yourPackageName=
            "...", // installIfNotAvailable=
            true, // minimumVersion=
            null,
        )
        .setHandleCodeInApp(true) // This must be set to true
        .setUrl("https://google.com") // This URL needs to be whitelisted
        .build()
    
    val providers = listOf(
        EmailBuilder()
            .enableEmailLinkSignIn()
            .setActionCodeSettings(actionCodeSettings)
            .build(),
    )
    val signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .build()
    signInLauncher.launch(signInIntent)

    Java

    ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder()
            .setAndroidPackageName(
                    /* yourPackageName= */ "...",
                    /* installIfNotAvailable= */ true,
                    /* minimumVersion= */ null)
            .setHandleCodeInApp(true) // This must be set to true
            .setUrl("https://google.com") // This URL needs to be whitelisted
            .build();
    
    List<AuthUI.IdpConfig> providers = Arrays.asList(
            new AuthUI.IdpConfig.EmailBuilder()
                    .enableEmailLinkSignIn()
                    .setActionCodeSettings(actionCodeSettings)
                    .build()
    );
    Intent signInIntent = AuthUI.getInstance()
            .createSignInIntentBuilder()
            .setAvailableProviders(providers)
            .build();
    signInLauncher.launch(signInIntent);
  5. Bağlantıyı belirli bir etkinlikte almak istiyorsanız lütfen burada özetlenen adımları uygulayın. Aksi takdirde, bağlantı başlatıcı etkinliğinize yönlendirir.

  6. Derin bağlantıyı bulduktan sonra, bu bağlantıyı sizin için halledebileceğimizi doğrulamak için telefon etmeniz gerekir. Mümkünse kimliğinizi setEmailLink aracılığıyla bize iletmeniz gerekir.

    Kotlin+KTX

    if (AuthUI.canHandleIntent(intent)) {
        val extras = intent.extras ?: return
        val link = extras.getString("email_link_sign_in")
        if (link != null) {
            val signInIntent = AuthUI.getInstance()
                .createSignInIntentBuilder()
                .setEmailLink(link)
                .setAvailableProviders(providers)
                .build()
            signInLauncher.launch(signInIntent)
        }
    }

    Java

    if (AuthUI.canHandleIntent(getIntent())) {
        if (getIntent().getExtras() == null) {
            return;
        }
        String link = getIntent().getExtras().getString("email_link_sign_in");
        if (link != null) {
            Intent signInIntent = AuthUI.getInstance()
                    .createSignInIntentBuilder()
                    .setEmailLink(link)
                    .setAvailableProviders(providers)
                    .build();
            signInLauncher.launch(signInIntent);
        }
    }
  7. İsteğe bağlı Cihazlar arası e-posta bağlantısıyla oturum açma desteklenir. Yani Android uygulamanız üzerinden gönderilen bağlantı, web veya Apple uygulamalarınızda giriş yapmak için kullanılabilir. Varsayılan olarak cihazlar arası destek etkindir. EmailBuilder örneğinde setForceSameDevice yöntemini çağırarak bu özelliği devre dışı bırakabilirsiniz.

    Daha fazla bilgi için FirebaseUI-Web ve FirebaseUI-iOS bölümlerine bakın.

Oturumu Kapat

FirebaseUI, tüm sosyal kimlik sağlayıcıların yanı sıra Firebase Authentication'dan çıkış yapmak için pratik yöntemler sunar:

Kotlin+KTX

AuthUI.getInstance()
    .signOut(this)
    .addOnCompleteListener {
        // ...
    }

Java

AuthUI.getInstance()
        .signOut(this)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            public void onComplete(@NonNull Task<Void> task) {
                // ...
            }
        });

Kullanıcının hesabını tamamen de silebilirsiniz:

Kotlin+KTX

AuthUI.getInstance()
    .delete(this)
    .addOnCompleteListener {
        // ...
    }

Java

AuthUI.getInstance()
        .delete(this)
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                // ...
            }
        });

Özelleştirme

FirebaseUI, tema oluşturma için varsayılan olarak AppCompat kullanır. Bu da uygulamanızın renk şemasını doğal olarak benimseyeceği anlamına gelir. Daha fazla özelleştirme gerekirse oturum açma Intent oluşturucuya tema ve logo aktarabilirsiniz:

Kotlin+KTX

val signInIntent = AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .setLogo(R.drawable.my_great_logo) // Set logo drawable
    .setTheme(R.style.MySuperAppTheme) // Set theme
    .build()
signInLauncher.launch(signInIntent)

Java

Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setLogo(R.drawable.my_great_logo)      // Set logo drawable
        .setTheme(R.style.MySuperAppTheme)      // Set theme
        .build();
signInLauncher.launch(signInIntent);

Ayrıca özel bir gizlilik politikası ve hizmet şartları da belirleyebilirsiniz:

Kotlin+KTX

val signInIntent = AuthUI.getInstance()
    .createSignInIntentBuilder()
    .setAvailableProviders(providers)
    .setTosAndPrivacyPolicyUrls(
        "https://example.com/terms.html",
        "https://example.com/privacy.html",
    )
    .build()
signInLauncher.launch(signInIntent)

Java

Intent signInIntent = AuthUI.getInstance()
        .createSignInIntentBuilder()
        .setAvailableProviders(providers)
        .setTosAndPrivacyPolicyUrls(
                "https://example.com/terms.html",
                "https://example.com/privacy.html")
        .build();
signInLauncher.launch(signInIntent);

Sonraki adımlar

  • FirebaseUI'yi kullanma ve özelleştirme hakkında daha fazla bilgi için GitHub'daki BENİOKU dosyasını inceleyin.
  • FirebaseUI'de bir sorun bulursanız ve bunu bildirmek isterseniz GitHub sorun izleyicisini kullanın.