قم بالمصادقة باستخدام Firebase باستخدام رابط البريد الإلكتروني في iOS

يمكنك استخدام مصادقة Firebase لتسجيل الدخول إلى مستخدم عن طريق إرسال بريد إلكتروني له يحتوي على رابط ، والذي يمكنه النقر عليه لتسجيل الدخول. في هذه العملية ، يتم أيضًا التحقق من عنوان البريد الإلكتروني للمستخدم.

هناك فوائد عديدة لتسجيل الدخول عبر البريد الإلكتروني:

  • انخفاض الاحتكاك في الاشتراك وتسجيل الدخول.
  • تقليل مخاطر إعادة استخدام كلمة المرور عبر التطبيقات ، مما قد يقوض أمان حتى كلمات المرور المختارة جيدًا.
  • القدرة على مصادقة مستخدم أثناء التحقق أيضًا من أن المستخدم هو المالك الشرعي لعنوان البريد الإلكتروني.
  • يحتاج المستخدم فقط إلى حساب بريد إلكتروني يمكن الوصول إليه لتسجيل الدخول. لا يلزم ملكية رقم هاتف أو حساب وسائط اجتماعية.
  • يمكن للمستخدم تسجيل الدخول بأمان دون الحاجة إلى تقديم (أو تذكر) كلمة مرور ، والتي يمكن أن تكون مرهقة على جهاز محمول.
  • يمكن ترقية المستخدم الحالي الذي قام بتسجيل الدخول مسبقًا باستخدام معرف بريد إلكتروني (كلمة مرور أو موحد) لتسجيل الدخول باستخدام البريد الإلكتروني فقط. على سبيل المثال ، لا يزال بإمكان المستخدم الذي نسى كلمة المرور الخاصة به تسجيل الدخول دون الحاجة إلى إعادة تعيين كلمة المرور الخاصة به.

قبل ان تبدأ

  1. إضافة إلى Firebase المشروع الذي يعمل بنظام iOS .

  2. تشمل القرون التالية في حياتك Podfile :

    pod 'Firebase/Auth'
    

  3. إذا لم تكن متصلا بعد تطبيقك لمشروع Firebase قم بذلك من وحدة التحكم Firebase .

لتسجيل دخول المستخدمين عن طريق رابط البريد الإلكتروني ، يجب أولاً تمكين طريقة تسجيل الدخول إلى موفر البريد الإلكتروني ورابط البريد الإلكتروني لمشروع Firebase:

  1. في وحدة التحكم Firebase ، فتح الباب أصيل.
  2. على علامة التبويب تسجيل الدخول الأسلوب، تمكين مزود البريد الإلكتروني / كلمة المرور. لاحظ أنه يجب تمكين تسجيل الدخول إلى البريد الإلكتروني / كلمة المرور لاستخدام تسجيل الدخول إلى رابط البريد الإلكتروني.
  3. في نفس القسم، تمكن رابط البريد الإلكتروني (passwordless تسجيل الدخول) تسجيل الدخول الأسلوب.
  4. انقر فوق حفظ.

لبدء تدفق التوثيق، وتقديم المستخدم مع واجهة التي يطالب المستخدم لتوفير عنوان البريد الإلكتروني الخاص بهم ومن ثم استدعاء sendSignInLinkToEmail:actionCodeSettings:completion: لطلب أن Firebase إرسال رابط مصادقة البريد الإلكتروني للمستخدم.

  1. بناء ActionCodeSettings الكائن، الذي يوفر Firebase مع تعليمات حول كيفية بناء وصلة البريد الإلكتروني. قم بتعيين الحقول التالية:

    • url: الرابط لموضع معين للتضمين وأي حالة إضافية يتم تمريرها. يجب وضع نطاق الرابط في القائمة البيضاء في قائمة Firebase Console للنطاقات المصرح بها ، والتي يمكن العثور عليها بالانتقال إلى علامة تبويب طريقة تسجيل الدخول (المصادقة -> طريقة تسجيل الدخول).
    • iOSBundleID و androidPackageName: التطبيقات المراد استخدامها عند فتح رابط تسجيل الدخول على جهاز Android أو iOS. مزيد من المعلومات حول كيفية تكوين Firebase دينامية سريعة إلى وصلات عمل البريد الإلكتروني مفتوحة عبر تطبيقات الجوال.
    • handleCodeInApp: اضبط على صواب. يجب أن تكتمل عملية تسجيل الدخول دائمًا في التطبيق بخلاف إجراءات البريد الإلكتروني الأخرى خارج النطاق (إعادة تعيين كلمة المرور والتحقق من البريد الإلكتروني). هذا لأنه في نهاية التدفق ، من المتوقع أن يقوم المستخدم بتسجيل الدخول واستمرار حالة المصادقة داخل التطبيق.
    • dynamicLinkDomain: عندما يتم تحديد متعددة المجالات صلة ديناميكية مخصصة للمشروع، تحديد أي واحد لاستخدامها عند الارتباط التي سيتم افتتاحها خلال تطبيق جوال محددة (على سبيل المثال، 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"];
        // ...
    }];
    

مخاوف أمنية

لمنع استخدام رابط تسجيل الدخول لتسجيل الدخول كمستخدم غير مقصود أو على جهاز غير مقصود ، يتطلب Firebase Auth توفير عنوان البريد الإلكتروني للمستخدم عند إكمال تدفق تسجيل الدخول. لكي ينجح تسجيل الدخول ، يجب أن يتطابق عنوان البريد الإلكتروني هذا مع العنوان الأصلي الذي تم إرسال رابط تسجيل الدخول إليه.

يمكنك تبسيط هذا التدفق للمستخدمين الذين يفتحون رابط تسجيل الدخول على نفس الجهاز الذي يطلبونه من خلال تخزين عنوان بريدهم الإلكتروني محليًا عند إرسال البريد الإلكتروني لتسجيل الدخول. ثم استخدم هذا العنوان لإكمال التدفق.

بعد اكتمال تسجيل الدخول ، ستتم إزالة أي آلية سابقة لتسجيل الدخول لم يتم التحقق منها من المستخدم وسيتم إبطال أي جلسات حالية. على سبيل المثال ، إذا قام شخص ما مسبقًا بإنشاء حساب لم يتم التحقق منه بنفس البريد الإلكتروني وكلمة المرور ، فستتم إزالة كلمة مرور المستخدم لمنع منتحل الشخصية الذي ادعى الملكية وقام بإنشاء هذا الحساب الذي لم يتم التحقق منه من تسجيل الدخول مرة أخرى بنفس الحساب.

إكمال تسجيل الدخول في تطبيق iOS للجوال

تستخدم مصادقة Firebase روابط Firebase الديناميكية لإرسال رابط البريد الإلكتروني إلى جهاز محمول. لإكمال تسجيل الدخول عبر تطبيق الهاتف المحمول ، يجب تهيئة التطبيق لاكتشاف ارتباط التطبيق الوارد وتحليل الارتباط العميق الأساسي ثم إكمال تسجيل الدخول.

يستخدم Firebase مصادقة Firebase دينامية سريعة عند إرسال رابط من المفترض أن يتم فتحها في تطبيقات الهاتف المتحرك. لاستخدام هذه الميزة ، يجب تكوين الروابط الديناميكية في Firebase Console.

  1. تفعيل روابط Firebase الديناميكية:

    1. في وحدة التحكم Firebase ، فتح الباب الحيوي الوصلات.
    2. إذا لم تكن قد وافقت بعد على شروط الروابط الديناميكية وأنشأت نطاق روابط ديناميكية ، فافعل ذلك الآن.

      إذا قمت بالفعل بإنشاء مجال روابط ديناميكية ، فقم بتدوين ذلك. عادة ما يبدو مجال الروابط الديناميكية مثل المثال التالي:

      example.page.link

      ستحتاج إلى هذه القيمة عند تكوين تطبيق iOS أو Android لاعتراض الرابط الوارد.

  2. تكوين تطبيقات iOS:

    1. إذا كنت تخطط للتعامل مع هذه الروابط من تطبيق iOS الخاص بك ، فيجب تحديد معرف حزمة iOS في إعدادات مشروع Firebase Console. بالإضافة إلى ذلك ، يجب أيضًا تحديد معرف متجر التطبيقات ومعرف فريق مطوري Apple.
    2. ستحتاج أيضًا إلى تكوين مجال معالج إجراء البريد الإلكتروني الخاص بك كمجال مرتبط في إمكانات التطبيق الخاص بك. افتراضيا، يتم استضافتها معالج عمل البريد الإلكتروني على نطاق مثل المثال التالي:
      APP_ID.firebaseapp.com
    3. إذا كنت تخطط لتوزيع تطبيقك على إصدارات iOS 8 وما دونها ، فستحتاج إلى تعيين معرف حزمة iOS الخاص بك كمخطط مخصص لعناوين URL الواردة.
    4. لمعرفة المزيد عن هذا، تشير إلى تلقي تعليمات دائرة الرقابة الداخلية دينامية سريعة .

بعد تلقي الارتباط كما هو موضح أعلاه ، تحقق من أنه مخصص لمصادقة ارتباط البريد الإلكتروني وأكمل تسجيل الدخول.

سويفت

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.
  }];

ومع ذلك ، نظرًا لأن التدفق قد ينتهي على جهاز مختلف حيث لم يتم تسجيل دخول المستخدم الأصلي ، فقد لا يكتمل هذا التدفق. في هذه الحالة ، يمكن أن يظهر خطأ للمستخدم لإجباره على فتح الرابط على نفس الجهاز. يمكن تمرير بعض الحالات في الرابط لتوفير معلومات عن نوع العملية ومعرف المستخدم.

في حال كنت دعم كل كلمة المرور و تسجيل الدخول مع البريد الإلكتروني، للتمييز بين طريقة تسجيل الدخول للمستخدم كلمة السر / وصلة، استخدام القائمة على صلة fetchSignInMethodsForEmail . يُعد هذا مفيدًا لعمليات تدفقات المعرف أولاً حيث يُطلب من المستخدم أولاً تقديم بريده الإلكتروني ثم تقديم طريقة تسجيل الدخول:

سويفت

 // After asking the user for their email.
 Auth.auth().fetchSignInMethods(forEmail: email) { signInMethods, error in
   // This returns the same array as fetchProviders(forEmail:completion:) but for email
   // provider identified by 'password' string, signInMethods would contain 2
   // different strings:
   // 'emailLink' if the user previously signed in with an email/link
   // 'password' if the user has a password.
   // A user could have both.
   if (error) {
     // Handle error case.
   }
   if (!signInMethods.contains(EmailPasswordAuthSignInMethod)) {
     // User can sign in with email/password.
   }
   if (!signInMethods.contains(EmailLinkAuthSignInMethod)) {
     // User can sign in with email/link.
   }
 }

ج موضوعية

 // After asking the user for their email.
 [FIRAuth auth] fetchSignInMethodsForEmail:email
                                completion:^(NSArray *_Nullable signInMethods,
                                             NSError *_Nullable error) {
   // This returns the same array as fetchProvidersForEmail but for email
   // provider identified by 'password' string, signInMethods would contain 2
   // different strings:
   // 'emailLink' if the user previously signed in with an email/link
   // 'password' if the user has a password.
   // A user could have both.
   if (error) {
     // Handle error case.
   }
   if (![signInMethods containsObject:FIREmailPasswordAuthSignInMethod]) {
     // User can sign in with email/password.
   }
   if (![signInMethods containsObject:FIREmailLinkAuthSignInMethod]) {
     // User can sign in with email/link.
   }
 }];

كما هو موضح أعلاه البريد الإلكتروني / كلمة المرور والبريد الإلكتروني / رابط تعتبر نفسها FIREmailAuthProvider (نفس PROVIDER_ID ) مع أساليب مختلفة من تسجيل الدخول.

الخطوات التالية

بعد أن يقوم المستخدم بتسجيل الدخول لأول مرة ، يتم إنشاء حساب مستخدم جديد وربطه ببيانات الاعتماد - أي اسم المستخدم وكلمة المرور أو رقم الهاتف أو معلومات موفر المصادقة - المستخدم الذي قام بتسجيل الدخول باستخدام. يتم تخزين هذا الحساب الجديد كجزء من مشروع Firebase الخاص بك ، ويمكن استخدامه لتحديد هوية مستخدم عبر كل تطبيق في مشروعك ، بغض النظر عن كيفية تسجيل المستخدم للدخول.

  • في التطبيقات الخاصة بك، يمكنك الحصول على المعلومات الشخصية الأساسية للمستخدم من FIRUser الكائن. انظر إدارة المستخدمين .

  • في قاعدة البيانات الخاصة بك Firebase الحقيقي وسحابة التخزين قواعد الأمن ، يمكنك الحصول على قعت في هوية المستخدم الفريد المستخدم من 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;
}

قد ترغب أيضًا في إضافة رمز معالجة الأخطاء للنطاق الكامل من أخطاء المصادقة. نرى أخطاء مقبض .