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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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