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

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

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

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

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

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

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

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

    1. Firebase console में, सुरक्षा > पुष्टि करने की सुविधा पर जाएं.

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

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

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

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

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

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

      1. Firebase console में, पुष्टि करने की सुविधा > सेटिंग टैब पर जाएं.

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

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

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

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

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

    • linkDomain: लिंक को किसी खास मोबाइल ऐप्लिकेशन का इस्तेमाल करके खोलने पर, Firebase होस्टिंग का कोई वैकल्पिक कस्टम डोमेन इस्तेमाल किया जा सकता है. डोमेन को 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();