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

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

ईमेल से साइन इन करने के कई फायदे हैं:

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

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

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

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

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

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

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

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

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

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

    • 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 का उपयोग करके - जब आप साइन-इन ईमेल भेजते हैं। फिर, प्रवाह को पूरा करने के लिए इस पते का उपयोग करें। उपयोगकर्ता के ईमेल को रीडायरेक्ट URL पैरामीटर में पास न करें और उसका पुन: उपयोग करें क्योंकि इससे सत्र इंजेक्शन सक्षम हो सकते हैं।

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

यह भी सुनिश्चित करें कि आप अपने लिंक को मध्यस्थ सर्वर द्वारा संभावित रूप से इंटरसेप्ट किए जाने से बचने के लिए उत्पादन में एक 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.");
}

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

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

try {
    final signInMethods =
        await FirebaseAuth.instance.fetchSignInMethodsForEmail(emailAuth);
    final userExists = signInMethods.isNotEmpty;
    final canSignInWithLink = signInMethods
        .contains(EmailAuthProvider.EMAIL_LINK_SIGN_IN_METHOD);
    final canSignInWithPassword = signInMethods
        .contains(EmailAuthProvider.EMAIL_PASSWORD_SIGN_IN_METHOD);
} on FirebaseAuthException catch (exception) {
    switch (exception.code) {
        case "invalid-email":
            print("Not a valid email address.");
            break;
        default:
            print("Unknown error.");
    }
}

जैसा कि ऊपर वर्णित है ईमेल/पासवर्ड और ईमेल/लिंक को एक ही ईमेल EmailAuthProvider प्रदाता (समान PROVIDER_ID ) माना जाता है, जिसमें साइन-इन के विभिन्न तरीके होते हैं।

अगले कदम

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

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

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

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

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

await FirebaseAuth.instance.signOut();