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

يمكنك استخدام Firebase Authentication لتسجيل دخول مستخدم من خلال إرسال رسالة SMS إلى هاتف المستخدم. يسجّل المستخدم الدخول باستخدام رمز يُستخدم لمرة واحدة وارد في رسالة SMS.

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

قبل البدء

  1. إذا لم يسبق لك ربط تطبيقك بمشروع Firebase، يمكنك إجراء ذلك من خلال وحدة تحكّم Firebase.
  2. استخدِم Swift Package Manager لتثبيت تبعيات Firebase وإدارتها.

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

المخاوف المرتبطة بالأمان

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

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

تفعيل ميزة تسجيل الدخول باستخدام رقم الهاتف في مشروع Firebase

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

  1. في وحدة تحكّم Firebase، انتقِل إلى الأمان > المصادقة.
  2. في علامة التبويب طريقة تسجيل الدخول، فعِّل موفّر خدمة تسجيل الدخول باستخدام الهاتف.
  3. يمكنك ضبط سياسة على المناطق التي تريد السماح بإرسال رسائل SMS إليها أو رفضها. يمكن أن يساعد ضبط سياسة منطقة الرسائل القصيرة في حماية تطبيقاتك من إساءة استخدام الرسائل القصيرة. بالنسبة إلى المشاريع الجديدة، لا تسمح السياسة التلقائية بأي مناطق.
    1. في وحدة تحكّم Firebase، انتقِل إلى علامة التبويب الأمان > المصادقة > الإعدادات.
    2. في قسم سياسة منطقة الرسائل القصيرة، اضبط سياسة منطقة الرسائل القصيرة.

تفعيل ميزة "التحقّق من التطبيقات"

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

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

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

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

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

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

لتفعيل إشعارات APNs لاستخدامها مع Firebase Authentication:

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

    1. في وحدة تحكّم "Firebase"، انتقِل إلى الإعدادات > إعدادات عامة. بعد ذلك، انقر على علامة التبويب خدمة المراسلة عبر السحابة الإلكترونية.
    2. في مفتاح مصادقة APNs ضمن إعدادات تطبيق iOS، انقر على تحميل لتحميل مفتاح مصادقة التطوير أو مفتاح مصادقة الإنتاج أو كليهما. ويجب توفير طريقة اتصال واحدة على الأقل.
    3. انتقِل إلى الموقع الذي حفظت فيه مفتاحك، واختَره، ثم انقر على فتح. أضِف معرّف المفتاح (المتوفّر في مركز أعضاء مطوّري Apple) وانقر على تحميل.

    إذا كان لديك شهادة APNs، يمكنك تحميلها بدلاً من ذلك.

  3. في Xcode، فعِّل ميزة "أوضاع الخلفية" (Background Modes) لمشروعك، ثم ضَع علامة في مربّعَي الاختيار لوضعَي الجلب في الخلفية (Background fetch) والإشعارات عن بُعد (Remote notifications).

إعداد اختبار التحقّق reCAPTCHA

لتفعيل حزمة Firebase SDK من أجل استخدام اختبار التحقّق reCAPTCHA، اتّبِع الخطوات التالية:

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

      يمكنك العثور على رقم تعريف التطبيق المشفَّر في وحدة تحكّم Firebase: انتقِل إلى الإعدادات > علامة التبويب عام، ثم انتقِل للأسفل إلى قسم تطبيقاتك لعرض تفاصيل عن تطبيق iOS.

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

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

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

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

  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 رسالة SMS ثانية ما لم تنتهِ مهلة الطلب الأصلي.

    عند طلب 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.

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

بعد أن يقدّم المستخدم لتطبيقك رمز التحقّق من رسالة 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 Emulator بدون "خدمات Google Play".
  • كتابة اختبارات التكامل بدون أن يتم حظرها من خلال عمليات التحقّق من الأمان التي يتم تطبيقها عادةً على أرقام الهواتف الحقيقية في بيئة التشغيل الفعلي

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

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

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

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

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

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

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

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

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

اختبار التكامل

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

على أجهزة iOS، يجب ضبط الإعداد appVerificationDisabledForTesting على TRUE قبل استدعاء verifyPhoneNumber. تتم معالجة هذه العملية بدون الحاجة إلى أي رمز مميّز لخدمة APNs أو إرسال إشعارات فورية صامتة في الخلفية، ما يسهّل الاختبار في المحاكي. يؤدي هذا أيضًا إلى إيقاف مسار احتياطي 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 let error = error {
      // Handles error
      self.handleError(error)
      return
    }
    let credential = PhoneAuthProvider.provider().credential(withVerificationID: verificationID ?? "",
                                                               verificationCode: testVerificationCode)
    Auth.auth().signIn(with: credential) { authResult, error in
      if let error = error {
        // Handles error
        self.handleError(error)
        return
      }
      _user = authResult.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 Authentication ميزة تغيير وظيفة الإجراء للحصول تلقائيًا على رمز APNs المميّز لتطبيقك، والتعامل مع الإشعارات الفورية الصامتة التي يرسلها Firebase إلى تطبيقك، والاعتراض تلقائيًا على إعادة التوجيه المخصّصة للمخطط من صفحة اختبار التحقّق reCAPTCHA أثناء عملية التحقّق.

إذا كنت تفضّل عدم استخدام ميزة "تبديل الطرق"، يمكنك إيقافها عن طريق إضافة العلامة FirebaseAppDelegateProxyEnabled إلى ملف Info.plist الخاص بتطبيقك وضبطها على NO. يُرجى العِلم أنّ ضبط هذه العلامة على NO يؤدي أيضًا إلى إيقاف التبديل لمنتجات Firebase الأخرى، بما في ذلك Firebase Cloud Messaging.

في حال إيقاف ميزة swizzling، عليك تمرير رمز جهاز APNs والإشعارات الفورية وعنوان URL لإعادة التوجيه للمخطط المخصّص إلى Firebase Authentication بشكل صريح.

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

للحصول على الرمز المميّز لجهاز APNs، نفِّذ الطريقة application(_:didRegisterForRemoteNotificationsWithDeviceToken:) ومرِّر الرمز المميّز للجهاز إلى طريقة setAPNSToken(_:type:) في Auth.

Swift

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

  // 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&ltUIOpenURLContext&gt) {
  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&ltUIOpenURLContext *&gt *)URLContexts {
  for (UIOpenURLContext *urlContext in URLContexts) {
    [FIRAuth.auth canHandleURL:urlContext.url];
    // URL not auth related; it should be handled separately.
  }
}

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

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

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

  • في قواعد الأمان في Firebase Realtime Database و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;
}

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