قم بالمصادقة مع Firebase باستخدام رابط البريد الإلكتروني على أنظمة Apple الأساسية

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

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

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

قبل ان تبدأ

استخدم Swift Package Manager لتثبيت تبعيات Firebase وإدارتها.

  1. في Xcode، مع فتح مشروع التطبيق الخاص بك، انتقل إلى File > Add Packages .
  2. عندما يُطلب منك ذلك، قم بإضافة مستودع Firebase Apple الأساسي لـ SDK:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. اختر مكتبة مصادقة Firebase.
  5. أضف علامة -ObjC إلى قسم إشارات الرابط الأخرى في إعدادات إنشاء هدفك.
  6. عند الانتهاء، سيبدأ Xcode تلقائيًا في حل وتنزيل تبعياتك في الخلفية.

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

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

لبدء تدفق المصادقة، قدم للمستخدم واجهة تطالب المستخدم بتقديم عنوان بريده الإلكتروني ثم اتصل بـ sendSignInLink ليطلب من Firebase إرسال رابط المصادقة إلى البريد الإلكتروني للمستخدم.

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

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

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

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

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

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

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

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

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

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

      example.page.link

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

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

    1. إذا كنت تخطط للتعامل مع هذه الروابط من تطبيقك، فيجب تحديد معرف الحزمة في إعدادات مشروع Firebase Console. بالإضافة إلى ذلك، يجب أيضًا تحديد معرف متجر التطبيقات ومعرف فريق مطوري Apple.
    2. ستحتاج أيضًا إلى تكوين مجال معالج إجراء البريد الإلكتروني الخاص بك كمجال مرتبط في إمكانيات التطبيق الخاص بك. افتراضيًا، تتم استضافة معالج إجراء البريد الإلكتروني على مجال مثل المثال التالي:
      APP_ID.firebaseapp.com
    3. إذا كنت تخطط لتوزيع تطبيقك على إصدار iOS 8 أو أقل، فستحتاج إلى تعيين معرف الحزمة الخاص بك كمخطط مخصص لعناوين URL الواردة.
    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) {
      // ...
    }];
}

للتعرف على كيفية التعامل مع تسجيل الدخول باستخدام رابط البريد الإلكتروني في تطبيق Android، راجع دليل Android .

للتعرف على كيفية التعامل مع تسجيل الدخول باستخدام رابط البريد الإلكتروني في تطبيق ويب، راجع دليل الويب .

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

سيكون الفرق في النصف الثاني من العملية:

سويفت

  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() ، والتي أوصينا بها سابقًا لتنفيذ تدفقات المعرف أولاً.

على الرغم من أنه يمكنك تعطيل حماية تعداد البريد الإلكتروني لمشروعك، إلا أننا نوصي بعدم القيام بذلك.

راجع الوثائق الخاصة بحماية تعداد البريد الإلكتروني لمزيد من التفاصيل.

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

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

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

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

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