ईमेल लिंक का उपयोग करके फायरबेस से प्रमाणित करें

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

ईमेल द्वारा साइन इन करने के कई लाभ हैं:

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

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

  1. यदि आपने पहले से नहीं किया है, तो प्रारंभ करें मार्गदर्शिका में दिए गए चरणों का पालन करें।

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

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

    1. फायरबेस कंसोल में, ऑथ सेक्शन खोलें।
    2. साइन इन विधि टैब पर, ईमेल/पासवर्ड प्रदाता को सक्षम करें। ध्यान दें कि ईमेल लिंक साइन-इन का उपयोग करने के लिए ईमेल/पासवर्ड साइन-इन सक्षम होना चाहिए।
    3. उसी अनुभाग में, ईमेल लिंक (पासवर्ड रहित साइन-इन) साइन-इन विधि सक्षम करें।
    4. सहेजें पर क्लिक करें.

प्रमाणीकरण प्रवाह शुरू करने के लिए, एक इंटरफ़ेस प्रस्तुत करें जो उपयोगकर्ता को अपना ईमेल पता प्रदान करने के लिए प्रेरित करता है और फिर sendSignInLinkToEmail() को कॉल करके अनुरोध करता है कि फायरबेस उपयोगकर्ता के ईमेल पर प्रमाणीकरण लिंक भेजे।

  1. ActionCodeSettings ऑब्जेक्ट का निर्माण करें, जो फायरबेस को ईमेल लिंक बनाने के निर्देश प्रदान करता है। निम्नलिखित फ़ील्ड सेट करें:

    • url : एंबेड करने के लिए डीप लिंक और पास की जाने वाली कोई भी अतिरिक्त स्थिति। लिंक के डोमेन को अधिकृत डोमेन की फायरबेस कंसोल सूची में श्वेतसूची में डालना होगा, जिसे साइन-इन विधि टैब (प्रमाणीकरण -> साइन-इन विधि) पर जाकर पाया जा सकता है। यदि उपयोगकर्ता के डिवाइस पर ऐप इंस्टॉल नहीं है और ऐप इंस्टॉल नहीं हो पा रहा है तो लिंक इस यूआरएल पर रीडायरेक्ट कर देगा।

    • androidPackageName और IOSBundleId : एंड्रॉइड या iOS डिवाइस पर साइन-इन लिंक खोले जाने पर उपयोग किए जाने वाले ऐप्स। मोबाइल ऐप्स के माध्यम से ईमेल कार्रवाई लिंक खोलने के लिए फायरबेस डायनेमिक लिंक को कॉन्फ़िगर करने के तरीके के बारे में और जानें।

    • handleCodeInApp : true पर सेट करें। साइन-इन ऑपरेशन को अन्य आउट ऑफ बैंड ईमेल क्रियाओं (पासवर्ड रीसेट और ईमेल सत्यापन) के विपरीत हमेशा ऐप में पूरा करना होता है। ऐसा इसलिए है, क्योंकि प्रवाह के अंत में, उपयोगकर्ता से साइन इन होने की उम्मीद की जाती है और ऐप के भीतर उनकी प्रामाणिक स्थिति बनी रहती है।

    • dynamicLinkDomain : जब किसी प्रोजेक्ट के लिए कई कस्टम डायनामिक लिंक डोमेन परिभाषित किए जाते हैं, तो निर्दिष्ट करें कि जब लिंक को एक निर्दिष्ट मोबाइल ऐप के माध्यम से खोला जाना है तो किसका उपयोग करना है (उदाहरण के लिए, example.page.link )। अन्यथा पहला डोमेन स्वचालित रूप से चयनित हो जाता है।

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  2. उपयोगकर्ता से उनका ईमेल पूछें.

  3. उपयोगकर्ता के ईमेल पर प्रमाणीकरण लिंक भेजें, और यदि उपयोगकर्ता उसी डिवाइस पर ईमेल साइन-इन पूरा करता है तो उपयोगकर्ता का ईमेल सहेजें।

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

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

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

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

साइन-इन पूरा होने के बाद, साइन-इन का कोई भी पिछला असत्यापित तंत्र उपयोगकर्ता से हटा दिया जाएगा और कोई भी मौजूदा सत्र अमान्य कर दिया जाएगा। उदाहरण के लिए, यदि किसी ने पहले उसी ईमेल और पासवर्ड के साथ एक असत्यापित खाता बनाया था, तो उस प्रतिरूपणकर्ता को रोकने के लिए उपयोगकर्ता का पासवर्ड हटा दिया जाएगा जिसने स्वामित्व का दावा किया था और उस असत्यापित खाते को असत्यापित ईमेल और पासवर्ड के साथ फिर से साइन इन करने से रोका था।

यह भी सुनिश्चित करें कि आपके लिंक को मध्यस्थ सर्वर द्वारा संभावित रूप से बाधित होने से बचाने के लिए आप उत्पादन में HTTPS URL का उपयोग करें।

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

  1. गाइड में फ़्लटर पर डायनामिक लिंक प्राप्त करने के लिए अपना ऐप सेट करें।

  2. अपने लिंक हैंडलर में, जांचें कि क्या लिंक ईमेल लिंक प्रमाणीकरण के लिए है और यदि हां, तो साइन-इन प्रक्रिया पूरी करें।

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

आप प्रमाणीकरण की इस पद्धति को किसी मौजूदा उपयोगकर्ता से भी लिंक कर सकते हैं। उदाहरण के लिए, पहले किसी अन्य प्रदाता, जैसे फ़ोन नंबर, से प्रमाणित उपयोगकर्ता साइन-इन की इस पद्धति को अपने मौजूदा खाते में जोड़ सकता है।

अंतर ऑपरेशन के दूसरे भाग में होगा:

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

इसका उपयोग किसी संवेदनशील ऑपरेशन को चलाने से पहले किसी ईमेल लिंक उपयोगकर्ता को पुनः प्रमाणित करने के लिए भी किया जा सकता है।

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

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

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

हालाँकि आप अपने प्रोजेक्ट के लिए ईमेल गणना सुरक्षा को अक्षम कर सकते हैं, हम ऐसा न करने की सलाह देते हैं।

अधिक विवरण के लिए ईमेल गणना सुरक्षा पर दस्तावेज़ देखें।

अगले कदम

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

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

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

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

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

await FirebaseAuth.instance.signOut();