ربط عدة مقدّمي خدمات مصادقة بحساب على 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
                    // ...
                }
            }
        });