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