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

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

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

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

قبل البدء

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

  1. في Xcode، انتقِل إلى File (ملف) > بعد فتح مشروع التطبيق الخاص بك. إضافة حِزم
  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 Developer يجب أيضًا تحديد رقم تعريف الفريق.
    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;
}

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