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

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

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

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

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

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

    כניסה באמצעות חשבון Google
    KotlinJava
    val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
    AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
    התחברות באמצעות חשבון Facebook
    KotlinJava
    val credential = FacebookAuthProvider.getCredential(token.token)
    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
    כניסה באמצעות כתובת אימייל וסיסמה
    KotlinJava
    val credential = EmailAuthProvider.getCredential(email, password)
    AuthCredential credential = EmailAuthProvider.getCredential(email, password);
  4. מעבירים את האובייקט AuthCredential לשיטה linkWithCredential של המשתמש המחובר:

    KotlinJava
    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)
            }
        }
    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 תיכשל אם פרטי הכניסה כבר מקושרים לחשבון משתמש אחר. במקרה כזה, עליכם למזג את החשבונות ואת הנתונים המשויכים בהתאם לאפליקציה שלכם:

    KotlinJava
    val prevUser = auth.currentUser
    auth.signInWithCredential(credential)
        .addOnSuccessListener { result ->
            val currentUser = result.user
            // Merge prevUser and currentUser accounts and data
            // ...
        }
        .addOnFailureListener {
            // ...
        }
    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.

KotlinJava
Firebase.auth.currentUser!!.unlink(providerId)
    .addOnCompleteListener(this) { task ->
        if (task.isSuccessful) {
            // Auth provider unlinked from account
            // ...
        }
    }
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
                    // ...
                }
            }
        });