Firebase Authentication की मदद से, उपयोगकर्ता के फ़ोन पर एसएमएस भेजकर उसे साइन इन कराया जा सकता है. उपयोगकर्ता, एसएमएस में मौजूद एक बार इस्तेमाल किया जा सकने वाला कोड डालकर साइन इन करता है.
अपने ऐप्लिकेशन में फ़ोन नंबर से साइन इन करने की सुविधा जोड़ने का सबसे आसान तरीका है FirebaseUI का इस्तेमाल करना. इसमें, साइन इन करने का एक विजेट शामिल होता है. इसकी मदद से, फ़ोन नंबर, पासवर्ड, और फ़ेडरेटेड साइन-इन के लिए, साइन-इन फ़्लो लागू किए जा सकते हैं. इस दस्तावेज़ में, Firebase SDK का इस्तेमाल करके, फ़ोन नंबर से साइन-इन फ़्लो लागू करने का तरीका बताया गया है.
शुरू करने से पहले
- अगर आपने पहले से ही, अपने Android प्रोजेक्ट में Firebase नहीं जोड़ा है.
-
अपने मॉड्यूल (ऐप्लिकेशन-लेवल) की 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:34.12.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 लाइब्रेरी की डिपेंडेंसी जोड़नाBoM
अगर Firebase BoM का इस्तेमाल नहीं किया जाता है, तो आपको हर Firebase लाइब्रेरी का वर्शन उसकी डिपेंडेंसी लाइन में बताना होगा.
ध्यान दें कि अगर आपके ऐप्लिकेशन में Firebase की एक से ज़्यादा लाइब्रेरी इस्तेमाल की जाती हैं, तो हमारा सुझाव है कि लाइब्रेरी के वर्3/} मैनेज करने के लिए 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:24.0.1") }
- अगर आपने अब तक अपने ऐप्लिकेशन को Firebase प्रोजेक्ट से कनेक्ट नहीं किया है, तो Firebase कंसोल से ऐसा करें.
- अगर आपने Firebase कंसोल में अपने ऐप्लिकेशन का SHA-1 हैश अब तक सेट नहीं किया है, तो ऐसा करें. अपने ऐप्लिकेशन का SHA-1 हैश ढूंढने के बारे में जानकारी के लिए, क्लाइंट की पुष्टि करना लेख पढ़ें.
सुरक्षा से जुड़ी चिंताएं
सिर्फ़ फ़ोन नंबर का इस्तेमाल करके पुष्टि करना, सुविधाजनक तो है, लेकिन यह उपलब्ध अन्य तरीकों की तुलना में कम सुरक्षित है. ऐसा इसलिए, क्योंकि फ़ोन नंबर का मालिकाना हक आसानी से एक उपयोगकर्ता से दूसरे उपयोगकर्ता को ट्रांसफ़र किया जा सकता है. इसके अलावा, एक से ज़्यादा उपयोगकर्ता प्रोफ़ाइल वाले डिवाइसों पर, एसएमएस पाने वाला कोई भी उपयोगकर्ता, डिवाइस के फ़ोन नंबर का इस्तेमाल करके किसी खाते में साइन इन कर सकता है.
अगर आपके ऐप्लिकेशन में फ़ोन नंबर के आधार पर साइन-इन करने की सुविधा है, तो आपको इसे ज़्यादा सुरक्षित साइन-इन तरीकों के साथ उपलब्ध कराना चाहिए. साथ ही, उपयोगकर्ताओं को फ़ोन नंबर से साइन-इन करने की सुविधा इस्तेमाल करने के सुरक्षा से जुड़े नुकसान के बारे में बताना चाहिए.
अपने Firebase प्रोजेक्ट के लिए, फ़ोन नंबर से साइन-इन करने की सुविधा चालू करना
एसएमएस की मदद से उपयोगकर्ताओं को साइन इन कराने के लिए, आपको सबसे पहले अपने Firebase प्रोजेक्ट के लिए, फ़ोन नंबर से साइन-इन करने का तरीका चालू करना होगा:
- Firebase कंसोल में, पुष्टि सेक्शन खोलें.
- साइन-इन करने का तरीका पेज पर, फ़ोन नंबर से साइन-इन करने का तरीका चालू करें.
- सेटिंग पेज पर, उन इलाकों के लिए नीति सेट करें जहां एसएमएस भेजने की अनुमति देनी है या नहीं. नए प्रोजेक्ट के लिए, डिफ़ॉल्ट नीति के तहत किसी भी इलाके में एसएमएस भेजने की अनुमति नहीं होती.
ऐप्लिकेशन की पुष्टि करने की सुविधा चालू करना
फ़ोन नंबर से पुष्टि करने की सुविधा का इस्तेमाल करने के लिए, Firebase को यह पुष्टि करनी होगी कि फ़ोन नंबर से साइन-इन करने के अनुरोध, आपके ऐप्लिकेशन से आ रहे हैं. Firebase Authentication, यह पुष्टि तीन तरीकों से करता है: Firebase Authentication
- Play Integrity API: अगर किसी उपयोगकर्ता के डिवाइस में Google Play services इंस्टॉल है और Firebase Authentication Play Integrity API की मदद से यह पुष्टि कर सकता है कि डिवाइस असली है, तो फ़ोन नंबर से साइन-इन किया जा सकता है. Play Integrity API, Google के मालिकाना हक वाले प्रोजेक्ट पर
Firebase Authentication की मदद से चालू किया जाता है. यह आपके प्रोजेक्ट पर चालू नहीं किया जाता. इससे आपके प्रोजेक्ट पर, Play Integrity API
के किसी भी कोटे पर कोई असर नहीं पड़ता. Authentication SDK के 21.2.0 या इसके बाद के वर्शन (Firebase BoM के 31.4.0 या इसके बाद के वर्शन) के साथ, Play Integrity की सुविधा उपलब्ध है.Authentication
Play Integrity का इस्तेमाल करने के लिए, अगर आपने अब तक अपने ऐप्लिकेशन का SHA-256 फ़िंगरप्रिंट नहीं बताया है, तो प्रोजेक्ट सेटिंग्ज़ में जाकर ऐसा करें. Firebase कंसोल. अपने ऐप्लिकेशन का SHA-256 फ़िंगरप्रिंट पाने के तरीके के बारे में जानने के लिए, क्लाइंट की पुष्टि करना लेख पढ़ें.
- reCAPTCHA से पुष्टि करना: अगर Play Integrity का इस्तेमाल नहीं किया जा सकता है, तो Firebase Authentication, reCAPTCHA से पुष्टि करने की सुविधा का इस्तेमाल करके, फ़ोन नंबर से साइन-इन करने की प्रोसेस पूरी करता है. उदाहरण के लिए, अगर किसी उपयोगकर्ता के डिवाइस में इंस्टॉलGoogle Play services Firebase Authentication
नहीं है. अक्सर, reCAPTCHA चैलेंज को उपयोगकर्ता को कुछ भी हल किए बिना पूरा किया जा सकता है. ध्यान दें कि इस फ़्लो के लिए,
आपके ऐप्लिकेशन से SHA-1 जुड़ा होना ज़रूरी है. इस फ़्लो के लिए, आपकी एपीआई पासकोड पर कोई पाबंदी नहीं होनी चाहिए या इसे
अनुमति वाली सूची में शामिल किया जाना चाहिए
PROJECT_ID.firebaseapp.com.कुछ ऐसे मामले जहां reCAPTCHA ट्रिगर होता है:
- अगर एंड-यूज़र के डिवाइस में Google Play services इंस्टॉल नहीं है.
- अगर ऐप्लिकेशन, Google Play Store के ज़रिए डिस्ट्रिब्यूट नहीं किया जाता है (Authentication SDK के 21.2.0 या इसके बाद के वर्शन पर).
- अगर SafetyNet से मिला टोकन मान्य नहीं था (Authentication SDK के < 21.2.0 वर्शन पर).
ऐप्लिकेशन की पुष्टि के लिए SafetyNet या Play Integrity का इस्तेमाल करने पर, एसएमएस टेंप्लेट में मौजूद
%APP_NAME%फ़ील्ड में, Google Play Store से तय किया गया ऐप्लिकेशन का नाम भर दिया जाता है. ऐसे मामलों में जहां reCAPTCHA ट्रिगर होता है,%APP_NAME%मेंPROJECT_ID.firebaseapp.comभर दिया जाता है.
forceRecaptchaFlowForTesting
वहीं, `setAppVerificationDisabledForTesting` का इस्तेमाल करके, ऐप्लिकेशन की पुष्टि करने की सुविधा बंद की जा सकती है. ऐसा तब किया जा सकता है, जब टेस्ट के लिए काल्पनिक फ़ोन नंबर इस्तेमाल किए जा रहे हों.
setAppVerificationDisabledForTesting.
समस्या का हल
ऐप्लिकेशन की पुष्टि के लिए reCAPTCHA का इस्तेमाल करने पर, "Missing initial state" गड़बड़ी
ऐसा तब हो सकता है, जब reCAPTCHA फ़्लो सही तरीके से पूरा हो जाए, लेकिन उपयोगकर्ता को वापस नेटिव ऐप्लिकेशन पर रीडायरेक्ट न किया जाए. ऐसा होने पर, उपयोगकर्ता को फ़ॉलबैक यूआरएल
PROJECT_ID.firebaseapp.com/__/auth/handlerपर रीडायरेक्ट किया जाता है. Firefox ब्राउज़र पर, नेटिव ऐप्लिकेशन के लिंक खोलने की सुविधा डिफ़ॉल्ट रूप से बंद होती है. अगर आपको Firefox पर ऊपर बताई गई गड़बड़ी दिखती है, तो ऐप्लिकेशन के लिंक खोलने की सुविधा चालू करने के लिए, Android के लिए Firefox को नेटिव ऐप्लिकेशन में लिंक खोलने के लिए सेट अप करना लेख में दिया गया तरीका अपनाएं.
उपयोगकर्ता के फ़ोन पर पुष्टि करने के लिए कोड भेजना
फ़ोन नंबर से साइन-इन करने की प्रोसेस शुरू करने के लिए, उपयोगकर्ता को एक ऐसा इंटरफ़ेस दिखाएं जिसमें उससे अपना फ़ोन नंबर डालने के लिए कहा जाए. कानूनी ज़रूरतें अलग-अलग हो सकती हैं. हालांकि, सबसे सही तरीका यह है कि उपयोगकर्ताओं को यह बताया जाए कि अगर वे फ़ोन नंबर से साइन-इन करते हैं, तो उन्हें पुष्टि के लिए एसएमएस मिल सकता है. साथ ही, उन पर सामान्य शुल्क लागू होंगे. ऐसा करने से, उपयोगकर्ताओं को इस बारे में जानकारी मिल जाएगी.
इसके बाद, उनका फ़ोन नंबर PhoneAuthProvider.verifyPhoneNumber तरीके को पास करें, ताकि Firebase से उपयोगकर्ता के फ़ोन नंबर की पुष्टि करने का अनुरोध किया जा सके. उदाहरण के लिए:
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 ऑब्जेक्ट मिलने के बाद, साइन-इन फ़्लो पूरा करें. इसके लिए, PhoneAuthCredential ऑब्जेक्ट को FirebaseAuth.signInWithCredential में पास करें. यह ऑब्जेक्ट, onVerificationCompleted कॉलबैक में या PhoneAuthProvider.getCredential को कॉल करके मिलता है:
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 एम्युलेटर में डेवलप करने की सुविधा.
- प्रोडक्शन एनवायरमेंट में, असल फ़ोन नंबरों पर आम तौर पर लागू होने वाली सुरक्षा जांचों से ब्लॉक हुए बिना, इंटिग्रेशन टेस्ट लिखना.
काल्पनिक फ़ोन नंबरों के लिए ये शर्तें पूरी होनी चाहिए:
- पक्का करें कि आपने ऐसे फ़ोन नंबर इस्तेमाल किए हों जो वाकई काल्पनिक हों और पहले से मौजूद न हों. Firebase Authentication आपको टेस्ट नंबर के तौर पर, असल उपयोगकर्ताओं के इस्तेमाल किए जा रहे मौजूदा फ़ोन नंबर सेट करने की अनुमति नहीं देता. एक विकल्प यह है कि अमेरिका में टेस्ट के लिए, 555 से शुरू होने वाले फ़ोन नंबरों का इस्तेमाल किया जाए. उदाहरण के लिए: +1 650-555-3434
- फ़ोन नंबर, लंबाई और अन्य पाबंदियों के लिए सही फ़ॉर्मैट में होने चाहिए. इनकी पुष्टि भी, असल उपयोगकर्ता के फ़ोन नंबर की तरह ही की जाएगी.
- डेवलपमेंट के लिए, ज़्यादा से ज़्यादा 10 फ़ोन नंबर जोड़े जा सकते हैं.
- ऐसे टेस्ट फ़ोन नंबर/कोड इस्तेमाल करें जिनका अनुमान लगाना मुश्किल हो. साथ ही, इन्हें बार-बार बदलें.
काल्पनिक फ़ोन नंबर और पुष्टि कोड बनाना
- Firebase कंसोल में, पुष्टि सेक्शन खोलें.
- साइन-इन करने का तरीका टैब में, अगर आपने पहले से फ़ोन नंबर से साइन-इन करने की सुविधा चालू नहीं की है, तो इसे चालू करें.
- टेस्ट के लिए फ़ोन नंबर वाला अकॉर्डियन मेन्यू खोलें.
- वह फ़ोन नंबर डालें जिसे आपको टेस्ट करना है. उदाहरण के लिए: +1 650-555-3434.
- उस नंबर के लिए, छह अंकों का पुष्टि कोड डालें. उदाहरण के लिए: 654321.
- नंबर जोड़ें. अगर ज़रूरत हो, तो फ़ोन नंबर और उसके कोड को मिटाया जा सकता है. इसके लिए, उससे जुड़ी लाइन पर कर्सर घुमाएं और ट्रैश आइकॉन पर क्लिक करें.
मैन्युअल टेस्टिंग
अपने ऐप्लिकेशन में, काल्पनिक फ़ोन नंबर का इस्तेमाल सीधे तौर पर शुरू किया जा सकता है. इससे, डेवलपमेंट के दौरान मैन्युअल टेस्टिंग की जा सकती है. इसके लिए, कोटे से जुड़ी समस्याओं या थ्रॉटलिंग का सामना नहीं करना पड़ेगा. Google Play Services इंस्टॉल किए बिना, iOS सिम्युलेटर या Android एम्युलेटर से भी सीधे टेस्ट किया जा सकता है.
काल्पनिक फ़ोन नंबर डालने और पुष्टि कोड भेजने पर, असल एसएमएस नहीं भेजा जाता. इसके बजाय, साइन इन करने के लिए, पहले से कॉन्फ़िगर किया गया पुष्टि कोड डालना होगा.
साइन-इन पूरा होने पर, उस फ़ोन नंबर से 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 एम्युलेटर में टेस्ट किया जा सकता है.
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();