फ़ोन प्रमाणीकरण

फ़ोन प्रमाणीकरण उपयोगकर्ताओं को प्रमाणक के रूप में अपने फ़ोन का उपयोग करके फायरबेस में साइन इन करने की अनुमति देता है। उपयोगकर्ता को एक एसएमएस संदेश भेजा जाता है (प्रदान किए गए फोन नंबर का उपयोग करके) जिसमें एक अद्वितीय कोड होता है। एक बार कोड अधिकृत हो जाने के बाद, उपयोगकर्ता फायरबेस में साइन इन करने में सक्षम होता है।

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

फायरबेस फोन प्रमाणीकरण सभी देशों में समर्थित नहीं है। अधिक जानकारी के लिए कृपया उनके अक्सर पूछे जाने वाले प्रश्न देखें।

स्थापित करना

फ़ोन प्रमाणीकरण शुरू करने से पहले, सुनिश्चित करें कि आपने इन चरणों का पालन किया है:

  1. फ़ायरबेस कंसोल में फ़ोन को साइन-इन विधि के रूप में सक्षम करें।
  2. एंड्रॉइड : यदि आपने फायरबेस कंसोल में अपने ऐप का SHA-1 हैश पहले से सेट नहीं किया है, तो ऐसा करें। अपने ऐप के SHA-1 हैश को ढूंढने के बारे में जानकारी के लिए अपने क्लाइंट को प्रमाणित करना देखें।
  3. आईओएस : एक्सकोड में, अपने प्रोजेक्ट के लिए पुश नोटिफिकेशन सक्षम करें और सुनिश्चित करें कि आपकी एपीएन प्रमाणीकरण कुंजी फायरबेस क्लाउड मैसेजिंग (एफसीएम) के साथ कॉन्फ़िगर की गई है। इसके अतिरिक्त, आपको दूरस्थ सूचनाओं के लिए पृष्ठभूमि मोड सक्षम करना होगा। इस चरण की गहन व्याख्या देखने के लिए, फायरबेस iOS फ़ोन प्रामाणिक दस्तावेज़ देखें।
  4. वेब : सुनिश्चित करें कि आपने अपने एप्लिकेशन डोमेन को OAuth रीडायरेक्ट डोमेन के अंतर्गत फायरबेस कंसोल पर जोड़ा है।

टिप्पणी ; फ़ोन नंबर साइन-इन केवल वास्तविक उपकरणों और वेब पर उपयोग के लिए उपलब्ध है। डिवाइस एमुलेटर पर अपने प्रमाणीकरण प्रवाह का परीक्षण करने के लिए, कृपया परीक्षण देखें।

प्रयोग

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

  • मूल प्लेटफ़ॉर्म : verifyPhoneNumber
  • वेब प्लेटफ़ॉर्म : signInWithPhoneNumber

मूल निवासी: verifyPhoneNumber

मूल प्लेटफ़ॉर्म पर, उपयोगकर्ता के फ़ोन नंबर को पहले सत्यापित किया जाना चाहिए और फिर उपयोगकर्ता या तो साइन-इन कर सकता है या अपने खाते को PhoneAuthCredential से लिंक कर सकता है।

सबसे पहले आपको उपयोगकर्ता से उनका फ़ोन नंबर मांगना होगा। एक बार प्रदान करने के बाद, verifyPhoneNumber() विधि को कॉल करें:

await FirebaseAuth.instance.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) {},
  verificationFailed: (FirebaseAuthException e) {},
  codeSent: (String verificationId, int? resendToken) {},
  codeAutoRetrievalTimeout: (String verificationId) {},
);

4 अलग-अलग कॉलबैक हैं जिन्हें आपको संभालना होगा, प्रत्येक यह निर्धारित करेगा कि आप एप्लिकेशन यूआई को कैसे अपडेट करते हैं:

  1. सत्यापन पूर्ण हुआ : एंड्रॉइड डिवाइस पर एसएमएस कोड का स्वचालित प्रबंधन।
  2. सत्यापन विफल : विफलता की घटनाओं को संभालें जैसे कि अमान्य फ़ोन नंबर या क्या एसएमएस कोटा पार हो गया है।
  3. कोडसेंट : फायरबेस से डिवाइस पर कोई कोड भेजे जाने पर हैंडल करें, इसका उपयोग उपयोगकर्ताओं को कोड दर्ज करने के लिए प्रेरित करने के लिए किया जाता है।
  4. CodeAutoRetrievalTimeout : स्वचालित एसएमएस कोड हैंडलिंग विफल होने पर टाइमआउट को संभालें।

सत्यापन पूरा हुआ

इस हैंडलर को केवल उन एंड्रॉइड डिवाइस पर कॉल किया जाएगा जो स्वचालित एसएमएस कोड रिज़ॉल्यूशन का समर्थन करते हैं।

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

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationCompleted: (PhoneAuthCredential credential) async {
    // ANDROID ONLY!

    // Sign the user in (or link) with the auto-generated credential
    await auth.signInWithCredential(credential);
  },
);

सत्यापन में विफल रहा

यदि फायरबेस कोई त्रुटि देता है, उदाहरण के लिए गलत फोन नंबर या यदि प्रोजेक्ट के लिए एसएमएस कोटा पार हो गया है, तो इस हैंडलर को एक FirebaseAuthException भेजा जाएगा। इस मामले में, आप त्रुटि कोड के आधार पर अपने उपयोगकर्ता को संकेत देंगे कि कुछ गलत हो गया है।

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  verificationFailed: (FirebaseAuthException e) {
    if (e.code == 'invalid-phone-number') {
      print('The provided phone number is not valid.');
    }

    // Handle other errors
  },
);

कोड भेजा है

जब फायरबेस डिवाइस पर एक एसएमएस कोड भेजता है, तो यह हैंडलर एक verificationId और resendToken के साथ ट्रिगर होता है (एक resendToken केवल एंड्रॉइड डिवाइस पर समर्थित है, आईओएस डिवाइस हमेशा एक null मान लौटाएगा)।

एक बार ट्रिगर होने के बाद, यह आपके एप्लिकेशन यूआई को अपडेट करने का एक अच्छा समय होगा ताकि उपयोगकर्ता को वह एसएमएस कोड दर्ज करने के लिए प्रेरित किया जा सके जिसकी वे अपेक्षा कर रहे हैं। एक बार एसएमएस कोड दर्ज हो जाने के बाद, आप एक नया PhoneAuthCredential बनाने के लिए सत्यापन आईडी को एसएमएस कोड के साथ जोड़ सकते हैं:

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  codeSent: (String verificationId, int? resendToken) async {
    // Update the UI - wait for the user to enter the SMS code
    String smsCode = 'xxxx';

    // Create a PhoneAuthCredential with the code
    PhoneAuthCredential credential = PhoneAuthProvider.credential(verificationId: verificationId, smsCode: smsCode);

    // Sign the user in (or link) with the credential
    await auth.signInWithCredential(credential);
  },
);

डिफ़ॉल्ट रूप से, यदि हाल ही में भेजा गया है तो फायरबेस एक नया एसएमएस संदेश दोबारा नहीं भेजेगा। हालाँकि, आप forceResendingToken तर्क पर पुनः भेजें टोकन के साथ verifyPhoneNumber विधि को दोबारा कॉल करके इस व्यवहार को ओवरराइड कर सकते हैं। सफल होने पर, एसएमएस संदेश पुनः भेजा जाएगा।

कोडऑटोरिट्रीवलटाइमआउट

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

डिफ़ॉल्ट रूप से, डिवाइस 30 सेकंड तक प्रतीक्षा करता है, हालांकि इसे timeout तर्क के साथ अनुकूलित किया जा सकता है:

FirebaseAuth auth = FirebaseAuth.instance;

await auth.verifyPhoneNumber(
  phoneNumber: '+44 7123 123 456',
  timeout: const Duration(seconds: 60),
  codeAutoRetrievalTimeout: (String verificationId) {
    // Auto-resolution timed out...
  },
);

वेब: signInWithPhoneNumber

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

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

FirebaseAuth auth = FirebaseAuth.instance;

// Wait for the user to complete the reCAPTCHA & for an SMS code to be sent.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456');

विधि को कॉल करने से सबसे पहले reCAPTCHA विजेट प्रदर्शित होने के लिए ट्रिगर होगा। एसएमएस कोड भेजे जाने से पहले उपयोगकर्ता को परीक्षण पूरा करना होगा। एक बार पूरा होने पर, आप हल किए गए ConfirmationResult प्रतिक्रिया पर confirm विधि को एसएमएस कोड प्रदान करके उपयोगकर्ता को साइन इन कर सकते हैं:

UserCredential userCredential = await confirmationResult.confirm('123456');

अन्य साइन-इन प्रवाहों की तरह, एक सफल साइन-इन किसी भी प्रमाणीकरण स्थिति श्रोताओं को ट्रिगर करेगा जिन्हें आपने अपने पूरे एप्लिकेशन में सब्सक्राइब किया है।

रीकैप्चा कॉन्फ़िगरेशन

reCAPTCHA विजेट एक पूर्णतः प्रबंधित प्रवाह है जो आपके वेब एप्लिकेशन को सुरक्षा प्रदान करता है।

signInWithPhoneNumber का दूसरा तर्क एक वैकल्पिक RecaptchaVerifier उदाहरण स्वीकार करता है जिसका उपयोग विजेट को प्रबंधित करने के लिए किया जा सकता है। डिफ़ॉल्ट रूप से, साइन-इन प्रवाह चालू होने पर विजेट एक अदृश्य विजेट के रूप में प्रस्तुत होगा। एक "अदृश्य" विजेट आपके एप्लिकेशन के शीर्ष पर एक पूर्ण-पृष्ठ मोडल के रूप में दिखाई देगा।

हालाँकि, एक इनलाइन विजेट प्रदर्शित करना संभव है जिसे उपयोगकर्ता को स्वयं को सत्यापित करने के लिए स्पष्ट रूप से दबाना होगा।

इनलाइन विजेट जोड़ने के लिए, RecaptchaVerifier इंस्टेंस के container तर्क में एक DOM तत्व आईडी निर्दिष्ट करें। तत्व मौजूद होना चाहिए और खाली होना चाहिए अन्यथा एक त्रुटि उत्पन्न हो जाएगी। यदि कोई container तर्क प्रदान नहीं किया गया है, तो विजेट को "अदृश्य" के रूप में प्रस्तुत किया जाएगा।

ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
  container: 'recaptcha',
  size: RecaptchaVerifierSize.compact,
  theme: RecaptchaVerifierTheme.dark,
));

जैसा कि ऊपर दिखाया गया है, आप size और theme तर्कों को अनुकूलित करके वैकल्पिक रूप से आकार और थीम बदल सकते हैं।

घटनाओं को सुनना भी संभव है, जैसे कि क्या उपयोगकर्ता द्वारा रीकैप्चा पूरा कर लिया गया है, क्या रीकैप्चा समाप्त हो गया है या कोई त्रुटि हुई है:

RecaptchaVerifier(
  onSuccess: () => print('reCAPTCHA Completed!'),
  onError: (FirebaseAuthException error) => print(error),
  onExpired: () => print('reCAPTCHA Expired!'),
);

परिक्षण

फायरबेस स्थानीय स्तर पर फ़ोन नंबरों के परीक्षण के लिए सहायता प्रदान करता है:

  1. फायरबेस कंसोल पर, "फोन" प्रमाणीकरण प्रदाता का चयन करें और "परीक्षण के लिए फोन नंबर" ड्रॉपडाउन पर क्लिक करें।
  2. एक नया फ़ोन नंबर (जैसे +44 7444 555666 ) और एक परीक्षण कोड (जैसे 123456 ) दर्ज करें।

यदि verifyPhoneNumber या signInWithPhoneNumber विधियों में एक परीक्षण फ़ोन नंबर प्रदान किया जाता है, तो वास्तव में कोई एसएमएस नहीं भेजा जाएगा। इसके बजाय आप सीधे PhoneAuthProvider या signInWithPhoneNumber के पुष्टिकरण परिणाम हैंडलर के साथ परीक्षण कोड प्रदान कर सकते हैं।