फ़ोन नंबर का इस्तेमाल करके Android पर Firebase की मदद से पुष्टि करें

आप उपयोगकर्ता के फ़ोन पर मैसेज (एसएमएस) भेजकर साइन इन करने के लिए Firebase से पुष्टि करने की सुविधा का इस्तेमाल कर सकते हैं. उपयोगकर्ता, एसएमएस मैसेज में मौजूद एक बार इस्तेमाल होने वाले कोड का इस्तेमाल करके साइन इन करता है.

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

वेब कंटेनर इंस्टॉल करने से पहले

  1. अगर आपने पहले से Firebase को नहीं जोड़ा है, तो अपने Android प्रोजेक्ट में Firebase जोड़ें.
  2. अपने मॉड्यूल (ऐप्लिकेशन-लेवल) की Gradle फ़ाइल (आम तौर पर, <project>/<app-module>/build.gradle.kts या <project>/<app-module>/build.gradle) में, Android के लिए Firebase से पुष्टि करने वाली लाइब्रेरी के लिए डिपेंडेंसी जोड़ें. लाइब्रेरी के वर्शन को कंट्रोल करने के लिए, हम Firebase Android BoM का इस्तेमाल करने का सुझाव देते हैं.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.1.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")
    }
    

    Firebase Android BoM का इस्तेमाल करने पर, आपका ऐप्लिकेशन हमेशा Firebase की Android लाइब्रेरी के साथ काम करने वाले वर्शन का इस्तेमाल करेगा.

    (वैकल्पिक) BoM का इस्तेमाल किए बिना Firebase लाइब्रेरी डिपेंडेंसी जोड़ें

    अगर आप Firebase BoM का इस्तेमाल नहीं करना चाहते हैं, तो आपको उसकी डिपेंडेंसी लाइन में Firebase लाइब्रेरी के हर वर्शन की जानकारी देनी होगी.

    ध्यान दें कि अगर आप अपने ऐप्लिकेशन में कई Firebase लाइब्रेरी का इस्तेमाल करते हैं, तो हमारा सुझाव है कि लाइब्रेरी के वर्शन मैनेज करने के लिए, 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:23.0.0")
    }
    
    क्या आपको Kotlin से जुड़े लाइब्रेरी मॉड्यूल की तलाश है? अक्टूबर 2023 (Firebase BoM 32.5.0) से, Kotlin और Java डेवलपर, दोनों मुख्य लाइब्रेरी मॉड्यूल पर निर्भर कर सकते हैं. ज़्यादा जानकारी के लिए, इस इनिशिएटिव के बारे में अक्सर पूछे जाने वाले सवाल देखें.
  3. अगर आपने अभी तक अपने ऐप्लिकेशन को Firebase प्रोजेक्ट से कनेक्ट नहीं किया है, तो Firebase कंसोल से ऐसा करें.
  4. अगर आपने Firebase कंसोल में पहले से अपने ऐप्लिकेशन के SHA-1 हैश को सेट नहीं किया है, तो ऐसा करें. अपने ऐप्लिकेशन का SHA-1 हैश खोजने के बारे में जानने के लिए, अपने क्लाइंट की पुष्टि करना देखें.

सुरक्षा से जुड़ी समस्याएं

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

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

अपने Firebase प्रोजेक्ट के लिए, फ़ोन नंबर से साइन-इन करने की सुविधा चालू करना

उपयोगकर्ताओं को एसएमएस से साइन इन करने के लिए, आपको सबसे पहले अपने Firebase प्रोजेक्ट के लिए, फ़ोन नंबर से साइन इन करने का तरीका चालू करना होगा:

  1. Firebase कंसोल में, पुष्टि करने की सुविधा वाला सेक्शन खोलें.
  2. साइन इन करने का तरीका पेज पर, फ़ोन नंबर से साइन इन करने का तरीका चालू करें.

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

ऐप्लिकेशन की पुष्टि करने की सुविधा चालू करें

फ़ोन नंबर की पुष्टि करने की सुविधा का इस्तेमाल करने के लिए, Firebase को यह पुष्टि करनी होगी कि फ़ोन नंबर से साइन-इन करने के अनुरोध आपके ऐप्लिकेशन से आ रहे हैं. ऐसा तीन तरीकों से Firebase से पुष्टि करने के लिए किया जा सकता है:

  • Play Integrity API: अगर किसी उपयोगकर्ता के पास Google Play services वाला डिवाइस है और Firebase से पुष्टि करने की सुविधा, Play Integrity API की मदद से, डिवाइस की पुष्टि कर सकती है, तो फ़ोन नंबर से साइन-इन किया जा सकता है. Play Integrity API, Google के मालिकाना हक वाले प्रोजेक्ट पर, Firebase से पुष्टि करने की सुविधा से चालू होता है, न कि आपके प्रोजेक्ट पर. इससे आपके प्रोजेक्ट के लिए, Play Integrity API का कोई कोटा नहीं बढ़ता. Play Integrity से जुड़ी सहायता, Authentication SDK v21.2.0+ (Firebase BoM v31.4.0+) के साथ उपलब्ध है.

    अगर आपने अब तक अपने ऐप्लिकेशन के SHA-256 फ़िंगरप्रिंट की जानकारी नहीं दी है, तो Play Integrity का इस्तेमाल करने के लिए, Firebase कंसोल की प्रोजेक्ट सेटिंग का इस्तेमाल करें. अपने ऐप्लिकेशन का SHA-256 फ़िंगरप्रिंट पाने का तरीका जानने के लिए, अपने क्लाइंट की पुष्टि करना देखें.

  • re कैप्चा की पुष्टि करना: अगर Play Integrity का इस्तेमाल नहीं किया जा सकता, तो किसी उपयोगकर्ता के पास Google Play services बिना इंस्टॉल होने पर, फ़ोन में साइन इन की प्रोसेस को पूरा करने के लिए reCAPTCHA की पुष्टि करने की सुविधा का इस्तेमाल किया जाता है. reCAPTCHA की चुनौती को पूरा करने के लिए, उपयोगकर्ता को अपनी समस्या हल करने की ज़रूरत नहीं होती. ध्यान दें कि इस फ़्लो के लिए ज़रूरी है कि आपके ऐप्लिकेशन से SHA-1 जुड़ा हो. इस फ़्लो के लिए यह भी ज़रूरी है कि आपका एपीआई पासकोड, PROJECT_ID.firebaseapp.com के लिए बिना पाबंदी के या अनुमति वाली सूची में शामिल हो.

    कुछ मामलों में reCAPTCHA ट्रिगर होता है:

    • अगर असली उपयोगकर्ता के डिवाइस पर Google Play services इंस्टॉल नहीं है.
    • अगर ऐप्लिकेशन को Google Play Store से (Authentication SDK v21.2.0+) पर डिस्ट्रिब्यूट नहीं किया गया है.
    • अगर मिला SafetyNet टोकन मान्य नहीं था (पुष्टि करने वाले SDK टूल के वर्शन < v21.2.0 पर).

    जब ऐप्लिकेशन की पुष्टि करने के लिए SafetyNet या Play Integrity का इस्तेमाल किया जाता है, तो एसएमएस टेंप्लेट में मौजूद %APP_NAME% फ़ील्ड में, Google Play Store से मिले ऐप्लिकेशन के नाम का डेटा अपने-आप भर जाता है. reCAPTCHA के ट्रिगर होने पर, %APP_NAME% की जानकारी PROJECT_ID.firebaseapp.com के तौर पर अपने-आप भर जाती है.

forceRecaptchaFlowForTesting की मदद से, reCAPTCHA की पुष्टि की प्रक्रिया को हर हाल में बंद किया जा सकता है. setAppVerificationDisabledForTesting का इस्तेमाल करके, ऐप्लिकेशन की पुष्टि की सुविधा (अगर काल्पनिक फ़ोन नंबर इस्तेमाल किए जा रहे हों) को बंद किया जा सकता है.

समस्या हल करना

  • ऐप्लिकेशन की पुष्टि के लिए reCAPTCHA का इस्तेमाल करते समय, "शुरुआती स्थिति मौजूद नहीं है" वाली गड़बड़ी

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

उपयोगकर्ता के फ़ोन पर पुष्टि करने के लिए कोड भेजें

फ़ोन नंबर से साइन-इन करने के लिए, उपयोगकर्ता को ऐसा इंटरफ़ेस दिखाएं जो उसे फ़ोन नंबर लिखने के लिए कहता हो. कानूनी समझौते की शर्तें अलग-अलग हो सकती हैं. हालांकि, सबसे सही तरीका यह है कि अपने उपयोगकर्ताओं के लिए उम्मीदें तय करने के लिए, उन्हें यह जानकारी दी जानी चाहिए कि अगर वे फ़ोन से साइन-इन की सुविधा इस्तेमाल करते हैं, तो उन्हें पुष्टि के लिए एक मैसेज (एसएमएस) मिल सकता है. साथ ही, उन्हें पुष्टि करने के लिए एक एसएमएस मिल सकता है. साथ ही, आपको सामान्य दरें लागू होंगी.

इसके बाद, 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 तरीके पर पास करें. ऐक्टिविटी के बंद होने पर, कॉलबैक अपने-आप डिटैच हो जाएंगे, ताकि कॉलबैक के तरीकों में, यूज़र इंटरफ़ेस (यूआई) ट्रांज़िशन कोड आसानी से लिखा जा सके.

Firebase से भेजे गए एसएमएस को स्थानीय भाषा में भी भेजा जा सकता है. ऐसा करने के लिए, आपको अपने ऑथराइज़ेशन इंस्टेंस में 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 भी लागू किया जा सकता है.

पुष्टि की प्रोसेस पूरी हुई(PhoneAuthCredential)

इस तरीके को दो स्थितियों में कॉल किया जाता है:

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

onपुष्टि करने में कोई गड़बड़ी नहीं होती(Firebaseअपवाद)

इस तरीके को पुष्टि के किसी अमान्य अनुरोध के जवाब में कॉल किया जाता है. उदाहरण के लिए, ऐसा अनुरोध जिसमें अमान्य फ़ोन नंबर या पुष्टि करने के लिए कोड दिया गया हो.

onCodeSent(String verificationId, PhoneAuthProvider.Forceस्तरingToken)

ज़रूरी नहीं. दिए गए फ़ोन नंबर पर एसएमएस के ज़रिए पुष्टि करने के लिए कोड भेजे जाने के बाद, यह तरीका कॉल किया जाता है.

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

onCodeAutoRetrievalTimeOut(स्ट्रिंग की पुष्टि करने वाला आईडी)

ज़रूरी नहीं. यह तरीका तब कॉल किया जाता है, जब verifyPhoneNumber को दी गई टाइम आउट की अवधि खत्म हो गई हो और onVerificationCompleted पहले ट्रिगर न हो. बिना सिम कार्ड वाले डिवाइसों पर, इस तरीके को तुरंत कॉल कर दिया जाता है, क्योंकि एसएमएस अपने-आप वापस नहीं मिल सकता.

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

PhoneAuthक्रेडेंशियल ऑब्जेक्ट बनाएं

जब उपयोगकर्ता, उपयोगकर्ता के फ़ोन पर Firebase से भेजा गया पुष्टि करने वाला कोड डालता है, तब एक 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
                        }
                    }
                }
            });
}

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

Firebase कंसोल के ज़रिए, डेवलपमेंट के लिए काल्पनिक फ़ोन नंबर सेट अप किए जा सकते हैं. काल्पनिक फ़ोन नंबरों के साथ टेस्ट करने के ये फ़ायदे हैं:

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

काल्पनिक फ़ोन नंबर इन शर्तों के मुताबिक होने चाहिए:

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

काल्पनिक फ़ोन नंबर और पुष्टि करने के लिए कोड बनाएं

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

मैन्युअल तरीके से जांच करने की सुविधा

अपने ऐप्लिकेशन में, किसी काल्पनिक फ़ोन नंबर का इस्तेमाल सीधे तौर पर शुरू किया जा सकता है. इससे, डेवलपमेंट स्टेज के दौरान मैन्युअल तरीके से जांच की जा सकती है. इसके लिए, कोटा की समस्याओं या थ्रॉटलिंग की ज़रूरत नहीं पड़ती. Google Play services को इंस्टॉल किए बिना भी, सीधे iOS सिम्युलेटर या Android Emulator से भी जांच की जा सकती है.

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

साइन-इन पूरा होने पर, उस फ़ोन नंबर से एक Firebase उपयोगकर्ता बन जाता है. इस उपयोगकर्ता का व्यवहार और प्रॉपर्टी बिलकुल असली फ़ोन नंबर इस्तेमाल करने वाले व्यक्ति की तरह ही होती हैं और वह रीयलटाइम डेटाबेस/Cloud Firestore और दूसरी सेवाओं को भी इसी तरह ऐक्सेस कर सकता है. इस प्रोसेस के दौरान बनाए गए आईडी टोकन का हस्ताक्षर वही होता है जो फ़ोन नंबर इस्तेमाल करने वाले किसी व्यक्ति का होता है.

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

जांच के लिए, reCAPTCHA फ़्लो को मैन्युअल तरीके से ट्रिगर करने के लिए, forceRecaptchaFlowForTesting() तरीका इस्तेमाल करें.

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

इंटिग्रेशन की जांच करना

मैन्युअल तरीके से टेस्ट करने के अलावा, Firebase से पुष्टि करने की सुविधा में एपीआई भी उपलब्ध कराए जाते हैं, ताकि फ़ोन की पुष्टि करने की जांच के लिए इंटिग्रेशन टेस्ट लिखने में मदद मिल सके. ये एपीआई, iOS में वेब में reCAPTCHA की ज़रूरत और साइलेंट पुश नोटिफ़िकेशन को बंद करके, ऐप्लिकेशन की पुष्टि को बंद कर देते हैं. इससे इन फ़्लो में, ऑटोमेशन की जांच की जा सकती है. साथ ही, इसे लागू करना भी आसान होता है. इसके अलावा, इनसे Android पर तुरंत पुष्टि करने की प्रक्रिया की जांच करने की सुविधा भी मिलती है.

Android पर, signInWithPhoneNumber कॉल से पहले setAppVerificationDisabledForTesting() पर कॉल करें. इससे ऐप्लिकेशन की पुष्टि अपने-आप बंद हो जाती है, जिससे आप मैन्युअल तरीके से हल किए बिना फ़ोन नंबर पास कर सकते हैं. Play Integrity और reCAPTCHA की सुविधा बंद होने पर भी, किसी असली फ़ोन नंबर से साइन इन करने की सुविधा नहीं मिलेगी. इस एपीआई के साथ सिर्फ़ काल्पनिक फ़ोन नंबर इस्तेमाल किए जा सकते हैं.

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

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

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)

इसके अलावा, अपने-आप वापस पाने के फ़्लो की जांच Android में की जा सकती है. इसके लिए, आपको setAutoRetrievedSmsCodeForPhoneNumber पर कॉल करके, काल्पनिक नंबर और उससे जुड़ा पुष्टि करने वाला कोड सेट करना होगा.

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

पक्का करें कि यह बंद हो और Google Play Store पर अपना ऐप्लिकेशन पब्लिश करते समय, ऐप्लिकेशन में किसी भी काल्पनिक फ़ोन नंबर को हार्डकोड न किया गया हो.

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)

अगले चरण

जब कोई उपयोगकर्ता पहली बार साइन इन करता है, तो एक नया उपयोगकर्ता खाता बनाया जाता है और उपयोगकर्ता के क्रेडेंशियल से लिंक किया जाता है. इन क्रेडेंशियल में उपयोगकर्ता नाम और पासवर्ड, फ़ोन नंबर या पुष्टि करने वाली सेवा की जानकारी शामिल है. यह नया खाता आपके Firebase प्रोजेक्ट के हिस्से के तौर पर सेव किया जाता है. साथ ही, इसका इस्तेमाल आपके प्रोजेक्ट के हर ऐप्लिकेशन में किसी उपयोगकर्ता की पहचान करने के लिए किया जा सकता है. भले ही, उपयोगकर्ता ने किसी भी तरह से साइन इन किया हो.

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

  • अपने Firebase रीयल टाइम डेटाबेस और Cloud Storage के सुरक्षा नियमों में, auth वैरिएबल से साइन-इन किए हुए उपयोगकर्ता का यूनीक यूज़र आईडी पाया जा सकता है और उसका इस्तेमाल करके यह कंट्रोल किया जा सकता है कि उपयोगकर्ता कौनसा डेटा ऐक्सेस कर सकता है.

आप पुष्टि करने वाली सेवा देने वाली कंपनियों के क्रेडेंशियल को किसी मौजूदा उपयोगकर्ता खाते से लिंक करके, उपयोगकर्ताओं को अपने ऐप्लिकेशन में साइन इन करने की अनुमति दे सकते हैं.

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();