پیوند دادن چند ارائه‌دهنده اصالت‌سنجی به یک حساب در Android

می‌توانید به کاربران اجازه دهید با پیوند دادن اطلاعات اعتباری ارائه‌دهنده اصالت‌سنجی به حساب کاربری موجود، بااستفاده از چندین ارائه‌دهنده اصالت‌سنجی به سیستم برنامه‌تان وارد شوند. کاربران صرف‌نظر از ارائه‌دهنده اصالت‌سنجی که برای ورود به سیستم استفاده کرده‌اند، با همان شناسه کاربر Firebase قابل‌شناسایی هستند. برای مثال، کاربری که با گذرواژه به سیستم وارد شده است می‌تواند «حساب Google» را پیوند دهد و در آینده با هریک از این روش‌ها به سیستم وارد شود. یا، کاربر ناشناسی می‌تواند حساب Facebook را پیوند دهد و سپس، بعداً با Facebook به سیستم وارد شود تا به استفاده از برنامه شما ادامه دهد.

قبل از شروع

پشتیبانی از دو یا چند ارائه‌دهنده اصالت‌سنجی (احتمالاً شامل اصالت‌سنجی ناشناس) را به برنامه‌تان اضافه کنید.

برای پیوند دادن اطلاعات اعتباری ارائه‌دهنده اصالت‌سنجی به حساب کاربری موجود:

  1. کاربر را بااستفاده از هر روش یا ارائه‌دهنده اصالت‌سنجی به سیستم وارد کنید.
  2. جریان ورود به سیستم را برای ارائه‌دهنده اصالت‌سنجی جدید تا مرحله فراخوانی یکی از روش‌های FirebaseAuth.signInWith تکمیل کنید، اما این مرحله را شامل نشود. برای مثال، گذرکلید Google کاربر، گذرکلید دسترسی Facebook، یا ایمیل و گذرواژه را دریافت کنید.
  3. ‫AuthCredential را برای ارائه‌دهنده اصالت‌سنجی جدید دریافت کنید:

    ‫ورود با Google

    Kotlin

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    ورود به سیستم فیس‌بوک

    Kotlin

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    ورود به سیستم با ایمیل و گذرواژه

    Kotlin

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  4. شیء AuthCredential را به روش linkWithCredential کاربر واردشده به سیستم ارسال کنید:

    Kotlin

    auth.currentUser!!.linkWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                Log.d(TAG, "linkWithCredential:success")
                val user = task.result?.user
                updateUI(user)
            } else {
                Log.w(TAG, "linkWithCredential:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.getCurrentUser().linkWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        Log.d(TAG, "linkWithCredential:success");
                        FirebaseUser user = task.getResult().getUser();
                        updateUI(user);
                    } else {
                        Log.w(TAG, "linkWithCredential:failure", task.getException());
                        Toast.makeText(AnonymousAuthActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });

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

    Kotlin

    val prevUser = auth.currentUser
    auth.signInWithCredential(credential)
        .addOnSuccessListener { result ->
            val currentUser = result.user
            // Merge prevUser and currentUser accounts and data
            // ...
        }
        .addOnFailureListener {
            // ...
        }

    Java

    FirebaseUser prevUser = FirebaseAuth.getInstance().getCurrentUser();
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    FirebaseUser currentUser = task.getResult().getUser();
                    // Merge prevUser and currentUser accounts and data
                    // ...
                }
            });

اگر تماس با linkWithCredential موفقیت‌آمیز باشد، کاربر اکنون می‌تواند بااستفاده از هریک از ارائه‌دهندگان اصالت‌سنجی پیوندشده به سیستم وارد شود و به همان داده‌های Firebase دسترسی پیدا کند.

یک حساب کاربری Firebase می‌تواند چندین ارائه‌دهنده اصالت‌سنجی پیوندشده داشته باشد (برای مثال، ایمیل/گذرواژه، Google،‏ Facebook)، که به کاربر امکان می‌دهد ازطریق روش‌های مختلف به همان حساب Firebase وارد شود.

اگر ارائه‌دهنده اصالت‌سنجی را از حساب کاربری لغو پیوند کنید، کاربر دیگر نمی‌تواند با آن ارائه‌دهنده به سیستم وارد شود.

برای لغو پیوند ارائه‌دهنده اصالت‌سنجی از حساب کاربر، شناسه ارائه‌دهنده را به متد unlink ارسال کنید. می‌توانید شناسه‌های ارائه‌دهنده ارائه‌دهندگان اصالت‌سنجی پیوندشده به کاربر را با فراخوانی getProviderData دریافت کنید.

Kotlin

Firebase.auth.currentUser!!.unlink(providerId)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            // Auth provider unlinked from account
            // ...
        }
    }

Java

mAuth.getCurrentUser().unlink(providerId)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
            @Override
            public void onComplete(@NonNull Task<AuthResult> task) {
                if (task.isSuccessful()) {
                    // Auth provider unlinked from account
                    // ...
                }
            }
        });

عیب‌یابی

اگر هنگام تلاش برای پیوند دادن چند حساب با خطا مواجه شدید، مستندات مربوط به نشانی‌های ایمیل تأییدشده را ببینید.