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

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

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

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

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

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

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

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

    1. Firebase console में, Security > Authentication पर जाएं.

    2. साइन-इन का तरीका टैब में जाकर, ईमेल/पासवर्ड साइन-इन प्रोवाइडर को चालू करें. ध्यान दें कि ईमेल लिंक से साइन इन करने की सुविधा का इस्तेमाल करने के लिए, ईमेल/पासवर्ड से साइन इन करने की सुविधा चालू होनी चाहिए.

    3. उसी सेक्शन में, ईमेल लिंक (बिना पासवर्ड के साइन-इन करें) साइन-इन करने का तरीका चालू करें.

    4. सेव करें पर क्लिक करें.

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

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

    • url: एम्बेड करने के लिए डीप लिंक और पास करने के लिए कोई भी अतिरिक्त स्थिति. अगर आपने पहले से ही ऐसा नहीं किया है, तो लिंक के डोमेन को अनुमति वाले डोमेन की सूची में जोड़ें:

      1. Firebase कंसोल में, पुष्टि करें > सेटिंग टैब पर जाएं.

      2. अनुमति वाले डोमेन सेक्शन में जाकर, डोमेन जोड़ें पर क्लिक करें. इसके बाद, लिंक का डोमेन जोड़ें.

      अगर उपयोगकर्ता के डिवाइस पर ऐप्लिकेशन इंस्टॉल नहीं है और उसे इंस्टॉल नहीं किया जा सका, तो लिंक पर क्लिक करने से उसे इस यूआरएल पर रीडायरेक्ट कर दिया जाएगा.

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

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

  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();