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

FirebaseUI, Firebase Authentication SDK'sının üzerine inşa edilmiş bir kitaplıktır ve uygulamanızda kullanılmak üzere hazır kullanıcı arayüzü akışları sağlar. FirebaseUI aşağıdaki avantajları sunar:

  • Birden fazla sağlayıcı: E-posta/şifre, e-posta bağlantısı, telefon kimlik doğrulaması, Google ile oturum açma, Facebook ile giriş, Twitter ile giriş ve GitHub ile giriş için oturum açma akışları.
  • Hesap yönetimi: Hesap oluşturma ve şifre sıfırlama gibi hesap yönetimi görevlerini ele alan akışlar.
  • Hesap Bağlama: Kimlik sağlayıcılar arasında kullanıcı hesaplarını güvenli bir şekilde bağlama akışları.
  • Anonim Kullanıcı Yükseltme: Anonim kullanıcıları güvenli bir şekilde yükseltme akışları.
  • Özel Temalar: FirebaseUI'ın görünümünü uygulamanıza uyacak şekilde özelleştirin. Ayrıca, FirebaseUI açık kaynaklı olduğundan projeyi çatallayıp tam olarak ihtiyaçlarınıza göre özelleştirebilirsiniz.
  • Kimlik Bilgisi Yöneticisi: Cihazlar arası hızlı oturum açma için Kimlik Bilgisi Yöneticisi ile otomatik entegrasyon.

Başlamadan önce

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

  2. FirebaseUI bağımlılıklarını uygulama düzeyindeki build.gradle(.kts) 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:9.0.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 ve Google Play Hizmetleri SDK'sı üzerinde geçişli bağımlılıkları vardır.

  3. Firebase konsolunda Güvenlik > Kimlik doğrulama'ya gidin.

  4. Oturum açma yöntemi sekmesinde, desteklemek istediğiniz oturum açma sağlayıcılarını etkinleştirin. Bazı oturum açma sağlayıcılar ek bilgi gerektirir. Bu bilgiler genellikle hizmetin geliştirici konsolunda bulunur.

  5. Google ile Oturum Açma'yı etkinleştirdiyseniz:

    1. Firebase yapılandırma dosyanızı güncelleyin.

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

      2. Bu güncellenmiş yapılandırma dosyasını Android Studio projenize taşıyın ve artık güncel olmayan ilgili yapılandırma dosyasının yerine koyun. (Bkz. Firebase'i Android projenize ekleme.)

    2. Henüz yapmadıysanız uygulamanızın SHA-1 parmak izini belirtin.

      1. Firebase konsolunda Ayarlar > Genel sekmesine gidin.

      2. Uygulamalarınız kartına gidin, Android uygulamanızı seçin ve SHA sertifikası parmak izleri alanına SHA-1 parmak izinizi ekleyin.

      Uygulamanızın SHA parmak izini alma hakkında ayrıntılı bilgi için İstemcinizin Kimliğini Doğrulama başlıklı makaleyi inceleyin.

  6. Facebook veya Twitter ile oturum açmayı destekliyorsanız strings.xml'ya her sağlayıcı tarafından istenen kişisel verileri 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 Activity sonuç sözleşmesi için geri çağırma kaydeden bir ActivityResultLauncher oluşturun:

Kotlin

// 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öntemleriyle bir oturum açma amaçlı isteği oluşturun:

Kotlin

// 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 sonucu onSignInResult bölümünde görürsünüz:

Kotlin

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 Güvenlik > Kimlik doğrulama'ya gidin.

  2. Oturum açma yöntemi sekmesinde E-posta/Şifre oturum açma yöntemini etkinleştirin. E-posta bağlantısı ile oturum açma özelliğini kullanmak için e-posta/şifre ile oturum açma özelliğinin etkinleştirilmesi gerektiğini unutmayın.

  3. 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.

  4. E-posta bağlantısı ile oturum açma özelliğini kullanmak için Firebase Dynamic Links seçeneğini de etkinleştirmeniz gerekir:

    1. Firebase Console'da DevOps & Engagement (DevOps ve Etkileşim) > Dynamic Links'e (Dinamik Bağlantılar) gidin.

    2. Başlayın'ı tıklayın ve bir alan adı ekleyin. Burada seçtiğiniz alan, kullanıcılarınıza gönderilen e-posta bağlantılarına yansıtılır.

  5. FirebaseUI'da e-posta bağlantısıyla oturum açmayı, bir EmailBuilder örneğinde enableEmailLinkSignIn işlevini çağırarak etkinleştirebilirsiniz. Ayrıca, setHandleCodeInApp değeri true olarak ayarlanmış geçerli bir ActionCodeSettings nesnesi de sağlamanız gerekir.

    Ayrıca, setUrl parametresine ilettiğiniz URL'yi beyaz listeye eklemeniz gerekir:

    1. Firebase konsolunda Güvenlik > Kimlik doğrulama > Ayarlar sekmesine gidin.

    2. Yetkili alanlar bölümünde Alan ekle'yi tıklayın ve alanınızı ekleyin.

    Kotlin

    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);
  6. Bağlantıyı belirli bir etkinlikte yakalamak istiyorsanız lütfen burada belirtilen adımları uygulayın. Aksi takdirde, bağlantı başlatıcı etkinliğinize yönlendirir.

  7. Derin bağlantıyı yakaladıktan sonra, sizin için işleyebileceğimizi doğrulamak üzere verify işlevini çağırmanız gerekir. Bu durumda, setEmailLink üzerinden bize iletmeniz gerekir.

    Kotlin

    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);
        }
    }
  8. İsteğe bağlı olarak cihazlar arası e-posta bağlantısı ile oturum açma desteklenir. Bu sayede, Android uygulamanız üzerinden gönderilen bağlantı, web veya Apple uygulamalarınızda oturum açmak için kullanılabilir. Cihazlar arası destek varsayılan olarak etkindir. EmailBuilder örneğinde setForceSameDevice işlevini çağırarak devre dışı bırakabilirsiniz.

    Daha fazla bilgi için FirebaseUI-Web ve FirebaseUI-iOS'e bakın.

Oturumu Kapatın

FirebaseUI, Firebase Authentication'dan ve tüm sosyal kimlik sağlayıcılarından oturumu kapatmak için kolaylık sağlayan yöntemler sunar:

Kotlin

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

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, temalandırma için varsayılan olarak AppCompat'i kullanır. Bu nedenle, uygulamanızın renk şemasını doğal olarak benimser. Daha fazla özelleştirme yapmanız gerekirse oturum açma Intent oluşturucusuna bir tema ve logo iletebilirsiniz:

Kotlin

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

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'yı kullanma ve özelleştirme hakkında daha fazla bilgi için GitHub'daki README dosyasına bakın.
  • FirebaseUI'da bir sorun bulursanız ve bunu bildirmek isterseniz GitHub sorun izleyiciyi kullanın.