קישור של מספר ספקי אימות לחשבון ב-Android

כדי לאפשר למשתמשים להיכנס לאפליקציה באמצעות כמה ספקי אימות, אפשר לקשר את פרטי הכניסה של ספק האימות לחשבון משתמש קיים. ניתן לזהות את המשתמשים לפי אותו מזהה משתמש ב-Firebase, ללא קשר ספק האימות ששימש לכניסה. לדוגמה, משתמש שנכנס באמצעות סיסמה יכול לקשר חשבון Google ולהיכנס באמצעות כל אחת מהשיטות בעתיד. לחלופין, משתמש אנונימי יכול לקשר חשבון Facebook ולאחר מכן להיכנס באמצעות Facebook כדי להמשיך להשתמש באפליקציה.

לפני שמתחילים

מוסיפים לאפליקציה תמיכה בשני ספקי אימות או יותר (יכול להיות שכוללים אימות אנונימי).

כדי לקשר פרטי כניסה של ספק אימות לחשבון משתמש קיים:

  1. מזינים את פרטי הכניסה של המשתמש באמצעות כל ספק או שיטה של אימות.
  2. משלימים את תהליך הכניסה של ספק האימות החדש, עד להפעלה של אחת מהשיטות FirebaseAuth.signInWith, אבל לא כולל אותה. לדוגמה, אפשר לקבל את הטוקן של מזהה Google, את אסימון הגישה ל-Facebook או את האימייל והסיסמה של המשתמש.
  3. מקבלים AuthCredential עבור ספק האימות החדש:

    כניסה באמצעות חשבון Google

    Kotlin+KTX

    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)

    Java

    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    התחברות ל-Facebook

    Kotlin+KTX

    val credential = FacebookAuthProvider.getCredential(token.token)

    Java

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    כניסה באמצעות סיסמה לאימייל

    Kotlin+KTX

    val credential = EmailAuthProvider.getCredential(email, password)

    Java

    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  4. מעבירים את האובייקט AuthCredential לשיטה linkWithCredential של המשתמש המחובר:

    Kotlin+KTX

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

    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.

ניתן לבטל את הקישור של ספק אימות לחשבון, כך שהמשתמש לא יוכל להיכנס לחשבון עם הספק הזה.

כדי לבטל את הקישור של ספק אימות לחשבון משתמש, מעבירים את מזהה הספק לשיטה unlink. אפשר לקבל את מזהי הספקים של ספקי ההרשאות מקושר למשתמש באמצעות קריאה ל- getProviderData

Kotlin+KTX

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