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

Firebase Authentication का इस्तेमाल करके, उपयोगकर्ता के फ़ोन पर एसएमएस भेजकर उसे साइन इन कराया जा सकता है. उपयोगकर्ता, एसएमएस में मिले वन-टाइम कोड का इस्तेमाल करके साइन इन करता है.

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

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

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

सुरक्षा से जुड़ी चिंताएं

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

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

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

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

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

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

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

  • Play Integrity API: अगर किसी उपयोगकर्ता के डिवाइस में Google Play services इंस्टॉल है और Firebase Authentication, Play Integrity API की मदद से यह पुष्टि कर सकता है कि डिवाइस सही है, तो फ़ोन नंबर से साइन-इन करने की प्रोसेस जारी रखी जा सकती है. Play Integrity API को Google के मालिकाना हक वाले प्रोजेक्ट पर Firebase Authentication ने चालू किया है, न कि आपके प्रोजेक्ट पर. इससे आपके प्रोजेक्ट पर Play Integrity API के किसी भी कोटे पर असर नहीं पड़ता. Play Integrity की सुविधा, Authentication SDK टूल के 21.2.0 या इसके बाद के वर्शन (Firebase BoM के 31.4.0 या इसके बाद के वर्शन) के साथ उपलब्ध है.

    Play Integrity का इस्तेमाल करने के लिए, अपने ऐप्लिकेशन का SHA-256 फ़िंगरप्रिंट डालें. ऐसा तब करें, जब आपने पहले से ऐसा न किया हो.

    1. Firebase कंसोल में, सेटिंग > सामान्य टैब पर जाएं.
    2. नीचे की ओर स्क्रोल करके, आपके ऐप्लिकेशन कार्ड पर जाएं. इसके बाद, अपना Android ऐप्लिकेशन चुनें और SHA सर्टिफ़िकेट फ़िंगरप्रिंट फ़ील्ड में अपना SHA-256 फ़िंगरप्रिंट जोड़ें.

    अपने ऐप्लिकेशन का SHA फ़िंगरप्रिंट पाने के तरीके के बारे में जानने के लिए, अपने क्लाइंट की पुष्टि करना देखें.

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

    यहां कुछ ऐसे उदाहरण दिए गए हैं जिनमें reCAPTCHA ट्रिगर होता है:

    • अगर असली उपयोगकर्ता के डिवाइस में Google Play services इंस्टॉल नहीं है.
    • अगर ऐप्लिकेशन को Google Play Store के ज़रिए डिस्ट्रिब्यूट नहीं किया जाता है (Authentication SDK v21.2.0+ पर).
    • अगर मिला हुआ SafetyNet टोकन मान्य नहीं था (Authentication 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

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 से भेजे गए एसएमएस को स्थानीय भाषा में भी भेजा जा सकता है. इसके लिए, अपने Auth इंस्टेंस पर setLanguageCode तरीके से, पुष्टि करने की भाषा तय करें.

Kotlin

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

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 services अपने-आप यह पता लगा सकती हैं कि पुष्टि के लिए भेजा गया मैसेज कब आया है. साथ ही, उपयोगकर्ता की कार्रवाई के बिना ही पुष्टि कर सकती हैं. (ऐसा हो सकता है कि मोबाइल और इंटरनेट सेवा देने वाली कुछ कंपनियों के साथ यह सुविधा उपलब्ध न हो.) यह SMS Retriever API का इस्तेमाल करता है. इसमें एसएमएस के आखिर में 11 वर्णों का हैश शामिल होता है.
दोनों ही मामलों में, उपयोगकर्ता के फ़ोन नंबर की पुष्टि हो गई है. साथ ही, उपयोगकर्ता को साइन इन कराने के लिए, कॉलबैक को पास किए गए PhoneAuthCredential ऑब्जेक्ट का इस्तेमाल किया जा सकता है.

onVerificationFailed(FirebaseException)

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

onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)

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

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

onCodeAutoRetrievalTimeOut(String verificationId)

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

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

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

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

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

Kotlin

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

Java

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

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

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

Kotlin

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 कंसोल का इस्तेमाल करें. काल्पनिक फ़ोन नंबर से जांच करने के ये फ़ायदे हैं:

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

काल्पनिक फ़ोन नंबरों को ये ज़रूरी शर्तें पूरी करनी होंगी:

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

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

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

मैन्युअल टेस्टिंग

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

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

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

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

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

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

इंटिग्रेशन टेस्टिंग

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

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

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

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

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

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

// 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 Realtime Database और Cloud Storage सुरक्षा नियमों में, साइन इन किए हुए उपयोगकर्ता का यूनीक यूज़र आईडी, auth वैरिएबल से पाया जा सकता है. साथ ही, इसका इस्तेमाल करके यह कंट्रोल किया जा सकता है कि उपयोगकर्ता कौनसा डेटा ऐक्सेस कर सकता है.

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

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

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();