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

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

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

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

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

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

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

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

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

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

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

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

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

    • 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 Hosting का इस्तेमाल किया जाता है. प्लैटफ़ॉर्म के हिसाब से कॉन्फ़िगरेशन करने के लिए, इन गाइड का पालन करें:

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

  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 Realtime Database और Cloud Storage के सुरक्षा नियमों में, साइन इन किए हुए उपयोगकर्ता का यूनीक आईडी auth वैरिएबल से मिलता है. इसका इस्तेमाल यह कंट्रोल करने के लिए किया जा सकता है कि उपयोगकर्ता किस डेटा को ऐक्सेस कर सकता है.

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

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

await FirebaseAuth.instance.signOut();