يمكنك السماح للمستخدمين بتسجيل الدخول إلى تطبيقك باستخدام موفري مصادقة متعددين عن طريق ربط بيانات اعتماد موفر المصادقة بحساب مستخدم موجود. يمكن التعرف على المستخدمين من خلال معرف مستخدم Firebase نفسه بغض النظر عن موفر المصادقة الذي استخدموه لتسجيل الدخول. على سبيل المثال، يمكن للمستخدم الذي سجل الدخول باستخدام كلمة مرور ربط حساب Google وتسجيل الدخول بأي من الطريقتين في المستقبل. أو يمكن لمستخدم مجهول ربط حساب Facebook ثم تسجيل الدخول لاحقًا باستخدام Facebook لمواصلة استخدام تطبيقك.
قبل ان تبدأ
أضف دعمًا لاثنين أو أكثر من موفري المصادقة (ربما بما في ذلك المصادقة المجهولة) إلى تطبيقك.
ربط بيانات اعتماد موفر المصادقة بحساب المستخدم
لربط بيانات اعتماد موفر المصادقة بحساب مستخدم موجود:
- قم بتسجيل دخول المستخدم باستخدام أي مزود أو طريقة مصادقة.
- أكمل تدفق تسجيل الدخول لموفر المصادقة الجديد حتى، على سبيل المثال لا الحصر، استدعاء إحدى أساليب
FirebaseAuth.signInWith
. على سبيل المثال، احصل على رمز معرف Google المميز للمستخدم، أو رمز الوصول إلى Facebook، أو البريد الإلكتروني وكلمة المرور. احصل على
AuthCredential
لموفر المصادقة الجديد:تسجيل الدخول إلى جوجل
Kotlin+KTX
val credential = GoogleAuthProvider.getCredential(googleIdToken, null)
Java
AuthCredential credential = GoogleAuthProvider.getCredential(googleIdToken, null);
تسجيل الدخول الى الفيسبوك
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);
قم بتمرير كائن
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 // ... } } });