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

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

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

قبل البدء

  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 Developer Member Center) وانقر على تحميل.

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

  3. في Xcode، فعِّل ميزة "أوضاع التشغيل في الخلفية" لمشروعك، ثم ضَع علامة في مربّعات الاختيار الخاصة بوضعَي استرجاع البيانات في الخلفية والإشعارات عن بُعد.

إعداد اختبار التحقّق 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 رمز مصادقة إلى هاتف المستخدم عبر الرسائل القصيرة:

  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 في مثيل Auth.

    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 فعلية.
  • إجراء اختبارات متتالية باستخدام رقم الهاتف نفسه بدون أن يتم تقييد عدد مرات إجرائها يقلّل ذلك من خطر الرفض أثناء عملية مراجعة التطبيق على App Store إذا استخدم المراجع رقم الهاتف نفسه للاختبار.
  • إجراء الاختبارات بسهولة في بيئات التطوير بدون أي جهد إضافي، مثل إمكانية التطوير في محاكي iOS أو محاكي Android بدون "خدمات Google Play"
  • كتابة اختبارات الدمج بدون أن يتم حظرها من خلال عمليات التحقّق من الأمان التي يتم تطبيقها عادةً على أرقام الهواتف الحقيقية في بيئة التشغيل الفعلي

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

  1. تأكَّد من استخدام أرقام هواتف وهمية بالفعل وغير مستخدَمة من قبل. لا يسمح لك Firebase Authentication بضبط أرقام الهواتف الحالية التي يستخدمها مستخدمون حقيقيون كأرقام اختبارية. أحد الخيارات هو استخدام أرقام مسبوقة بالرقم 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 باستخدام رقم الهاتف هذا. يتصرف المستخدم ويملك الخصائص نفسها التي يملكها مستخدم رقم الهاتف الحقيقي، ويمكنه الوصول إلى 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 أثناء عملية التحقّق.

إذا كنت تفضّل عدم استخدام swizzling، يمكنك إيقافه عن طريق إضافة العلامة FirebaseAppDelegateProxyEnabled إلى ملف Info.plist الخاص بتطبيقك وضبطها على NO. يُرجى العِلم أنّ ضبط هذه العلامة على NO يؤدي أيضًا إلى إيقاف عملية swizzling لمنتجات 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، عليك تنفيذ الطريقة scene(_:openURLContexts:) لمعالجة عنوان URL لإعادة التوجيه، وتمرير عنوان 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;
}

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