المصادقة مع Firebase على أنظمة Apple الأساسية باستخدام رقم هاتف

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

إنّ أسهل طريقة لإضافة معلومات تسجيل الدخول باستخدام رقم الهاتف إلى تطبيقك هي استخدام FirebaseUI، التي تتضمّن أداة لتسجيل الدخول تتيح تنفيذ عمليات تسجيل الدخول لتسجيل الدخول باستخدام رقم الهاتف، بالإضافة إلى ميزة تسجيل الدخول الموحَّدة والمستنِدة إلى كلمة المرور. يصف هذا المستند كيفية تنفيذ عملية تسجيل الدخول إلى رقم هاتف باستخدام حزمة تطوير البرامج (SDK) لمنصّة Firebase.

قبل البدء

  1. إذا لم تكن قد ربطت تطبيقك بمشروعك في Firebase، يمكنك إجراء ذلك من خلال وحدة تحكُّم Firebase.
  2. يمكنك استخدام "مدير حزم 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

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

  1. في وحدة تحكُّم Firebase، افتح قسم المصادقة.
  2. في صفحة طريقة تسجيل الدخول، فعِّل طريقة تسجيل الدخول رقم الهاتف.

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

تفعيل التحقق من التطبيقات

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

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

    بالنسبة إلى نظام التشغيل iOS 8.0 والإصدارات الأحدث، لا تتطلب الإشعارات الصامتة موافقة صريحة من المستخدم، وبالتالي لا تتأثر برفض المستخدم تلقِّي إشعارات أسماء نقاط الوصول (APN) في التطبيق. وبالتالي، لا يحتاج التطبيق إلى طلب إذن المستخدم لتلقّي إشعارات فورية عند تنفيذ مصادقة رقم الهاتف في Firebase.

  • التحقُّق من reCAPTCHA: إذا تعذّر إرسال أو تلقّي إشعارات فورية صامتة، مثلاً عند إيقاف المستخدم لإعادة تحميل الخلفية لتطبيقك، أو عند اختبار تطبيقك على محاكي iOS، تستخدم مصادقة Firebase اختبار التحقق من reCAPTCHA لإكمال عملية تسجيل الدخول عبر الهاتف. ويمكن في كثير من الأحيان إكمال تحدي reCAPTCHA بدون أن يحتاج المستخدم إلى حلّ أي مشكلة.

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

بدء تلقّي إشعارات صامتة

لتفعيل إشعارات أسماء نقاط الوصول (APN) للاستخدام مع مصادقة Firebase:

  1. في Xcode، يمكنك تفعيل الإشعارات الفورية لمشروعك.
  2. حمِّل مفتاح مصادقة أسماء نقاط الوصول إلى Firebase. إذا لم يكن لديك مفتاح مصادقة لأسماء نقاط الوصول (APN)، احرص على إنشاء مفتاح في مركز أعضاء المطوّرين في Apple.

    1. من داخل مشروعك في وحدة تحكُّم Firebase، اختَر رمز الترس، ثمّ اختَر إعدادات المشروع (Project Settings)، ثم اختَر علامة التبويب المراسلة عبر السحابة الإلكترونية.

    2. في مفتاح مصادقة أسماء نقاط الوصول (APN) ضمن ضبط تطبيق iOS، انقر على الزر تحميل.

    3. انتقِل إلى الموقع الجغرافي الذي حفظت فيه المفتاح واختَره وانقر على فتح. أضِف معرّف المفتاح (المتوفّر في Apple Developer Member Center) وانقر على Upload (تحميل).

    إذا كانت لديك شهادة أسماء نقاط الوصول (APN)، يمكنك تحميل الشهادة بدلاً من ذلك.

إعداد اختبار reCAPTCHA

لتفعيل حزمة تطوير البرامج (SDK) لمنصة Firebase من استخدام إثبات الملكية باستخدام reCAPTCHA، يُرجى اتّباع الخطوات التالية:

  1. أضِف مخططات عناوين URL مخصّصة إلى مشروع Xcode:
    1. افتح إعدادات المشروع: انقر مرّتين على اسم المشروع في العرض التدرّجي الأيمن. اختَر تطبيقك من القسم الاستهدافات، ثم اختَر علامة التبويب المعلومات، ووسِّع القسم أنواع عناوين URL.
    2. انقر على الزر + وأضِف رقم تعريف التطبيق المشفر كمخطط عنوان URL. يمكنك العثور على رقم تعريف التطبيق المرمّز في صفحة الإعدادات العامة ضمن "وحدة تحكُّم Firebase" ضمن قسم تطبيق iOS. واترك الحقول الأخرى فارغة.

      عند اكتمال العملية، من المفترض أن تظهر الإعدادات بشكل مشابه لما يلي (ولكن مع القيم الخاصة بالتطبيق):

      لقطة شاشة لواجهة إعداد مخطط عنوان URL المخصّص في Xcode
  2. اختياري: إذا كنت تريد تخصيص طريقة عرض تطبيقك للسمة SFSafariViewController عند عرض reCAPTCHA للمستخدم، أنشئ فئة مخصّصة تتوافق مع بروتوكول AuthUIDelegate وأرسِلها إلى verifyPhoneNumber(_:uiDelegate:completion:).

إرسال رمز تحقُّق إلى هاتف المستخدم

لبدء تسجيل الدخول إلى رقم الهاتف، قدِّم للمستخدم واجهة تطلب منه تقديم رقم هاتفه، ثم اتصِل بالرقم verifyPhoneNumber(_:uiDelegate:completion:) لطلب إرسال رمز المصادقة من Firebase إلى هاتف المستخدم عن طريق الرسائل القصيرة SMS:

  1. الحصول على رقم هاتف المستخدم

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

  2. يمكنك الاتصال بالرقم verifyPhoneNumber(_:uiDelegate:completion:)، وتمرير رقم هاتف المستخدم إليه.

    Swift

    PhoneAuthProvider.provider()
      .verifyPhoneNumber(phoneNumber, uiDelegate: nil) { verificationID, error in
          if let error = error {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // Sign in using the verificationID and the code sent to the user
          // ...
      }

    Objective-C

    [[FIRPhoneAuthProvider provider] verifyPhoneNumber:userInput
                                            UIDelegate:nil
                                            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
      if (error) {
        [self showMessagePrompt:error.localizedDescription];
        return;
      }
      // Sign in using the verificationID and the code sent to the user
      // ...
    }];

    الطريقة verifyPhoneNumber هي إعادة مشاركة: إذا طلبتها عدة مرات، كما هو الحال في طريقة onAppear في الملف الشخصي، لن ترسل طريقة verifyPhoneNumber رسالة قصيرة ثانية ما لم تنتهِ مهلة الطلب الأصلي.

    عند الاتصال بـ verifyPhoneNumber(_:uiDelegate:completion:)، يرسل Firebase إشعارًا فوريًا صامتًا إلى تطبيقك أو يُصدر تحدي reCAPTCHA إلى المستخدم. بعد أن يتلقّى تطبيقك الإشعار أو يكمل المستخدم تحدّي reCAPTCHA، يرسل Firebase رسالة قصيرة SMS تحتوي على رمز المصادقة إلى رقم الهاتف المحدّد وتمرِّر معرّف إثبات الملكية إلى دالة الإكمال. ستحتاج إلى كلّ من رمز التحقّق ورقم تعريف إثبات الهوية لتسجيل دخول المستخدم.

    يمكن أيضًا ترجمة رسالة SMS المُرسَلة من Firebase من خلال تحديد لغة المصادقة عبر السمة languageCode في مثيل المصادقة.

    Swift

     // Change language code to french.
     Auth.auth().languageCode = "fr";
    

    Objective-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. احفظ رقم تعريف إثبات الهوية واستعادته عند تحميل تطبيقك. ومن خلال إجراء ذلك، يمكنك التأكّد من أنّه ما زال لديك رقم تعريف صالح لإثبات الهوية في حال تم إغلاق تطبيقك قبل أن يكمل المستخدم عملية تسجيل الدخول (على سبيل المثال، أثناء التبديل إلى تطبيق SMS).

    يمكنك الاحتفاظ بمعرّف إثبات الملكية بالطريقة التي تريدها. هناك طريقة بسيطة وهي حفظ رقم تعريف إثبات الهوية باستخدام عنصر NSUserDefaults:

    Swift

    UserDefaults.standard.set(verificationID, forKey: "authVerificationID")
    

    Objective-C

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:verificationID forKey:@"authVerificationID"];
    

    بعد ذلك، يمكنك استعادة القيمة المحفوظة:

    Swift

    let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
    

    Objective-C

    NSString *verificationID = [defaults stringForKey:@"authVerificationID"];
    

إذا نجحت المكالمة إلى verifyPhoneNumber(_:uiDelegate:completion:)، يمكنك مطالبة المستخدم بكتابة رمز التحقق عند تلقّيه في رسالة SMS.

سجّل دخول المستخدم باستخدام رمز التحقق

بعد أن يقدّم المستخدم رمز التحقّق الوارد في الرسالة القصيرة إلى تطبيقك، عليك تسجيل دخوله من خلال إنشاء عنصر FIRPhoneAuthCredential من رمز التحقّق ورقم تعريف التحقّق وتمريره إلى signInWithCredential:completion:.

  1. احصل على رمز إثبات الهوية من المستخدم.
  2. أنشِئ عنصر FIRPhoneAuthCredential من رمز إثبات الهوية ورقم تعريف إثبات الهوية.

    Swift

    let credential = PhoneAuthProvider.provider().credential(
      withVerificationID: verificationID,
      verificationCode: verificationCode
    )

    Objective-C

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. تسجيل دخول المستخدم باستخدام الكائن FIRPhoneAuthCredential:

    Swift

    Auth.auth().signIn(with: credential) { authResult, error in
        if let error = error {
          let authError = error as NSError
          if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue {
            // The user is a multi-factor user. Second factor challenge is required.
            let resolver = authError
              .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
            var displayNameString = ""
            for tmpFactorInfo in resolver.hints {
              displayNameString += tmpFactorInfo.displayName ?? ""
              displayNameString += " "
            }
            self.showTextInputPrompt(
              withMessage: "Select factor to sign in\n\(displayNameString)",
              completionBlock: { userPressedOK, displayName in
                var selectedHint: PhoneMultiFactorInfo?
                for tmpFactorInfo in resolver.hints {
                  if displayName == tmpFactorInfo.displayName {
                    selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
                  }
                }
                PhoneAuthProvider.provider()
                  .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil,
                                     multiFactorSession: resolver
                                       .session) { verificationID, error in
                    if error != nil {
                      print(
                        "Multi factor start sign in failed. Error: \(error.debugDescription)"
                      )
                    } else {
                      self.showTextInputPrompt(
                        withMessage: "Verification code for \(selectedHint?.displayName ?? "")",
                        completionBlock: { userPressedOK, verificationCode in
                          let credential: PhoneAuthCredential? = PhoneAuthProvider.provider()
                            .credential(withVerificationID: verificationID!,
                                        verificationCode: verificationCode!)
                          let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator
                            .assertion(with: credential!)
                          resolver.resolveSignIn(with: assertion!) { authResult, error in
                            if error != nil {
                              print(
                                "Multi factor finanlize sign in failed. Error: \(error.debugDescription)"
                              )
                            } else {
                              self.navigationController?.popViewController(animated: true)
                            }
                          }
                        }
                      )
                    }
                  }
              }
            )
          } else {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // ...
          return
        }
        // User is signed in
        // ...
    }

    Objective-C

    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                           NSError * _Nullable error) {
        if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
          FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
          NSMutableString *displayNameString = [NSMutableString string];
          for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
            [displayNameString appendString:tmpFactorInfo.displayName];
            [displayNameString appendString:@" "];
          }
          [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                               completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
           FIRPhoneMultiFactorInfo* selectedHint;
           for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
             if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
               selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
             }
           }
           [FIRPhoneAuthProvider.provider
            verifyPhoneNumberWithMultiFactorInfo:selectedHint
            UIDelegate:nil
            multiFactorSession:resolver.session
            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
              if (error) {
                [self showMessagePrompt:error.localizedDescription];
              } else {
                [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                     completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
                 FIRPhoneAuthCredential *credential =
                     [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                                  verificationCode:verificationCode];
                 FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
                 [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
                   if (error) {
                     [self showMessagePrompt:error.localizedDescription];
                   } else {
                     NSLog(@"Multi factor finanlize sign in succeeded.");
                   }
                 }];
               }];
              }
            }];
         }];
        }
      else if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      if (authResult == nil) { return; }
      FIRUser *user = authResult.user;
      // ...
    }];

الاختبار باستخدام أرقام هواتف خيالية

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

  • يمكنك اختبار مصادقة رقم الهاتف بدون استهلاك حصة الاستخدام.
  • اختبار مصادقة رقم الهاتف بدون إرسال رسالة SMS فعلية.
  • يمكنك إجراء اختبارات متتالية باستخدام رقم الهاتف نفسه بدون تقييد. ويقلّل ذلك من خطر الرفض أثناء عملية مراجعة متجر التطبيقات إذا تصادف أن يستخدم المُراجع رقم الهاتف نفسه للاختبار.
  • يمكنك الاختبار بسهولة في بيئات التطوير بدون أي جهد إضافي، مثل القدرة على التطوير باستخدام محاكي iOS أو محاكي Android بدون "خدمات Google Play".
  • يمكنك كتابة اختبارات الدمج بدون حظر عمليات فحص الأمان التي يتم تطبيقها عادةً على أرقام هواتف حقيقية في بيئة إنتاج.

يجب أن تستوفي أرقام الهواتف الخيالية المتطلبات التالية:

  1. احرص على استخدام أرقام هواتف خيالية بالفعل، وغير موجودة. لا تسمح لك مصادقة Firebase بضبط أرقام الهواتف الحالية التي يستخدمها مستخدمون حقيقيون كأرقام اختبار. أحد الخيارات المتاحة هو استخدام 555 رقمًا يبدأ ببادئة كأرقام هواتف تجريبية في الولايات المتحدة، مثلاً: +1 650-555-3434
  2. يجب أن تكون أرقام الهواتف منسَّقة بشكل صحيح لتناسب طولها وغيرها من القيود. سيظلان يخضعان لعملية التحقق نفسها مثل رقم هاتف المستخدم الحقيقي.
  3. يمكنك إضافة ما يصل إلى 10 أرقام هواتف لعملية التطوير.
  4. استخدِم أرقام هواتف أو رموزًا اختبارية يصعب تخمينها وتغييرها بشكل متكرّر.

إنشاء أرقام هواتف ورموز تحقُّق وهمية

  1. في وحدة تحكُّم Firebase، افتح قسم المصادقة.
  2. في علامة التبويب طريقة تسجيل الدخول، فعِّل مقدِّم خدمة الهاتف إذا لم يسبق لك إجراء ذلك.
  3. افتح قائمة أكورديون أرقام الهاتف للاختبار.
  4. أدخِل رقم الهاتف الذي تريد اختباره، على سبيل المثال: +1 650-555-3434.
  5. أدخِل رمز التحقّق المكوَّن من 6 أرقام لهذا الرقم تحديدًا، على سبيل المثال: 654321.
  6. أضِف الرقم. وإذا لزم الأمر، يمكنك حذف رقم الهاتف ورمزه من خلال تمرير مؤشر الماوس فوق الصف المقابل والنقر على رمز المهملات.

الاختبار اليدوي

يمكنك البدء مباشرةً في استخدام رقم هاتف وهمي في تطبيقك. ويتيح لك ذلك إجراء اختبار يدوي أثناء مراحل التطوير بدون التعرُّض إلى مشاكل متعلّقة بالحصة أو التقييد. يمكنك أيضًا إجراء الاختبارات مباشرةً من خلال محاكي iOS أو محاكي Android بدون تثبيت "خدمات Google Play".

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

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

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

اختبار الدمج

بالإضافة إلى الاختبار اليدوي، توفّر مصادقة Firebase واجهات برمجة تطبيقات للمساعدة في كتابة اختبارات الدمج لاختبار مصادقة الهاتف. وتوقِف واجهات برمجة التطبيقات هذه التحقّق من التطبيقات من خلال إيقاف متطلبات reCAPTCHA في الويب والإشعارات الفورية الصامتة في نظام التشغيل iOS. وهذا يجعل اختبار الأتمتة ممكنًا في هذه التدفقات وأسهل في التنفيذ. بالإضافة إلى ذلك، تساعد في توفير إمكانية اختبار خطوات إثبات الملكية الفوري على Android.

على iOS، يجب ضبط الإعداد appVerificationDisabledForTesting على TRUE قبل طلب الرقم verifyPhoneNumber. وتتم معالجة هذه العملية بدون الحاجة إلى استخدام أي رمز مميز لأسماء نقاط الوصول (APN) أو إرسال إشعارات فورية صامتة في الخلفية، ما يسهّل عملية الاختبار في المحاكي. يؤدي ذلك أيضًا إلى إيقاف مسار reCAPTCHA الاحتياطي.

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

Swift

let phoneNumber = "+16505554567"

// This test verification code is specified for the given test phone number in the developer console.
let testVerificationCode = "123456"

Auth.auth().settings.isAppVerificationDisabledForTesting = TRUE
PhoneAuthProvider.provider().verifyPhoneNumber(phoneNumber, uiDelegate:nil) {
                                                            verificationID, error in
    if (error) {
      // Handles error
      self.handleError(error)
      return
    }
    let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",
                                                               verificationCode: testVerificationCode)
    Auth.auth().signInAndRetrieveData(with: credential) { authData, error in
      if (error) {
        // Handles error
        self.handleError(error)
        return
      }
      _user = authData.user
    }];
}];

Objective-C

NSString *phoneNumber = @"+16505554567";

// This test verification code is specified for the given test phone number in the developer console.
NSString *testVerificationCode = @"123456";

[FIRAuth auth].settings.appVerificationDisabledForTesting = YES;
[[FIRPhoneAuthProvider provider] verifyPhoneNumber:phoneNumber
                                        completion:^(NSString *_Nullable verificationID,
                                                     NSError *_Nullable error) {
    if (error) {
      // Handles error
      [self handleError:error];
      return;
    }
    FIRAuthCredential *credential =
        [FIRPhoneAuthProvider credentialWithVerificationID:verificationID
                                          verificationCode:testVerificationCode];
    [FIRAuth auth] signInWithAndRetrieveDataWithCredential:credential
                                                completion:^(FIRUser *_Nullable user,
                                                             NSError *_Nullable error) {
      if (error) {
        // Handles error
        [self handleError:error];
        return;
      }
      _user = user;
    }];
}];

الملحق: استخدام تسجيل الدخول عبر الهاتف بدون تحريك

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

إذا كنت تفضّل عدم استخدام Swizzing، يمكنك إيقافه من خلال إضافة العلامة FirebaseAppDelegateProxyEnabled إلى ملف Info.plist في تطبيقك وضبطه على NO. تجدر الإشارة إلى أنّ ضبط هذه العلامة على NO يؤدي أيضًا إلى إيقاف التبديل في منتجات Firebase الأخرى، بما في ذلك المراسلة عبر السحابة الإلكترونية من Firebase.

في حال إيقاف الدوران، يجب تمرير الرمز المميّز للجهاز لأسماء نقاط الوصول (APN) والإشعارات الفورية وعنوان URL لإعادة توجيه المخطط المخصّص إلى مصادقة Firebase.

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

للحصول على الرمز المميّز للجهاز لأسماء نقاط الوصول (APN)، نفِّذ الطريقة application(_:didRegisterForRemoteNotificationsWithDeviceToken:) وأدخِل فيها الرمز المميّز للجهاز إلى الطريقة setAPNSToken(_:type:) الخاصة بـ Auth.

Swift

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
  // Pass device token to auth
  Auth.auth().setAPNSToken(deviceToken, type: .prod)

  // Further handling of the device token if needed by the app
  // ...
}

Objective-C

- (void)application:(UIApplication *)application
    didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
  // Pass device token to auth.
  [[FIRAuth auth] setAPNSToken:deviceToken type:FIRAuthAPNSTokenTypeProd];
  // Further handling of the device token if needed by the app.
}

للتعامل مع الإشعارات الفورية، في الطريقة application(_:didReceiveRemoteNotification:fetchCompletionHandler:):، تحقَّق من الإشعارات المتعلّقة بمصادقة Firebase من خلال طلب إجراء canHandleNotification(_:) من Auth.

Swift

func application(_ application: UIApplication,
    didReceiveRemoteNotification notification: [AnyHashable : Any],
    fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
  if Auth.auth().canHandleNotification(notification) {
    completionHandler(.noData)
    return
  }
  // This notification is not auth related; it should be handled separately.
}

Objective-C

- (void)application:(UIApplication *)application
    didReceiveRemoteNotification:(NSDictionary *)notification
          fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler {
  // Pass notification to auth and check if they can handle it.
  if ([[FIRAuth auth] canHandleNotification:notification]) {
    completionHandler(UIBackgroundFetchResultNoData);
    return;
  }
  // This notification is not auth related; it should be handled separately.
}

لمعالجة عنوان URL لإعادة توجيه المخطّط المخصّص، يجب تنفيذ الطريقة application(_:open:options:) وتمرير عنوان URL فيها إلى طريقة canHandleURL(_:) في Auth.

Swift

func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related; it should be handled separately.
}

Objective-C

- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related; it should be handled separately.
}

في حال استخدام SwiftUI أو UISceneDelegate، لمعالجة عنوان URL لإعادة التوجيه، نفِّذ طريقة scene(_:openURLContexts:) وأدخِل عنوان URL في كل منهما إلى الطريقة canHandleURL(_:) في Auth.

Swift

func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
  for urlContext in URLContexts {
      let url = urlContext.url
      Auth.auth().canHandle(url)
  }
  // URL not auth related; it should be handled separately.
}

Objective-C

- (void)scene:(UIScene *)scene openURLContexts:(NSSet<UIOpenURLContext *> *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.url];
    // URL not auth related; it should be handled separately.
  }
}

الخطوات اللاحقة

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

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