Android पर एक खाते से अनेक प्रामाणिक प्रदाताओं को लिंक करें

आप प्रमाणीकरण प्रदाता क्रेडेंशियल्स को किसी मौजूदा उपयोगकर्ता खाते से लिंक करके उपयोगकर्ताओं को एकाधिक प्रमाणीकरण प्रदाताओं का उपयोग करके अपने ऐप में साइन इन करने की अनुमति दे सकते हैं। उपयोगकर्ता साइन इन करने के लिए जिस प्रमाणीकरण प्रदाता का उपयोग करते हैं, उसकी परवाह किए बिना उपयोगकर्ता उसी फायरबेस उपयोगकर्ता आईडी द्वारा पहचाने जा सकते हैं। उदाहरण के लिए, पासवर्ड के साथ साइन इन करने वाला उपयोगकर्ता Google खाते को लिंक कर सकता है और भविष्य में किसी भी विधि से साइन इन कर सकता है। या, कोई अज्ञात उपयोगकर्ता किसी Facebook खाते को लिंक कर सकता है और फिर, बाद में, अपने ऐप का उपयोग जारी रखने के लिए Facebook के साथ साइन इन कर सकता है।

शुरू करने से पहले

अपने ऐप में दो या अधिक प्रमाणीकरण प्रदाताओं (संभवतः अनाम प्रमाणीकरण सहित) के लिए समर्थन जोड़ें।

प्रामाणिक प्रदाता क्रेडेंशियल्स को किसी मौजूदा उपयोगकर्ता खाते से लिंक करने के लिए:

  1. किसी प्रमाणीकरण प्रदाता या विधि का उपयोग करके उपयोगकर्ता में साइन इन करें।
  2. नए प्रमाणीकरण प्रदाता के लिए साइन-इन प्रवाह को FirebaseAuth.signInWith विधियों में से किसी एक को कॉल करके पूरा करें, लेकिन इसमें शामिल नहीं है। उदाहरण के लिए, उपयोगकर्ता का Google ID टोकन, Facebook एक्सेस टोकन, या ईमेल और पासवर्ड प्राप्त करें।
  3. नए प्रमाणीकरण प्रदाता के लिए 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);
  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 पर कॉल सफल हो जाता है, तो उपयोगकर्ता अब किसी भी लिंक किए गए प्रमाणीकरण प्रदाता का उपयोग करके साइन इन कर सकता है और उसी फायरबेस डेटा तक पहुंच सकता है।

आप किसी प्रमाणीकरण प्रदाता को किसी खाते से अनलिंक कर सकते हैं, ताकि उपयोगकर्ता अब उस प्रदाता के साथ साइन इन नहीं कर सके।

किसी उपयोगकर्ता खाते से किसी प्रामाणिक प्रदाता को अनलिंक करने के लिए, प्रदाता आईडी को 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
                    // ...
                }
            }
        });