फ़ोन नंबर का उपयोग करके Android पर Firebase से प्रमाणित करें

आप उपयोगकर्ता के फोन पर एक एसएमएस संदेश भेजकर साइन इन करने के लिए फायरबेस प्रमाणीकरण का उपयोग कर सकते हैं। उपयोगकर्ता एसएमएस संदेश में निहित एक बार के कोड का उपयोग करके साइन इन करता है।

अपने ऐप में फ़ोन नंबर साइन-इन जोड़ने का सबसे आसान तरीका FirebaseUI का उपयोग करना है, जिसमें एक ड्रॉप-इन साइन-इन विजेट शामिल है जो फ़ोन नंबर साइन-इन के लिए साइन-इन प्रवाह को लागू करता है, साथ ही पासवर्ड-आधारित और फ़ेडरेटेड साइन भी लागू करता है। -में। यह दस्तावेज़ बताता है कि फायरबेस एसडीके का उपयोग करके फ़ोन नंबर साइन-इन प्रवाह को कैसे कार्यान्वित किया जाए।

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

  1. यदि आपने पहले से नहीं किया है, तो अपने एंड्रॉइड प्रोजेक्ट में फायरबेस जोड़ें
  2. अपने मॉड्यूल (ऐप-स्तर) ग्रैडल फ़ाइल में (आमतौर पर <project>/<app-module>/build.gradle.kts या <project>/<app-module>/build.gradle ), फायरबेस प्रमाणीकरण के लिए निर्भरता जोड़ें Android के लिए लाइब्रेरी. हम लाइब्रेरी वर्जनिंग को नियंत्रित करने के लिए फायरबेस एंड्रॉइड BoM का उपयोग करने की सलाह देते हैं।
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.8.0"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }
    

    फायरबेस एंड्रॉइड बीओएम का उपयोग करके, आपका ऐप हमेशा फायरबेस एंड्रॉइड लाइब्रेरी के संगत संस्करणों का उपयोग करेगा।

    (वैकल्पिक) BoM का उपयोग किए बिना फायरबेस लाइब्रेरी निर्भरताएँ जोड़ें

    यदि आप फायरबेस बीओएम का उपयोग नहीं करना चुनते हैं, तो आपको प्रत्येक फायरबेस लाइब्रेरी संस्करण को उसकी निर्भरता पंक्ति में निर्दिष्ट करना होगा।

    ध्यान दें कि यदि आप अपने ऐप में एकाधिक फायरबेस लाइब्रेरी का उपयोग करते हैं, तो हम लाइब्रेरी संस्करणों को प्रबंधित करने के लिए BoM का उपयोग करने की दृढ़ता से अनुशंसा करते हैं, जो सुनिश्चित करता है कि सभी संस्करण संगत हैं।

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:22.3.1")
    }
    
    कोटलिन-विशिष्ट लाइब्रेरी मॉड्यूल खोज रहे हैं? अक्टूबर 2023 (फायरबेस बीओएम 32.5.0) से शुरू होकर, कोटलिन और जावा डेवलपर्स दोनों मुख्य लाइब्रेरी मॉड्यूल पर निर्भर हो सकते हैं (विवरण के लिए, इस पहल के बारे में अक्सर पूछे जाने वाले प्रश्न देखें)।
  3. यदि आपने अभी तक अपने ऐप को अपने फायरबेस प्रोजेक्ट से कनेक्ट नहीं किया है, तो फायरबेस कंसोल से ऐसा करें।
  4. यदि आपने फायरबेस कंसोल में अपने ऐप का SHA-1 हैश पहले से सेट नहीं किया है, तो ऐसा करें। अपने ऐप के SHA-1 हैश को ढूंढने के बारे में जानकारी के लिए अपने क्लाइंट को प्रमाणित करना देखें।

सुरक्षा चिंताएं

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

यदि आप अपने ऐप में फ़ोन नंबर आधारित साइन-इन का उपयोग करते हैं, तो आपको इसे अधिक सुरक्षित साइन-इन विधियों के साथ पेश करना चाहिए, और उपयोगकर्ताओं को फ़ोन नंबर साइन-इन का उपयोग करने के सुरक्षा ट्रेडऑफ़ के बारे में सूचित करना चाहिए।

अपने फायरबेस प्रोजेक्ट के लिए फ़ोन नंबर साइन-इन सक्षम करें

उपयोगकर्ताओं को एसएमएस द्वारा साइन इन करने के लिए, आपको पहले अपने फायरबेस प्रोजेक्ट के लिए फ़ोन नंबर साइन-इन विधि सक्षम करनी होगी:

  1. फायरबेस कंसोल में, प्रमाणीकरण अनुभाग खोलें।
  2. साइन-इन विधि पृष्ठ पर, फ़ोन नंबर साइन-इन विधि सक्षम करें।

फायरबेस का फ़ोन नंबर साइन-इन अनुरोध कोटा इतना अधिक है कि अधिकांश ऐप्स प्रभावित नहीं होंगे। हालाँकि, यदि आपको फ़ोन प्रमाणीकरण के साथ बहुत अधिक संख्या में उपयोगकर्ताओं को साइन इन करने की आवश्यकता है, तो आपको अपनी मूल्य निर्धारण योजना को अपग्रेड करने की आवश्यकता हो सकती है। मूल्य निर्धारण पृष्ठ देखें.

ऐप सत्यापन सक्षम करें

फ़ोन नंबर प्रमाणीकरण का उपयोग करने के लिए, फ़ायरबेस को यह सत्यापित करने में सक्षम होना चाहिए कि फ़ोन नंबर साइन-इन अनुरोध आपके ऐप से आ रहे हैं। फायरबेस प्रमाणीकरण इसे तीन तरीकों से पूरा करता है:

  • प्ले इंटीग्रिटी एपीआई : यदि किसी उपयोगकर्ता के पास Google Play सेवाओं वाला एक उपकरण स्थापित है, और फायरबेस प्रमाणीकरण प्ले इंटीग्रिटी एपीआई के साथ डिवाइस को वैध के रूप में सत्यापित कर सकता है, तो फोन नंबर साइन-इन आगे बढ़ सकता है। प्ले इंटीग्रिटी एपीआई फायरबेस प्रमाणीकरण द्वारा Google के स्वामित्व वाले प्रोजेक्ट पर सक्षम है, आपके प्रोजेक्ट पर नहीं। यह आपके प्रोजेक्ट पर किसी भी प्ले इंटीग्रिटी एपीआई कोटा में योगदान नहीं देता है। प्ले इंटीग्रिटी सपोर्ट ऑथेंटिकेशन SDK v21.2.0+ (फायरबेस BoM v31.4.0+) के साथ उपलब्ध है।

    प्ले इंटीग्रिटी का उपयोग करने के लिए, यदि आपने अभी तक अपने ऐप का SHA-256 फिंगरप्रिंट निर्दिष्ट नहीं किया है, तो फायरबेस कंसोल की प्रोजेक्ट सेटिंग्स से ऐसा करें। अपने ऐप का SHA-256 फ़िंगरप्रिंट कैसे प्राप्त करें, इसके विवरण के लिए अपने क्लाइंट को प्रमाणित करना देखें।

  • रीकैप्चा सत्यापन : ऐसी स्थिति में जब प्ले इंटीग्रिटी का उपयोग नहीं किया जा सकता है, जैसे कि जब किसी उपयोगकर्ता के पास Google Play सेवाओं को स्थापित किए बिना डिवाइस होता है, तो फायरबेस प्रमाणीकरण फोन साइन-इन प्रवाह को पूरा करने के लिए रीकैप्चा सत्यापन का उपयोग करता है। रीकैप्चा चुनौती को अक्सर उपयोगकर्ता को कुछ भी हल किए बिना पूरा किया जा सकता है। ध्यान दें कि इस प्रवाह के लिए आवश्यक है कि एक SHA-1 आपके एप्लिकेशन से संबद्ध हो। इस प्रवाह के लिए यह भी आवश्यक है कि आपकी API कुंजी PROJECT_ID .firebaseapp.com के लिए अप्रतिबंधित या अनुमत सूची में हो।

    कुछ परिदृश्य जहां reCAPTCHA ट्रिगर होता है:

    • यदि अंतिम-उपयोगकर्ता के डिवाइस में Google Play सेवाएँ स्थापित नहीं हैं।
    • यदि ऐप Google Play स्टोर ( प्रमाणीकरण SDK v21.2.0+ पर) के माध्यम से वितरित नहीं किया गया है।
    • यदि प्राप्त सेफ्टीनेट टोकन मान्य नहीं था (प्रमाणीकरण एसडीके संस्करणों <v21.2.0 पर)।

    जब ऐप सत्यापन के लिए सेफ्टीनेट या प्ले इंटीग्रिटी का उपयोग किया जाता है, तो एसएमएस टेम्पलेट में %APP_NAME% फ़ील्ड Google Play स्टोर से निर्धारित ऐप नाम से भर जाती है। उन परिदृश्यों में जहां reCAPTCHA ट्रिगर होता है, %APP_NAME% PROJECT_ID .firebaseapp.com के रूप में पॉप्युलेट किया जाता है।

आप forceRecaptchaFlowForTesting के साथ reCAPTCHA सत्यापन प्रवाह को बाध्य कर सकते हैं। आप setAppVerificationDisabledForTesting उपयोग करके ऐप सत्यापन (काल्पनिक फोन नंबरों का उपयोग करते समय) को अक्षम कर सकते हैं।

समस्या निवारण

  • ऐप सत्यापन के लिए reCAPTCHA का उपयोग करते समय "प्रारंभिक स्थिति गुम" त्रुटि

    यह तब हो सकता है जब reCAPTCHA प्रवाह सफलतापूर्वक पूरा हो जाता है लेकिन उपयोगकर्ता को मूल एप्लिकेशन पर वापस रीडायरेक्ट नहीं करता है। यदि ऐसा होता है, तो उपयोगकर्ता को फ़ॉलबैक URL PROJECT_ID .firebaseapp.com/__/auth/handler पर पुनः निर्देशित किया जाता है। फ़ायरफ़ॉक्स ब्राउज़र पर, मूल ऐप लिंक खोलना डिफ़ॉल्ट रूप से अक्षम है। यदि आप फ़ायरफ़ॉक्स पर उपरोक्त त्रुटि देखते हैं, तो ऐप लिंक खोलने को सक्षम करने के लिए मूल ऐप्स में लिंक खोलने के लिए एंड्रॉइड के लिए फ़ायरफ़ॉक्स सेट करें में दिए गए चरणों का पालन करें।

उपयोगकर्ता के फ़ोन पर एक सत्यापन कोड भेजें

फ़ोन नंबर साइन-इन आरंभ करने के लिए, उपयोगकर्ता को एक इंटरफ़ेस प्रस्तुत करें जो उन्हें अपना फ़ोन नंबर टाइप करने के लिए प्रेरित करता है। कानूनी आवश्यकताएं अलग-अलग होती हैं, लेकिन सर्वोत्तम अभ्यास के रूप में और अपने उपयोगकर्ताओं के लिए अपेक्षाएं निर्धारित करने के लिए, आपको उन्हें सूचित करना चाहिए कि यदि वे फोन साइन-इन का उपयोग करते हैं, तो उन्हें सत्यापन और मानक दरें लागू होने के लिए एक एसएमएस संदेश प्राप्त हो सकता है।

फिर, Firebase से उपयोगकर्ता के फ़ोन नंबर को सत्यापित करने का अनुरोध करने के लिए उनका फ़ोन नंबर PhoneAuthProvider.verifyPhoneNumber पद्धति पर भेजें। उदाहरण के लिए:

Kotlin+KTX

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this) // Activity (for callback binding)
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // (optional) Activity for callback binding
      // If no activity is passed, reCAPTCHA verification can not be used.
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

verifyPhoneNumber विधि पुनः प्रवेशी है: यदि आप इसे कई बार कॉल करते हैं, जैसे कि किसी गतिविधि की onStart विधि में, verifyPhoneNumber विधि दूसरा एसएमएस नहीं भेजेगी जब तक कि मूल अनुरोध का समय समाप्त न हो जाए।

यदि आपका ऐप उपयोगकर्ता के साइन इन करने से पहले बंद हो जाता है (उदाहरण के लिए, जब उपयोगकर्ता अपने एसएमएस ऐप का उपयोग कर रहा हो) तो आप फ़ोन नंबर साइन इन प्रक्रिया को फिर से शुरू करने के लिए इस व्यवहार का उपयोग कर सकते हैं। verifyPhoneNumber पर कॉल करने के बाद, एक ध्वज सेट करें जो इंगित करता है कि सत्यापन प्रगति पर है। फिर, अपनी गतिविधि की onSaveInstanceState पद्धति में फ़्लैग को सहेजें और onRestoreInstanceState में फ़्लैग को पुनर्स्थापित करें। अंत में, अपनी गतिविधि की onStart विधि में, जांचें कि क्या सत्यापन पहले से ही प्रगति पर है, और यदि हां, तो verifyPhoneNumber पर दोबारा कॉल करें। सत्यापन पूरा होने या विफल होने पर ध्वज साफ़ करना सुनिश्चित करें ( सत्यापन कॉलबैक देखें)।

स्क्रीन रोटेशन और गतिविधि पुनरारंभ के अन्य उदाहरणों को आसानी से संभालने के लिए, अपनी गतिविधि को verifyPhoneNumber विधि में पास करें। गतिविधि बंद होने पर कॉलबैक स्वचालित रूप से अलग हो जाएंगे, ताकि आप कॉलबैक विधियों में यूआई संक्रमण कोड को स्वतंत्र रूप से लिख सकें।

फायरबेस द्वारा भेजे गए एसएमएस संदेश को आपके ऑथ उदाहरण पर setLanguageCode विधि के माध्यम से ऑथ भाषा निर्दिष्ट करके भी स्थानीयकृत किया जा सकता है।

Kotlin+KTX

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

जब आप PhoneAuthProvider.verifyPhoneNumber पर कॉल करते हैं, तो आपको OnVerificationStateChangedCallbacks का एक उदाहरण भी प्रदान करना होगा, जिसमें कॉलबैक फ़ंक्शन के कार्यान्वयन शामिल हैं जो अनुरोध के परिणामों को संभालते हैं। उदाहरण के लिए:

Kotlin+KTX

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e is FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken,
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(@NonNull FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

सत्यापन कॉलबैक

अधिकांश ऐप्स में, आप onVerificationCompleted , onVerificationFailed , और onCodeSent कॉलबैक लागू करते हैं। आप अपने ऐप की आवश्यकताओं के आधार पर onCodeAutoRetrievalTimeOut को भी लागू कर सकते हैं।

onVerificationCompleted(PhoneAuthCredential)

इस विधि को दो स्थितियों में कहा जाता है:

  • त्वरित सत्यापन: कुछ मामलों में सत्यापन कोड भेजने या दर्ज किए बिना फ़ोन नंबर को तुरंत सत्यापित किया जा सकता है।
  • स्वतः पुनर्प्राप्ति: कुछ उपकरणों पर, Google Play सेवाएं स्वचालित रूप से आने वाले सत्यापन एसएमएस का पता लगा सकती हैं और उपयोगकर्ता की कार्रवाई के बिना सत्यापन कर सकती हैं। (यह क्षमता कुछ वाहकों के पास अनुपलब्ध हो सकती है।) यह एसएमएस रिट्रीवर एपीआई का उपयोग करता है, जिसमें एसएमएस संदेश के अंत में 11 वर्ण का हैश शामिल होता है।
किसी भी स्थिति में, उपयोगकर्ता का फ़ोन नंबर सफलतापूर्वक सत्यापित किया गया है, और आप उपयोगकर्ता में साइन इन करने के लिए कॉलबैक में पास किए गए PhoneAuthCredential ऑब्जेक्ट का उपयोग कर सकते हैं।

onसत्यापन विफल(FirebaseException)

यह विधि किसी अमान्य सत्यापन अनुरोध के जवाब में कॉल की जाती है, जैसे कोई अनुरोध जो अमान्य फ़ोन नंबर या सत्यापन कोड निर्दिष्ट करता है।

onCodeSent(स्ट्रिंग सत्यापनआईडी, PhoneAuthProvider.ForceResendingToken)

वैकल्पिक। दिए गए फ़ोन नंबर पर एसएमएस द्वारा सत्यापन कोड भेजे जाने के बाद इस विधि को कॉल किया जाता है।

जब इस पद्धति को कॉल किया जाता है, तो अधिकांश ऐप्स एक यूआई प्रदर्शित करते हैं जो उपयोगकर्ता को एसएमएस संदेश से सत्यापन कोड टाइप करने के लिए संकेत देता है। (उसी समय, ऑटो-सत्यापन पृष्ठभूमि में आगे बढ़ सकता है।) फिर, उपयोगकर्ता द्वारा सत्यापन कोड टाइप करने के बाद, आप सत्यापन कोड और सत्यापन आईडी का उपयोग कर सकते हैं जो कि PhoneAuthCredential ऑब्जेक्ट बनाने के लिए विधि में पारित किया गया था, जो आप बदले में उपयोगकर्ता को साइन इन करने के लिए उपयोग कर सकते हैं। हालाँकि, कुछ ऐप्स सत्यापन कोड यूआई प्रदर्शित करने से पहले onCodeAutoRetrievalTimeOut को कॉल करने तक प्रतीक्षा कर सकते हैं (अनुशंसित नहीं)।

onCodeAutoRetrievalTimeOut(स्ट्रिंग सत्यापनआईडी)

वैकल्पिक। इस पद्धति को तब कॉल किया जाता है जब verifyPhoneNumber के लिए निर्दिष्ट टाइमआउट अवधि बिना onVerificationCompleted ट्रिगर किए बीत जाती है। बिना सिम कार्ड वाले उपकरणों पर, इस विधि को तुरंत कॉल किया जाता है क्योंकि एसएमएस ऑटो-पुनर्प्राप्ति संभव नहीं है।

कुछ ऐप्स ऑटो-सत्यापन अवधि समाप्त होने तक उपयोगकर्ता इनपुट को ब्लॉक कर देते हैं, और उसके बाद ही एक यूआई प्रदर्शित करते हैं जो उपयोगकर्ता को एसएमएस संदेश से सत्यापन कोड टाइप करने के लिए संकेत देता है (अनुशंसित नहीं)।

एक PhoneAuthCredential ऑब्जेक्ट बनाएं

उपयोगकर्ता द्वारा उपयोगकर्ता के फोन पर फायरबेस द्वारा भेजे गए सत्यापन कोड को दर्ज करने के बाद, सत्यापन कोड और सत्यापन आईडी का उपयोग करके एक PhoneAuthCredential ऑब्जेक्ट बनाएं, जो onCodeSent या onCodeAutoRetrievalTimeOut कॉलबैक को दिया गया था। (जब onVerificationCompleted कॉल किया जाता है, तो आपको सीधे PhoneAuthCredential ऑब्जेक्ट मिलता है, इसलिए आप इस चरण को छोड़ सकते हैं।)

PhoneAuthCredential ऑब्जेक्ट बनाने के लिए, PhoneAuthProvider.getCredential पर कॉल करें:

Kotlin+KTX

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

उपयोगकर्ता में साइन इन करें

PhoneAuthCredential ऑब्जेक्ट प्राप्त करने के बाद, चाहे onVerificationCompleted कॉलबैक में या PhoneAuthProvider.getCredential पर कॉल करके, PhoneAuthCredential ऑब्जेक्ट को FirebaseAuth.signInWithCredential पर पास करके साइन-इन प्रवाह पूरा करें:

Kotlin+KTX

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithCredential:success")

                val user = task.result?.user
            } else {
                // Sign in failed, display a message and update the UI
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                if (task.exception is FirebaseAuthInvalidCredentialsException) {
                    // The verification code entered was invalid
                }
                // Update UI
            }
        }
}

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

काल्पनिक फ़ोन नंबरों के साथ परीक्षण करें

आप फायरबेस कंसोल के माध्यम से विकास के लिए काल्पनिक फ़ोन नंबर सेट कर सकते हैं। काल्पनिक फ़ोन नंबरों के साथ परीक्षण करने से ये लाभ मिलते हैं:

  • अपने उपयोग कोटा का उपभोग किए बिना फ़ोन नंबर प्रमाणीकरण का परीक्षण करें।
  • वास्तविक एसएमएस संदेश भेजे बिना फ़ोन नंबर प्रमाणीकरण का परीक्षण करें।
  • बिना परेशान हुए एक ही फ़ोन नंबर से लगातार परीक्षण चलाएँ। यदि समीक्षक परीक्षण के लिए उसी फ़ोन नंबर का उपयोग करता है तो यह ऐप स्टोर समीक्षा प्रक्रिया के दौरान अस्वीकृति के जोखिम को कम करता है।
  • बिना किसी अतिरिक्त प्रयास के विकास परिवेश में आसानी से परीक्षण करें, जैसे कि Google Play सेवाओं के बिना iOS सिम्युलेटर या एंड्रॉइड एमुलेटर में विकसित करने की क्षमता।
  • उत्पादन परिवेश में सामान्य रूप से वास्तविक फ़ोन नंबरों पर लागू होने वाली सुरक्षा जांच से अवरुद्ध हुए बिना एकीकरण परीक्षण लिखें।

काल्पनिक फ़ोन नंबरों को इन आवश्यकताओं को पूरा करना होगा:

  1. सुनिश्चित करें कि आप ऐसे फ़ोन नंबरों का उपयोग करें जो वास्तव में काल्पनिक हैं, और पहले से मौजूद नहीं हैं। फायरबेस प्रमाणीकरण आपको वास्तविक उपयोगकर्ताओं द्वारा उपयोग किए गए मौजूदा फ़ोन नंबरों को परीक्षण नंबरों के रूप में सेट करने की अनुमति नहीं देता है। एक विकल्प यूएस परीक्षण फ़ोन नंबरों के रूप में 555 पूर्वलग्न संख्याओं का उपयोग करना है, उदाहरण के लिए: +1 650-555-3434
  2. फ़ोन नंबरों को लंबाई और अन्य बाधाओं के लिए सही ढंग से प्रारूपित किया जाना चाहिए। वे अभी भी वास्तविक उपयोगकर्ता के फ़ोन नंबर के समान सत्यापन से गुजरेंगे।
  3. आप विकास के लिए अधिकतम 10 फ़ोन नंबर जोड़ सकते हैं.
  4. ऐसे परीक्षण फ़ोन नंबर/कोड का उपयोग करें जिनका अनुमान लगाना कठिन हो और उन्हें बार-बार बदलें।

काल्पनिक फ़ोन नंबर और सत्यापन कोड बनाएं

  1. फायरबेस कंसोल में, प्रमाणीकरण अनुभाग खोलें।
  2. साइन इन विधि टैब में, यदि आपने पहले से फ़ोन प्रदाता को सक्षम नहीं किया है तो उसे सक्षम करें।
  3. अकॉर्डियन मेनू के परीक्षण के लिए फ़ोन नंबर खोलें।
  4. वह फ़ोन नंबर प्रदान करें जिसका आप परीक्षण करना चाहते हैं, उदाहरण के लिए: +1 650-555-3434
  5. उस विशिष्ट संख्या के लिए 6-अंकीय सत्यापन कोड प्रदान करें, उदाहरण के लिए: 654321
  6. संख्या जोड़ें . यदि आवश्यकता हो, तो आप संबंधित पंक्ति पर होवर करके और ट्रैश आइकन पर क्लिक करके फ़ोन नंबर और उसका कोड हटा सकते हैं।

मैन्युअल परीक्षण

आप सीधे अपने एप्लिकेशन में एक काल्पनिक फ़ोन नंबर का उपयोग शुरू कर सकते हैं। यह आपको विकास चरणों के दौरान कोटा समस्याओं या थ्रॉटलिंग के बिना मैन्युअल परीक्षण करने की अनुमति देता है। आप Google Play Services इंस्टॉल किए बिना सीधे iOS सिम्युलेटर या एंड्रॉइड एमुलेटर से भी परीक्षण कर सकते हैं।

जब आप काल्पनिक फ़ोन नंबर प्रदान करते हैं और सत्यापन कोड भेजते हैं, तो कोई वास्तविक एसएमएस नहीं भेजा जाता है। इसके बजाय, आपको साइन इन पूरा करने के लिए पहले से कॉन्फ़िगर किया गया सत्यापन कोड प्रदान करना होगा।

साइन-इन पूरा होने पर, उस फ़ोन नंबर के साथ एक फायरबेस उपयोगकर्ता बनाया जाता है। उपयोगकर्ता का व्यवहार और गुण वास्तविक फ़ोन नंबर उपयोगकर्ता के समान हैं, और वह रीयलटाइम डेटाबेस/क्लाउड फायरस्टोर और अन्य सेवाओं तक उसी तरह पहुंच सकता है। इस प्रक्रिया के दौरान बनाए गए आईडी टोकन पर वास्तविक फ़ोन नंबर उपयोगकर्ता के समान हस्ताक्षर होते हैं।

यदि आप पहुंच को और प्रतिबंधित करना चाहते हैं तो एक अन्य विकल्प इन उपयोगकर्ताओं पर कस्टम दावों के माध्यम से एक परीक्षण भूमिका निर्धारित करना है ताकि उन्हें नकली उपयोगकर्ताओं के रूप में अलग किया जा सके।

परीक्षण के लिए reCAPTCHA प्रवाह को मैन्युअल रूप से ट्रिगर करने के लिए, forceRecaptchaFlowForTesting() विधि का उपयोग करें।

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

एकीकरण जांच

मैन्युअल परीक्षण के अलावा, फायरबेस प्रमाणीकरण फ़ोन प्रमाणीकरण परीक्षण के लिए एकीकरण परीक्षण लिखने में सहायता के लिए एपीआई प्रदान करता है। ये एपीआई वेब में रीकैप्चा आवश्यकता और आईओएस में साइलेंट पुश नोटिफिकेशन को अक्षम करके ऐप सत्यापन को अक्षम कर देते हैं। इससे इन प्रवाहों में स्वचालन परीक्षण संभव हो जाता है और कार्यान्वयन आसान हो जाता है। इसके अलावा, वे एंड्रॉइड पर त्वरित सत्यापन प्रवाह का परीक्षण करने की क्षमता प्रदान करने में सहायता करते हैं।

एंड्रॉइड पर, signInWithPhoneNumber कॉल से पहले setAppVerificationDisabledForTesting() कॉल करें। यह ऐप सत्यापन को स्वचालित रूप से अक्षम कर देता है, जिससे आप फ़ोन नंबर को मैन्युअल रूप से हल किए बिना पास कर सकते हैं। भले ही Play Integrity और reCAPTCHA अक्षम हैं, वास्तविक फ़ोन नंबर का उपयोग करने पर भी साइन इन पूरा नहीं हो पाएगा। इस API के साथ केवल काल्पनिक फ़ोन नंबरों का उपयोग किया जा सकता है।

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

किसी काल्पनिक नंबर के साथ verifyPhoneNumber पर कॉल करने से onCodeSent कॉलबैक ट्रिगर हो जाता है, जिसमें आपको संबंधित सत्यापन कोड प्रदान करना होगा। यह एंड्रॉइड एमुलेटर में परीक्षण की अनुमति देता है।

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(@NonNull String verificationId,
                                   @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
    .setPhoneNumber(phoneNum)
    .setTimeout(30L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onCodeSent(
            verificationId: String,
            forceResendingToken: PhoneAuthProvider.ForceResendingToken,
        ) {
            // Save the verification id somewhere
            // ...

            // The corresponding whitelisted code above should be used to complete sign-in.
            this@MainActivity.enableUserManuallyInputCode()
        }

        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
            // Sign in with the credential
            // ...
        }

        override fun onVerificationFailed(e: FirebaseException) {
            // ...
        }
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

इसके अतिरिक्त, आप setAutoRetrievedSmsCodeForPhoneNumber पर कॉल करके ऑटो-पुनर्प्राप्ति के लिए काल्पनिक संख्या और उसके संबंधित सत्यापन कोड को सेट करके एंड्रॉइड में ऑटो-पुनर्प्राप्ति प्रवाह का परीक्षण कर सकते हैं।

जब verifyPhoneNumber कॉल किया जाता है, तो यह सीधे PhoneAuthCredential के साथ onVerificationCompleted ट्रिगर करता है। यह केवल काल्पनिक फ़ोन नंबरों के साथ काम करता है।

Google Play स्टोर पर अपना एप्लिकेशन प्रकाशित करते समय सुनिश्चित करें कि यह अक्षम है और आपके ऐप में कोई काल्पनिक फ़ोन नंबर हार्डकोड नहीं किया गया है।

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin+KTX

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // Instant verification is applied and a credential is directly returned.
            // ...
        }

        // ...
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

अगले कदम

किसी उपयोगकर्ता द्वारा पहली बार साइन इन करने के बाद, एक नया उपयोगकर्ता खाता बनाया जाता है और क्रेडेंशियल्स से लिंक किया जाता है - यानी, उपयोगकर्ता नाम और पासवर्ड, फोन नंबर, या ऑथ प्रदाता जानकारी - जिस उपयोगकर्ता के साथ साइन इन किया जाता है। यह नया खाता आपके फायरबेस प्रोजेक्ट के हिस्से के रूप में संग्रहीत है, और इसका उपयोग आपके प्रोजेक्ट के प्रत्येक ऐप में उपयोगकर्ता की पहचान करने के लिए किया जा सकता है, भले ही उपयोगकर्ता कैसे भी साइन इन करता हो।

  • अपने ऐप्स में, आप FirebaseUser ऑब्जेक्ट से उपयोगकर्ता की मूल प्रोफ़ाइल जानकारी प्राप्त कर सकते हैं। उपयोगकर्ता प्रबंधित करें देखें.

  • अपने फायरबेस रीयलटाइम डेटाबेस और क्लाउड स्टोरेज सुरक्षा नियमों में, आप साइन-इन किए गए उपयोगकर्ता की अद्वितीय उपयोगकर्ता आईडी को auth वेरिएबल से प्राप्त कर सकते हैं, और इसका उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि उपयोगकर्ता किस डेटा तक पहुंच सकता है।

आप किसी मौजूदा उपयोगकर्ता खाते से प्रमाणीकरण प्रदाता क्रेडेंशियल्स को लिंक करके उपयोगकर्ताओं को एकाधिक प्रमाणीकरण प्रदाताओं का उपयोग करके अपने ऐप में साइन इन करने की अनुमति दे सकते हैं।

किसी उपयोगकर्ता को साइन आउट करने के लिए, signOut पर कॉल करें:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();