כדי לאפשר למשתמשים להיכנס לאפליקציה באמצעות כמה ספקי אימות, אפשר לקשר את פרטי הכניסה של ספק האימות לחשבון משתמש קיים. אפשר לזהות משתמשים לפי אותו מזהה משתמש ב-Firebase, ללא קשר לספק האימות שבו הם השתמשו כדי להיכנס לחשבון. לדוגמה, משתמש שנכנס באמצעות סיסמה יכול לקשר חשבון Google ולהיכנס באמצעות כל אחת מהשיטות בעתיד. לחלופין, משתמש אנונימי יכול לקשר חשבון Facebook ולאחר מכן להיכנס באמצעות Facebook כדי להמשיך להשתמש באפליקציה.
לפני שמתחילים
מוסיפים לאפליקציה תמיכה בשני ספקי אימות או יותר (יכול להיות שכוללים אימות אנונימי).
קישור פרטי הכניסה של ספק האימות לחשבון משתמש
כדי לקשר את פרטי הכניסה של ספק האימות לחשבון משתמש קיים:
- נכנסים עם המשתמש באמצעות ספק אימות או שיטת אימות כלשהי.
- משלימים את תהליך הכניסה של ספק האימות החדש, עד להפעלה של אחת מהשיטות
FirebaseAuth.signInWith
, אבל לא כולל אותה. לדוגמה, אפשר לקבל את הטוקן של מזהה Google, את אסימון הגישה ל-Facebook או את האימייל והסיסמה של המשתמש. מקבלים
AuthCredential
עבור ספק האימות החדש:כניסה באמצעות חשבון Google
val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
התחברות באמצעות חשבון Facebook
val credential = FacebookAuthProvider.getCredential(token.token)
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
כניסה באמצעות כתובת אימייל וסיסמה
val credential = EmailAuthProvider.getCredential(email, password)
AuthCredential credential = EmailAuthProvider.getCredential(email, password);
מעבירים את האובייקט
AuthCredential
לשיטהlinkWithCredential
של המשתמש המחובר: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
תיכשל אם פרטי הכניסה כבר מקושרים לחשבון משתמש אחר. במקרה כזה, עליכם למזג את החשבונות ואת הנתונים המשויכים בהתאם לאפליקציה שלכם: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
.
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 // ... } } });