Apple प्लेटफ़ॉर्म पर ईमेल लिंक का उपयोग करके फायरबेस से प्रमाणित करें

आप किसी उपयोगकर्ता को एक लिंक युक्त ईमेल भेजकर साइन इन करने के लिए फायरबेस प्रमाणीकरण का उपयोग कर सकते हैं, जिस पर वे साइन इन करने के लिए क्लिक कर सकते हैं। इस प्रक्रिया में, उपयोगकर्ता का ईमेल पता भी सत्यापित किया जाता है।

ईमेल द्वारा साइन इन करने के कई लाभ हैं:

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

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

फायरबेस निर्भरता को स्थापित और प्रबंधित करने के लिए स्विफ्ट पैकेज मैनेजर का उपयोग करें।

  1. Xcode में, अपना ऐप प्रोजेक्ट खुला होने पर, फ़ाइल > पैकेज जोड़ें पर नेविगेट करें।
  2. संकेत मिलने पर, Firebase Apple प्लेटफ़ॉर्म SDK रिपॉजिटरी जोड़ें:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. फायरबेस प्रमाणीकरण लाइब्रेरी चुनें।
  5. अपने लक्ष्य की बिल्ड सेटिंग्स के अन्य लिंकर फ़्लैग अनुभाग में -ObjC फ़्लैग जोड़ें।
  6. समाप्त होने पर, Xcode स्वचालित रूप से पृष्ठभूमि में आपकी निर्भरता को हल करना और डाउनलोड करना शुरू कर देगा।

उपयोगकर्ताओं को ईमेल लिंक द्वारा साइन इन करने के लिए, आपको पहले अपने फायरबेस प्रोजेक्ट के लिए ईमेल प्रदाता और ईमेल लिंक साइन-इन विधि को सक्षम करना होगा:

  1. फायरबेस कंसोल में, ऑथ सेक्शन खोलें।
  2. साइन इन विधि टैब पर, ईमेल/पासवर्ड प्रदाता को सक्षम करें। ध्यान दें कि ईमेल लिंक साइन-इन का उपयोग करने के लिए ईमेल/पासवर्ड साइन-इन सक्षम होना चाहिए।
  3. उसी अनुभाग में, ईमेल लिंक (पासवर्ड रहित साइन-इन) साइन-इन विधि सक्षम करें।
  4. सहेजें पर क्लिक करें.

प्रमाणीकरण प्रवाह शुरू करने के लिए, उपयोगकर्ता को एक इंटरफ़ेस प्रस्तुत करें जो उपयोगकर्ता को अपना ईमेल पता प्रदान करने के लिए प्रेरित करता है और फिर sendSignInLink कॉल करके अनुरोध करता है कि फायरबेस उपयोगकर्ता के ईमेल पर प्रमाणीकरण लिंक भेजे।

  1. ActionCodeSettings ऑब्जेक्ट का निर्माण करें, जो फायरबेस को ईमेल लिंक बनाने के निर्देश प्रदान करता है। निम्नलिखित फ़ील्ड सेट करें:

    • यूआरएल: एंबेड करने के लिए डीप लिंक और पास की जाने वाली कोई भी अतिरिक्त स्थिति। लिंक के डोमेन को अधिकृत डोमेन की फायरबेस कंसोल सूची में श्वेतसूची में डालना होगा, जिसे साइन-इन विधि टैब (प्रमाणीकरण -> साइन-इन विधि) पर जाकर पाया जा सकता है।
    • iOSBundleID और androidPackageName: Android या Apple डिवाइस पर साइन-इन लिंक खोले जाने पर उपयोग किए जाने वाले ऐप्स। मोबाइल ऐप्स के माध्यम से ईमेल कार्रवाई लिंक खोलने के लिए फायरबेस डायनेमिक लिंक को कॉन्फ़िगर करने के तरीके के बारे में और जानें।
    • हैंडलकोडइनऐप: सत्य पर सेट करें। साइन-इन ऑपरेशन को अन्य आउट ऑफ बैंड ईमेल क्रियाओं (पासवर्ड रीसेट और ईमेल सत्यापन) के विपरीत हमेशा ऐप में पूरा करना होता है। ऐसा इसलिए है, क्योंकि प्रवाह के अंत में, उपयोगकर्ता से साइन इन होने की उम्मीद की जाती है और ऐप के भीतर उनकी प्रामाणिक स्थिति बनी रहती है।
    • डायनामिकलिंकडोमेन: जब किसी प्रोजेक्ट के लिए एकाधिक कस्टम डायनामिक लिंक डोमेन परिभाषित किए जाते हैं, तो निर्दिष्ट करें कि जब लिंक को एक निर्दिष्ट मोबाइल ऐप के माध्यम से खोला जाना है तो किसका उपयोग करना है (उदाहरण के लिए, example.page.link )। अन्यथा पहला डोमेन स्वचालित रूप से चयनित हो जाता है।

    तीव्र

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")
    

    उद्देश्य सी

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];
    

    ActionCodeSettings पर अधिक जानने के लिए, ईमेल कार्रवाई अनुभाग में पासिंग स्थिति देखें।

  2. उपयोगकर्ता से उनका ईमेल पूछें.

  3. उपयोगकर्ता के ईमेल पर प्रमाणीकरण लिंक भेजें, और यदि उपयोगकर्ता उसी डिवाइस पर ईमेल साइन-इन पूरा करता है तो उपयोगकर्ता का ईमेल सहेजें।

    तीव्र

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }
    

    उद्देश्य सी

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];
    

सुरक्षा चिंताएं

साइन-इन लिंक को अनपेक्षित उपयोगकर्ता के रूप में या अनपेक्षित डिवाइस पर साइन इन करने से रोकने के लिए, फायरबेस ऑथ को साइन-इन प्रवाह पूरा करते समय उपयोगकर्ता का ईमेल पता प्रदान करना आवश्यक है। साइन-इन सफल होने के लिए, यह ईमेल पता उस पते से मेल खाना चाहिए जिस पर साइन-इन लिंक मूल रूप से भेजा गया था।

जब आप साइन-इन ईमेल भेजते हैं तो उनके ईमेल पते को स्थानीय रूप से संग्रहीत करके आप उन उपयोगकर्ताओं के लिए इस प्रवाह को सुव्यवस्थित कर सकते हैं जो साइन-इन लिंक को उसी डिवाइस पर खोलते हैं जिस पर वे लिंक का अनुरोध करते हैं। फिर, प्रवाह को पूरा करने के लिए इस पते का उपयोग करें।

साइन-इन पूरा होने के बाद, साइन-इन का कोई भी पिछला असत्यापित तंत्र उपयोगकर्ता से हटा दिया जाएगा और कोई भी मौजूदा सत्र अमान्य कर दिया जाएगा। उदाहरण के लिए, यदि किसी ने पहले उसी ईमेल और पासवर्ड के साथ एक असत्यापित खाता बनाया था, तो स्वामित्व का दावा करने वाले और उस असत्यापित खाते को बनाने वाले प्रतिरूपणकर्ता को उसी खाते के साथ दोबारा साइन इन करने से रोकने के लिए उपयोगकर्ता का पासवर्ड हटा दिया जाएगा।

Apple मोबाइल ऐप में साइन-इन पूरा करना

फायरबेस प्रमाणीकरण मोबाइल डिवाइस पर ईमेल लिंक भेजने के लिए फायरबेस डायनेमिक लिंक का उपयोग करता है। मोबाइल एप्लिकेशन के माध्यम से साइन-इन पूरा करने के लिए, आने वाले एप्लिकेशन लिंक का पता लगाने, अंतर्निहित डीप लिंक को पार्स करने और फिर साइन-इन पूरा करने के लिए एप्लिकेशन को कॉन्फ़िगर करना होगा।

मोबाइल एप्लिकेशन में खोले जाने वाले लिंक को भेजते समय फायरबेस ऑथ फायरबेस डायनेमिक लिंक का उपयोग करता है। इस सुविधा का उपयोग करने के लिए, डायनामिक लिंक को फायरबेस कंसोल में कॉन्फ़िगर करना होगा।

  1. फायरबेस डायनेमिक लिंक सक्षम करें:

    1. फायरबेस कंसोल में, डायनेमिक लिंक अनुभाग खोलें।
    2. यदि आपने अभी तक डायनामिक लिंक शर्तों को स्वीकार नहीं किया है और डायनामिक लिंक डोमेन नहीं बनाया है, तो अभी ऐसा करें।

      यदि आपने पहले ही डायनेमिक लिंक डोमेन बना लिया है, तो इस पर ध्यान दें। एक डायनामिक लिंक डोमेन आमतौर पर निम्नलिखित उदाहरण जैसा दिखता है:

      example.page.link

      जब आप आने वाले लिंक को इंटरसेप्ट करने के लिए अपने ऐप्पल या एंड्रॉइड ऐप को कॉन्फ़िगर करेंगे तो आपको इस मान की आवश्यकता होगी।

  2. Apple एप्लिकेशन कॉन्फ़िगर करना:

    1. यदि आप अपने एप्लिकेशन से इन लिंक को संभालने की योजना बना रहे हैं, तो बंडल आईडी को फायरबेस कंसोल प्रोजेक्ट सेटिंग्स में निर्दिष्ट करना होगा। इसके अलावा, ऐप स्टोर आईडी और ऐप्पल डेवलपर टीम आईडी भी निर्दिष्ट करने की आवश्यकता है।
    2. आपको अपने ईमेल एक्शन हैंडलर डोमेन को अपनी एप्लिकेशन क्षमताओं में एक एसोसिएटेड डोमेन के रूप में कॉन्फ़िगर करने की भी आवश्यकता होगी। डिफ़ॉल्ट रूप से, ईमेल एक्शन हैंडलर को निम्न उदाहरण की तरह एक डोमेन पर होस्ट किया जाता है:
      APP_ID.firebaseapp.com
    3. यदि आप अपने एप्लिकेशन को iOS संस्करण 8 और उससे नीचे के संस्करण में वितरित करने की योजना बना रहे हैं, तो आपको आने वाले यूआरएल के लिए एक कस्टम योजना के रूप में अपनी बंडल आईडी सेट करने की आवश्यकता होगी।
    4. इस पर अधिक जानकारी के लिए, Apple प्लेटफ़ॉर्म डायनेमिक लिंक निर्देश प्राप्त करना देखें।

ऊपर वर्णित अनुसार लिंक प्राप्त होने के बाद, सत्यापित करें कि यह ईमेल लिंक प्रमाणीकरण के लिए है और साइन इन पूरा करें।

तीव्र

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

उद्देश्य सी

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

एंड्रॉइड एप्लिकेशन में ईमेल लिंक के साथ साइन-इन को संभालने के तरीके के बारे में जानने के लिए, एंड्रॉइड गाइड देखें।

किसी वेब एप्लिकेशन में ईमेल लिंक के साथ साइन-इन को संभालने के तरीके के बारे में जानने के लिए, वेब गाइड देखें।

आप प्रमाणीकरण की इस पद्धति को किसी मौजूदा उपयोगकर्ता से भी लिंक कर सकते हैं। उदाहरण के लिए, पहले किसी अन्य प्रदाता, जैसे फ़ोन नंबर, से प्रमाणित उपयोगकर्ता साइन-इन की इस पद्धति को अपने मौजूदा खाते में जोड़ सकता है।

अंतर ऑपरेशन के दूसरे भाग में होगा:

तीव्र

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

उद्देश्य सी

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

इसका उपयोग किसी संवेदनशील ऑपरेशन को चलाने से पहले किसी ईमेल लिंक उपयोगकर्ता को पुनः प्रमाणित करने के लिए भी किया जा सकता है।

तीव्र

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

उद्देश्य सी

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

हालाँकि, चूँकि प्रवाह किसी भिन्न डिवाइस पर समाप्त हो सकता है जहाँ मूल उपयोगकर्ता लॉग इन नहीं था, इसलिए यह प्रवाह पूरा नहीं हो सकता है। उस स्थिति में, उपयोगकर्ता को उसी डिवाइस पर लिंक खोलने के लिए बाध्य करने के लिए एक त्रुटि दिखाई जा सकती है। ऑपरेशन के प्रकार और उपयोगकर्ता यूआईडी के बारे में जानकारी प्रदान करने के लिए लिंक में कुछ राज्य पारित किए जा सकते हैं।

यदि आपने अपना प्रोजेक्ट 15 सितंबर, 2023 को या उसके बाद बनाया है, तो ईमेल गणना सुरक्षा डिफ़ॉल्ट रूप से सक्षम है। यह सुविधा आपके प्रोजेक्ट के उपयोगकर्ता खातों की सुरक्षा में सुधार करती है, लेकिन यह fetchSignInMethodsForEmail() विधि को अक्षम कर देती है, जिसे हमने पहले पहचानकर्ता-प्रथम प्रवाह को लागू करने के लिए अनुशंसित किया था।

हालाँकि आप अपने प्रोजेक्ट के लिए ईमेल गणना सुरक्षा को अक्षम कर सकते हैं, हम ऐसा न करने की सलाह देते हैं।

अधिक विवरण के लिए ईमेल गणना सुरक्षा पर दस्तावेज़ देखें।

अगले कदम

किसी उपयोगकर्ता द्वारा पहली बार साइन इन करने के बाद, एक नया उपयोगकर्ता खाता बनाया जाता है और क्रेडेंशियल्स से लिंक किया जाता है - यानी, उपयोगकर्ता नाम और पासवर्ड, फोन नंबर, या ऑथ प्रदाता जानकारी - जिस उपयोगकर्ता के साथ साइन इन किया जाता है। यह नया खाता आपके फायरबेस प्रोजेक्ट के हिस्से के रूप में संग्रहीत है, और इसका उपयोग आपके प्रोजेक्ट के प्रत्येक ऐप में उपयोगकर्ता की पहचान करने के लिए किया जा सकता है, भले ही उपयोगकर्ता कैसे भी साइन इन करता हो।

  • अपने ऐप्स में, आप User ऑब्जेक्ट से उपयोगकर्ता की मूल प्रोफ़ाइल जानकारी प्राप्त कर सकते हैं। उपयोगकर्ता प्रबंधित करें देखें.

  • अपने फायरबेस रीयलटाइम डेटाबेस और क्लाउड स्टोरेज सुरक्षा नियमों में, आप साइन-इन किए गए उपयोगकर्ता की अद्वितीय उपयोगकर्ता आईडी को auth वेरिएबल से प्राप्त कर सकते हैं, और इसका उपयोग यह नियंत्रित करने के लिए कर सकते हैं कि उपयोगकर्ता किस डेटा तक पहुंच सकता है।

आप किसी मौजूदा उपयोगकर्ता खाते से प्रमाणीकरण प्रदाता क्रेडेंशियल्स को लिंक करके उपयोगकर्ताओं को एकाधिक प्रमाणीकरण प्रदाताओं का उपयोग करके अपने ऐप में साइन इन करने की अनुमति दे सकते हैं।

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

तीव्र

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

उद्देश्य सी

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

आप प्रमाणीकरण त्रुटियों की पूरी श्रृंखला के लिए त्रुटि प्रबंधन कोड भी जोड़ना चाह सकते हैं। त्रुटियाँ संभालें देखें।