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

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

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

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

قبل البدء

يمكنك استخدام "مدير حزم Swift" لتثبيت اعتماديات Firebase وإدارتها.

  1. في Xcode، بعد فتح مشروع تطبيقك، انتقِل إلى File > Add Packages (ملف > إضافة حِزم).
  2. أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Firebase Apple عندما يُطلب منك ذلك:
  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" للنطاقات المعتمَدة، والتي يمكن العثور عليها من خلال الانتقال إلى علامة التبويب "طريقة تسجيل الدخول" (المصادقة -> طريقة تسجيل الدخول).
    • iOSBundleID وandroidPackageName : التطبيقان المستخدمان المراد استخدامهما عند فتح رابط تسجيل الدخول على جهاز Android أو Apple. اطّلع على مزيد من المعلومات عن كيفية ضبط روابط Firebase الديناميكية لفتح روابط إجراءات البريد الإلكتروني عبر التطبيقات للأجهزة الجوّالة.
    • linkCodeInApp: تم ضبطه على "صحيح". يجب أن تكتمل عملية تسجيل الدخول دائمًا في التطبيق، على عكس الإجراءات الأخرى التي تتعلّق بالبريد الإلكتروني خارج النطاق (أي إعادة ضبط كلمة المرور وإثبات ملكية عنوان البريد الإلكتروني). ويرجع ذلك إلى أنّه في نهاية عملية الإعداد، يُتوقّع من المستخدم تسجيل الدخول واستمرار حالة المصادقة داخل التطبيق.
    • DynamicLinkDomain: عند تحديد عدة نطاقات للروابط الديناميكية المخصصة لمشروع ما، يمكنك تحديد النطاق الذي سيتم استخدامه عند فتح الرابط من خلال تطبيق متوافق مع الأجهزة الجوّالة محدد (على سبيل المثال، example.page.link)، وإلا يتم اختيار النطاق الأول تلقائيًا.

    Swift

    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")
    

    Objective-C

    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. أرسِل رابط المصادقة إلى البريد الإلكتروني للمستخدم واحفظ له البريد الإلكتروني في حال أكمل المستخدم عملية تسجيل الدخول إلى البريد الإلكتروني على الجهاز نفسه.

    Swift

    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")
        // ...
    }
    

    Objective-C

    [[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" تقديم عنوان البريد الإلكتروني للمستخدم عند إكمال عملية تسجيل الدخول. لنجاح عملية تسجيل الدخول، يجب أن يتطابق عنوان البريد الإلكتروني هذا مع العنوان الذي تم إرسال رابط تسجيل الدخول إليه في الأصل.

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

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

إكمال تسجيل الدخول في تطبيق للأجهزة الجوّالة من Apple

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

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

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

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

      إذا سبق لك إنشاء نطاق "روابط ديناميكية"، دوِّنه. يظهر نطاق الروابط الديناميكية عادةً على النحو التالي:

      example.page.link

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

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

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

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

Swift

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

Objective-C

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

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

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

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

سيكون الاختلاف في النصف الثاني من العملية:

Swift

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

Objective-C

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

يمكن استخدام ذلك أيضًا لإعادة مصادقة مستخدم رابط البريد الإلكتروني قبل تشغيل عملية حساسة.

Swift

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

Objective-C

  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 في الوقت الفعلي وقواعد أمان Cloud Storage، يمكنك الحصول على رقم تعريف المستخدم الفريد للمستخدم الذي سجّل الدخول من المتغيّر auth واستخدامه للتحكّم في البيانات التي يمكن للمستخدم الوصول إليها.

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

لتسجيل خروج مستخدم، يُرجى الاتصال بالرقم signOut:.

Swift

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

Objective-C

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

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