ईमेल लिंक का इस्तेमाल करके Firebase से पुष्टि करें

Firebase से पुष्टि करने की सुविधा का इस्तेमाल करके, उपयोगकर्ता को साइन इन करने के लिए लिंक वाला ईमेल भेजा जा सकता है. उस पर क्लिक करके, उपयोगकर्ता साइन इन कर सकता है. इस प्रक्रिया में, उपयोगकर्ता के ईमेल पते की भी पुष्टि की जाती है.

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

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

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

  1. अगर आपने पहले से ऐसा नहीं किया है, तो शुरू करें गाइड में दिए गए निर्देशों का पालन करें.

  2. अपने Firebase प्रोजेक्ट के लिए ईमेल लिंक में साइन-इन करने की सुविधा चालू करें.

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

    1. Firebase कंसोल में, पुष्टि करें सेक्शन खोलें.
    2. साइन इन करने का तरीका टैब पर, ईमेल/पासवर्ड की सेवा देने वाली कंपनी को चालू करें. ध्यान दें कि ईमेल लिंक से साइन इन करने के लिए, ईमेल/पासवर्ड से साइन-इन करने की सुविधा चालू होनी चाहिए.
    3. इसी सेक्शन में, साइन-इन करने का ईमेल लिंक (बिना पासवर्ड के साइन इन करने के लिए) तरीका चालू करें.
    4. सेव करें पर क्लिक करें.

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

  1. ActionCodeSettings ऑब्जेक्ट को बनाएं, जो Firebase को ईमेल लिंक बनाने के तरीके के बारे में निर्देश देता है. नीचे दिए गए फ़ील्ड सेट करें:

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

    • androidPackageName और IOSBundleId: किसी Android या iOS डिवाइस पर साइन-इन लिंक खोलने पर इस्तेमाल किए जाने वाले ऐप्लिकेशन. मोबाइल ऐप्लिकेशन की मदद से ईमेल कार्रवाई के लिंक खोलने के लिए, Firebase डाइनैमिक लिंक को कॉन्फ़िगर करने के तरीके के बारे में ज़्यादा जानें.

    • 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'));
    });
    

सुरक्षा से जुड़ी समस्याएं

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

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

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

साथ ही, यह भी पक्का करें कि प्रोडक्शन में एचटीटीपीएस यूआरएल का इस्तेमाल किया जा रहा हो, ताकि आपका लिंक इंटरमीडियरी सर्वर से बीच में न आ सके.

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

  1. गाइड में Flutter पर डाइनैमिक लिंक पाने के लिए अपना ऐप्लिकेशन सेट अप करें.

  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.");
}

हालांकि, ऐसा हो सकता है कि फ़्लो किसी ऐसे डिवाइस पर खत्म हो जाए जिस पर ओरिजनल उपयोगकर्ता ने लॉग इन न किया हो. इस वजह से, हो सकता है कि यह फ़्लो पूरा न हो. ऐसे में, उपयोगकर्ता को एक गड़बड़ी दिखाई जा सकती है, ताकि उसे उसी डिवाइस पर लिंक खोलने के लिए मजबूर किया जा सके. कुछ स्टेट को लिंक में पास किया जा सकता है, ताकि कार्रवाई के टाइप और उपयोगकर्ता के uid के बारे में जानकारी दी जा सके.

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

हालांकि, अपने प्रोजेक्ट के लिए ईमेल गिनती सुरक्षा को बंद किया जा सकता है, लेकिन हमारा सुझाव है कि ऐसा न करें.

ज़्यादा जानकारी के लिए, ईमेल एन्यूमरेशन प्रोटेक्शन वाला दस्तावेज़ देखें.

अगले चरण

जब कोई उपयोगकर्ता नया खाता बनाता है, तब यह खाता आपके Firebase प्रोजेक्ट के हिस्से के तौर पर सेव हो जाता है. साथ ही, इसका इस्तेमाल आपके प्रोजेक्ट के हर ऐप्लिकेशन में उपयोगकर्ता की पहचान करने के लिए किया जा सकता है. भले ही, उपयोगकर्ता ने साइन-इन करने के लिए किसी भी तरीके का इस्तेमाल किया हो.

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

अपने Firebase रीयल टाइम डेटाबेस और Cloud Storage के सुरक्षा नियमों में, आपको auth वैरिएबल से साइन-इन किए हुए उपयोगकर्ता का यूनीक यूज़र आईडी मिल सकता है. साथ ही, इसका इस्तेमाल करके यह कंट्रोल किया जा सकता है कि उपयोगकर्ता कौनसा डेटा ऐक्सेस कर सकता है.

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

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

await FirebaseAuth.instance.signOut();