با FirebaseUI به راحتی ورود به سیستم را به برنامه Android خود اضافه کنید

FirebaseUI کتابخانه‌ای است که بر پایه‌ی SDK احراز هویت فایربیس ساخته شده و جریان‌های رابط کاربری drop-in را برای استفاده در برنامه‌ی شما فراهم می‌کند. FirebaseUI مزایای زیر را ارائه می‌دهد:

  • ارائه دهندگان متعدد - جریان‌های ورود به سیستم برای ایمیل/رمز عبور، لینک ایمیل، احراز هویت تلفنی، ورود به سیستم با گوگل، ورود به سیستم با فیسبوک، ورود به سیستم با توییتر و ورود به سیستم با گیت‌هاب.
  • مدیریت حساب - جریان‌هایی برای انجام وظایف مدیریت حساب، مانند ایجاد حساب و تنظیم مجدد رمز عبور.
  • پیوند حساب - جریان‌ها برای پیوند ایمن حساب‌های کاربری در بین ارائه‌دهندگان هویت.
  • ارتقاء کاربر ناشناس - برای ارتقاء ایمن کاربران ناشناس، جریان دارد.
  • تم‌های سفارشی - ظاهر FirebaseUI را متناسب با برنامه خود سفارشی کنید. همچنین، از آنجا که FirebaseUI متن‌باز است، می‌توانید پروژه را تغییر داده و دقیقاً مطابق با نیازهای خود سفارشی کنید.
  • مدیریت اعتبارنامه - ادغام خودکار با مدیریت اعتبارنامه برای ورود سریع بین دستگاه‌های مختلف.

قبل از اینکه شروع کنی

  1. اگر هنوز Firebase را به پروژه اندروید خود اضافه نکرده‌اید، آن را اضافه کنید.

  2. وابستگی‌های FirebaseUI را به فایل build.gradle(.kts) در سطح برنامه خود اضافه کنید. اگر می‌خواهید از ورود با فیس‌بوک یا توییتر پشتیبانی کنید، SDK های فیس‌بوک و توییتر را نیز اضافه کنید:

        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 وابستگی‌های انتقالی به کیت توسعه نرم‌افزار Firebase و کیت توسعه نرم‌افزار سرویس‌های Google Play دارد.

  3. در کنسول Firebase ، به بخش امنیت > احراز هویت بروید.

  4. در تب روش ورود ، ارائه‌دهندگان ورود به سیستمی را که می‌خواهید پشتیبانی کنند، فعال کنید. برخی از ارائه‌دهندگان ورود به سیستم به اطلاعات بیشتری نیاز دارند که معمولاً در کنسول توسعه‌دهندگان سرویس موجود است.

  5. اگر ورود به سیستم گوگل را فعال کرده‌اید:

    1. فایل پیکربندی Firebase خود را به‌روزرسانی کنید.

      1. وقتی در کنسول Firebase از شما خواسته شد، فایل پیکربندی Firebase به‌روزرسانی‌شده ( google-services.json ) را دانلود کنید، که اکنون شامل اطلاعات کلاینت OAuth مورد نیاز برای ورود به سیستم گوگل است.

      2. این فایل پیکربندی به‌روزرسانی‌شده را به پروژه اندروید استودیو خود منتقل کنید و آن را جایگزین فایل پیکربندی مربوطه که اکنون منسوخ شده است، کنید. (به بخش افزودن فایربیس به پروژه اندروید خود مراجعه کنید.)

    2. اگر قبلاً اثر انگشت SHA-1 برنامه خود را مشخص نکرده‌اید، آن را مشخص کنید.

      1. در کنسول Firebase ، به مسیر زیر بروید: > برگه عمومی .

      2. به پایین صفحه و قسمت «برنامه‌های شما» بروید، برنامه اندروید خود را انتخاب کنید و اثر انگشت SHA-1 خود را در قسمت «اثر انگشت گواهی SHA» اضافه کنید.

      برای جزئیات بیشتر در مورد نحوه دریافت اثر انگشت SHA برنامه خود، به بخش احراز هویت کلاینت خود مراجعه کنید.

  6. اگر از ورود با فیس‌بوک یا توییتر پشتیبانی می‌کنید، منابع رشته‌ای را به strings.xml اضافه کنید که اطلاعات شناسایی مورد نیاز هر ارائه‌دهنده را مشخص کند:

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

ورود

یک ActivityResultLauncher ایجاد کنید که یک callback برای قرارداد نتیجه FirebaseUI Activity ثبت کند:

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، یک هدف ورود به سیستم با متدهای ورود به سیستم دلخواه خود ایجاد کنید:

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

وقتی جریان ورود به سیستم کامل شد، نتیجه را در onSignInResult دریافت خواهید کرد:

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.
        // ...
    }
}

روش‌های ورود به سیستم را تنظیم کنید

  1. در کنسول Firebase ، به مسیر Security > Authentication بروید.

  2. در تب روش ورود ، روش ورود با ایمیل/رمز عبور را فعال کنید. توجه داشته باشید که برای استفاده از ورود با لینک ایمیل، باید ورود با ایمیل/رمز عبور فعال باشد.

  3. در همان بخش، روش ورود به سیستم از طریق لینک ایمیل (ورود بدون رمز عبور) را فعال کنید و روی ذخیره کلیک کنید.

  4. همچنین برای استفاده از ورود با ایمیل-لینک، باید Firebase Dynamic Links فعال کنید:

    1. در کنسول Firebase ، به DevOps & Engagement > Dynamic Links بروید.

    2. روی شروع کلیک کنید و سپس یک دامنه اضافه کنید. دامنه‌ای که اینجا انتخاب می‌کنید در لینک‌های ایمیل ارسالی به کاربران شما نمایش داده خواهد شد.

  5. شما می‌توانید با فراخوانی enableEmailLinkSignIn در یک نمونه EmailBuilder ورود از طریق لینک ایمیل را در FirebaseUI فعال کنید. همچنین باید یک شیء ActionCodeSettings معتبر با setHandleCodeInApp که روی true تنظیم شده است، ارائه دهید.

    علاوه بر این، باید URL ای که به setUrl ارسال می‌کنید را در لیست سفید قرار دهید:

    1. در کنسول Firebase ، به تب Security > Authentication > Settings بروید.

    2. در بخش دامنه‌های مجاز ، روی افزودن دامنه کلیک کنید و دامنه خود را اضافه کنید.

    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. اگر می‌خواهید لینک را در یک اکتیویتی خاص دریافت کنید، لطفاً مراحل ذکر شده در اینجا را دنبال کنید. در غیر این صورت، لینک به اکتیویتی لانچر شما هدایت می‌شود.

  7. وقتی لینک عمیق را گرفتید، باید تأیید کنید که ما می‌توانیم آن را برای شما مدیریت کنیم. اگر بتوانیم، باید آن را از طریق setEmailLink به ما ارسال کنید.

    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. ورود از طریق لینک ایمیل بین دستگاه‌های مختلف (اختیاری) پشتیبانی می‌شود، به این معنی که لینک ارسال شده از طریق برنامه اندروید شما می‌تواند برای ورود به سیستم در برنامه‌های وب یا اپل شما استفاده شود. به طور پیش‌فرض، پشتیبانی بین دستگاه‌های مختلف فعال است. می‌توانید با فراخوانی setForceSameDevice در نمونه EmailBuilder ، آن را غیرفعال کنید.

    برای اطلاعات بیشتر به FirebaseUI-Web و FirebaseUI-iOS مراجعه کنید.

خروج

FirebaseUI روش‌های راحتی برای خروج از سیستم احراز هویت Firebase و همچنین همه ارائه دهندگان هویت اجتماعی ارائه می‌دهد:

Kotlin

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

Java

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

همچنین می‌توانید حساب کاربری را به طور کامل حذف کنید:

Kotlin

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

Java

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

سفارشی‌سازی

به طور پیش‌فرض FirebaseUI از AppCompat برای قالب‌بندی استفاده می‌کند، به این معنی که به طور طبیعی طرح رنگی برنامه شما را اتخاذ می‌کند. اگر به سفارشی‌سازی بیشتری نیاز دارید، می‌توانید یک قالب و یک لوگو را به سازنده‌ی Intent ورود ارسال کنید:

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

همچنین می‌توانید یک سیاست حفظ حریم خصوصی و شرایط خدمات سفارشی تنظیم کنید:

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

مراحل بعدی

  • برای اطلاعات بیشتر در مورد استفاده و سفارشی‌سازی FirebaseUI، به فایل README در GitHub مراجعه کنید.
  • اگر در FirebaseUI مشکلی پیدا کردید و می‌خواهید آن را گزارش دهید، از ردیاب مشکل GitHub استفاده کنید.