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

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

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

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

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

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

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

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

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

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

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

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

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

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

    • dynamicLinkDomain: (अब इस्तेमाल नहीं किया जाता, linkDomain का इस्तेमाल करें) जब किसी प्रोजेक्ट के लिए कई कस्टम डाइनैमिक लिंक डोमेन तय किए जाते हैं, तो बताएं कि किसी खास मोबाइल ऐप्लिकेशन (उदाहरण के लिए, example.page.link) का इस्तेमाल करके लिंक खोलने पर, किस डोमेन का इस्तेमाल करना है. ऐसा न करने पर, पहला डोमेन अपने-आप चुना जाता है.

    • linkDomain: Firebase Hosting का कस्टम डोमेन, जिसका इस्तेमाल तब किया जा सकता है, जब लिंक को किसी खास मोबाइल ऐप्लिकेशन का इस्तेमाल करके खोला जाना हो. डोमेन को Firebase Hosting में कॉन्फ़िगर किया जाना चाहिए और प्रोजेक्ट के पास उसका मालिकाना हक होना चाहिए. यह डिफ़ॉल्ट होस्टिंग डोमेन (web.app या firebaseapp.com) नहीं हो सकता. यह, अब काम न करने वाली dynamicLinkDomain सेटिंग की जगह लेता है.

    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 Auth को साइन इन फ़्लो पूरा करते समय उपयोगकर्ता का ईमेल पता देना ज़रूरी है. साइन इन करने के लिए, यह ज़रूरी है कि यह ईमेल पता उस पते से मेल खाता हो जिस पर साइन इन करने का लिंक मूल रूप से भेजा गया था.

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

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

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

साइन इन की प्रक्रिया पूरी करना

Firebase डाइनैमिक लिंक की सुविधा अब काम नहीं करती. साइन इन करने का लिंक भेजने के लिए, अब Firebase होस्टिंग का इस्तेमाल किया जाता है. प्लैटफ़ॉर्म के हिसाब से कॉन्फ़िगरेशन के लिए, इन गाइड का पालन करें:

मोबाइल ऐप्लिकेशन से साइन इन करने के लिए, ऐप्लिकेशन को इनकमिंग ऐप्लिकेशन लिंक का पता लगाने, उसमें मौजूद डीप लिंक को पार्स करने, और फिर साइन इन करने के लिए कॉन्फ़िगर करना होगा.

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

    // 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() तरीका बंद हो जाता है. हमने पहले, आइडेंटिफ़ायर-फ़र्स्ट फ़्लो लागू करने के लिए, इस तरीके का सुझाव दिया था.

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

ज़्यादा जानकारी के लिए, ईमेल पते की जानकारी को सुरक्षित रखने की सुविधा के बारे में दस्तावेज़ देखें.

अगले चरण

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

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

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

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

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

await FirebaseAuth.instance.signOut();