احراز هویت با Firebase در پلاتفرم‌های Apple بااستفاده از شماره تلفن

می‌توانید از Firebase Authentication برای ورود کاربر به سیستم با ارسال پیامک به تلفن کاربر استفاده کنید. کاربر بااستفاده از کد یک‌بارمصرف موجود در پیامک به سیستم وارد می‌شود.

ساده‌ترین راه برای افزودن ورود به سیستم با شماره تلفن به برنامه‌تان استفاده از FirebaseUI است، که شامل ابزاره ورود به سیستم آماده‌ای است که جریان‌های ورود به سیستم را برای ورود به سیستم با شماره تلفن، و همچنین ورود به سیستم مبتنی بر گذرواژه و فدرال پیاده‌سازی می‌کند. این سند نحوه پیاده‌سازی جریان ورود به سیستم با شماره تلفن را بااستفاده از کیت توسعه نرم‌افزار Firebase شرح می‌دهد.

قبل از شروع

  1. اگر هنوز برنامه‌تان را به پروژه Firebase متصل نکرده‌اید، این کار را از کنسول Firebase انجام دهید.
  2. از Swift Package Manager برای نصب و مدیریت وابستگی‌های Firebase استفاده کنید.

    1. در Xcode، درحالی‌که پروژه برنامه‌تان باز است، به File > Add Packages (فایل > افزودن بسته‌ها) بروید.
    2. وقتی خواسته شد، مخزن کیت توسعه نرم‌افزار Firebase برای پلاتفرم‌های Apple را اضافه کنید:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. کتابخانه Firebase Authentication را انتخاب کنید.
    5. پرچم -ObjC را به بخش Other Linker Flags (سایر پرچم‌های پیونددهنده) در تنظیمات ساخت هدف اضافه کنید.
    6. وقتی تمام شد، Xcode به‌طور خودکار شروع به حل و بارگیری وابستگی‌های شما در پس‌زمینه می‌کند.

نگرانی‌های امنیتی

اصالت‌سنجی فقط بااستفاده از شماره تلفن، هرچند راحت است، اما نسبت به سایر روش‌های موجود امنیت کمتری دارد، زیرا مالکیت شماره تلفن به‌راحتی می‌تواند بین کاربران منتقل شود. همچنین، در دستگاه‌هایی که چند نمایه کاربر دارند، هر کاربری که بتواند پیامک دریافت کند می‌تواند بااستفاده از شماره تلفن دستگاه به سیستم حساب وارد شود.

اگر در برنامه‌تان از ورود به سیستم براساس شماره تلفن استفاده می‌کنید، باید آن را در کنار روش‌های ایمن‌تر ورود به سیستم ارائه دهید و کاربران را از معایب امنیتی استفاده از ورود به سیستم با شماره تلفن مطلع کنید.

ورود به سیستم با «شماره تلفن» را برای پروژه Firebase خود فعال کنید

برای ورود به سیستم کاربران ازطریق پیامک، ابتدا باید روش ورود به سیستم با «شماره تلفن» را برای پروژه Firebase خود فعال کنید:

  1. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.
  2. در برگه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم تلفن را فعال کنید.
  3. خط‌مشی‌ای برای مناطقی که می‌خواهید ارسال پیامک به آن‌ها مجاز یا ممنوع باشد تنظیم کنید. تنظیم خط‌مشی منطقه پیامک می‌تواند به محافظت از برنامه‌هایتان دربرابر سوءاستفاده از پیامک کمک کند. برای پروژه‌های جدید، خط‌مشی پیش‌فرض هیچ منطقه‌ای را مجاز نمی‌کند.
    1. در کنسول Firebase، به امنیت > اصالت‌سنجی > برگه تنظیمات بروید.
    2. در بخش خط‌مشی منطقه پیامک، خط‌مشی منطقه پیامک را تنظیم کنید.

فعال کردن درستی‌سنجی برنامه

برای استفاده از اصالت‌سنجی شماره تلفن، Firebase باید بتواند تأیید کند که درخواست‌های ورود به سیستم با شماره تلفن از برنامه شما ارسال می‌شود. دو روش وجود دارد که Firebase Authentication این کار را انجام می‌دهد:

  • اعلان‌های APN بی‌صدا: وقتی برای اولین‌بار کاربری را با شماره تلفنش در دستگاهی به سیستم وارد می‌کنید، Firebase Authentication بااستفاده از اعلان لحظه‌ای بی‌صدا، یک کد به دستگاه ارسال می‌کند. اگر برنامه‌تان اعلان را با موفقیت از Firebase دریافت کند، ورود به سیستم با شماره تلفن می‌تواند ادامه یابد.

    برای iOS 8.0 و نسخه‌های جدیدتر، اعلان‌های بی‌صدا به رضایت صریح کاربر نیاز ندارند و بنابراین تحت تأثیر رد کردن دریافت اعلان‌های APN در برنامه توسط کاربر قرار نمی‌گیرند. بنابراین، برنامه برای دریافت اعلان‌های لحظه‌ای هنگام اجرای اصالت‌سنجی شماره تلفن Firebase نیازی به درخواست اجازه کاربر ندارد.

  • درستی‌سنجی reCAPTCHA: درصورتی‌که ارسال یا دریافت اعلان لحظه‌ای بی‌صدا امکان‌پذیر نباشد، مثلاً وقتی کاربر بازآوری پس‌زمینه را برای برنامه شما غیرفعال کرده باشد یا وقتی برنامه شما در شبیه‌ساز iOS آزمایش می‌شود، Firebase Authentication از درستی‌سنجی reCAPTCHA برای تکمیل جریان ورود به سیستم با تلفن استفاده می‌کند. چالش reCAPTCHA اغلب می‌تواند بدون اینکه کاربر مجبور به حل کردن چیزی باشد تکمیل شود.

وقتی اعلان‌های لحظه‌ای بی‌صدا به‌درستی پیکربندی شده باشند، فقط درصد بسیار کمی از کاربران جریان reCAPTCHA را تجربه خواهند کرد. بااین‌حال، باید مطمئن شوید که ورود به سیستم با شماره تلفن به‌درستی کار می‌کند، چه اعلان‌های لحظه‌ای بی‌صدا دردسترس باشند چه نباشند.

شروع دریافت اعلان‌های بی‌صدا

برای فعال کردن اعلان‌های APN برای استفاده با Firebase Authentication:

  1. در Xcode، اعلان‌های لحظه‌ای را برای پروژه‌تان فعال کنید.
  2. کلید اصالت‌سنجی APN خود را در Firebase بارگذاری کنید. اگر ازقبل کلید اصالت‌سنجی APN ندارید، حتماً یکی در مرکز اعضای توسعه‌دهنده Apple ایجاد کنید.

    1. در کنسول Firebase، به تنظیمات > موارد کلی بروید. سپس، روی زبانه پیام‌رسانی ابری کلیک کنید.
    2. در کلید اصالت‌سنجی APN در بخش پیکربندی برنامه iOS، روی بارگذاری کلیک کنید تا کلید اصالت‌سنجی توسعه، یا کلید اصالت‌سنجی تولید، یا هر دو را بارگذاری کنید. حداقل یک مورد لازم است.
    3. به مکانی که کلیدتان را ذخیره کرده‌اید بروید، آن را انتخاب کنید، و روی باز کردن کلیک کنید. شناسه کلید را برای کلید (در مرکز اعضای توسعه‌دهنده Apple دردسترس است) اضافه کنید و روی بارگذاری کلیک کنید.

    اگر ازقبل گواهی APNs دارید، می‌توانید به‌جای آن گواهی را بارگذاری کنید

  3. در Xcode، قابلیت «حالت‌های پس‌زمینه» را برای پروژه‌تان فعال کنید، و سپس چارگوش‌های انتخاب را برای حالت‌های واکشی پس‌زمینه و اعلان‌های ازراه‌دور انتخاب کنید.

راه‌اندازی درستی‌سنجی reCAPTCHA

برای فعال کردن «کیت توسعه نرم‌افزار Firebase» برای استفاده از درستی‌سنجی reCAPTCHA:

  1. طرح‌واره‌های نشانی وب سفارشی را به پروژه Xcode خود اضافه کنید:
    1. پیکربندی پروژه را باز کنید: روی نام پروژه در نمای درختی سمت راست دوکلیک کنید. برنامه‌تان را از بخش TARGETS انتخاب کنید، سپس برگه Info را انتخاب کنید و بخش URL Types را ازهم باز کنید.
    2. روی دکمه + کلیک کنید و «شناسه برنامه کدگذاری‌شده» خود را به‌عنوان طرح‌واره نشانی وب اضافه کنید. فیلدهای دیگر را خالی بگذارید.

      می‌توانید «شناسه برنامه کدبندی‌شده» را در کنسول Firebase پیدا کنید: به تنظیمات > برگه موارد کلی بروید، سپس به بخش برنامه‌های شما پیمایش کنید تا جزئیات مربوط به برنامه iOS خود را مشاهده کنید.

      پس‌از تکمیل، پیکربندی شما باید چیزی شبیه به موارد زیر باشد (اما با مقادیر مختص برنامه‌تان):

      نماگرفت میانای راه‌اندازی طرح‌واره نشانی وب سفارشی Xcode
  2. اختیاری: اگر می‌خواهید نحوه ارائه SFSafariViewController توسط برنامه‌تان را هنگام نمایش reCAPTCHA به کاربر سفارشی‌سازی کنید، یک کلاس سفارشی ایجاد کنید که با پروتکل AuthUIDelegate مطابقت داشته باشد و آن را به verifyPhoneNumber(_:uiDelegate:completion:) ارسال کنید.

ارسال کد درستی‌سنجی به تلفن کاربر

برای شروع ورود به سیستم با شماره تلفن، واسطی به کاربر نشان دهید که از او می‌خواهد شماره تلفنش را ارائه دهد، سپس verifyPhoneNumber(_:uiDelegate:completion:) را فراخوانی کنید تا درخواست کنید Firebase کد اصالت‌سنجی را ازطریق پیامک به تلفن کاربر ارسال کند:

  1. شماره تلفن کاربر را دریافت کنید.

    الزامات قانونی متفاوت است، اما به‌عنوان روال مطلوب و برای تعیین انتظارات کاربران، باید به آن‌ها اطلاع دهید که اگر از ورود به سیستم با تلفن استفاده کنند، ممکن است پیامک درستی‌سنجی دریافت کنند و نرخ‌های استاندارد اعمال می‌شود.

  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 پیامکی حاوی کد اصالت‌سنجی به شماره تلفن مشخص‌شده ارسال می‌کند و شناسه درستی‌سنجی را به تابع تکمیل شما منتقل می‌کند. برای وارد کردن کاربر به سیستم، به کد درستی‌سنجی و شناسه درستی‌سنجی نیاز دارید.

    پیامک ارسال‌شده توسط Firebase را نیز می‌توان با مشخص کردن زبان اصالت‌سنجی ازطریق ویژگی languageCode در نمونه اصالت‌سنجی بومی‌سازی کرد.

    Swift

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

    Objective-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
  3. شناسه درستی‌سنجی را ذخیره کنید و هنگام بار شدن برنامه آن را بازیابی کنید. با انجام این کار، می‌توانید مطمئن شوید که اگر برنامه‌تان قبل‌از تکمیل جریان ورود به سیستم توسط کاربر (برای مثال، هنگام جابه‌جایی به برنامه پیامک) بسته شود، همچنان شناسه درستی‌سنجی معتبری دارید.

    می‌توانید شناسه درستی‌سنجی را به هر روشی که می‌خواهید حفظ کنید. یک راه ساده این است که شناسه درستی‌سنجی را با شیء 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:) موفقیت‌آمیز باشد، می‌توانید از کاربر بخواهید کد درستی‌سنجی را هنگام دریافت در پیامک تایپ کند.

ورود کاربر به سیستم با کد درستی‌سنجی

پس‌از اینکه کاربر کد درستی‌سنجی پیامک را به برنامه شما ارائه کرد، با ایجاد کردن شیء 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 راه‌اندازی کنید. آزمایش با شماره تلفن‌های ساختگی این مزایا را دارد:

  • اصالت‌سنجی شماره تلفن را بدون مصرف سهمیه استفاده‌تان آزمایش کنید.
  • اصالت‌سنجی شماره تلفن را بدون ارسال پیامک واقعی آزمایش کنید.
  • آزمایش‌های متوالی را با همان شماره تلفن بدون محدود شدن اجرا کنید. این کار خطر رد شدن در فرایند بازبینی «فروشگاه برنامه‌ها» را درصورتی‌که بازبین از همان شماره تلفن برای آزمایش استفاده کند به‌حداقل می‌رساند.
  • به‌راحتی در محیط‌های توسعه بدون هیچ تلاش اضافی آزمایش کنید، مانند توانایی توسعه در شبیه‌ساز iOS یا شبیه‌ساز Android بدون «خدمات Google Play».
  • آزمایش‌های ادغام را بدون مسدود شدن توسط بررسی‌های امنیتی که معمولاً روی شماره تلفن‌های واقعی در محیط تولید اعمال می‌شود بنویسید.

شماره تلفن‌های ساختگی باید این شرایط را داشته باشند:

  1. مطمئن شوید از شماره تلفن‌هایی استفاده می‌کنید که واقعاً ساختگی هستند و ازقبل وجود ندارند. Firebase Authentication به شما اجازه نمی‌دهد شماره تلفن‌های موجود را که کاربران واقعی استفاده می‌کنند به‌عنوان شماره آزمایشی تنظیم کنید. یک گزینه این است که از شماره‌های با پیشوند ۵۵۵ به‌عنوان شماره تلفن آزمایشی ایالات متحده استفاده کنید، برای مثال: ‎+۱ ۶۵۰-۵۵۵-۳۴۳۴
  2. شماره تلفن‌ها باید ازنظر طول و سایر محدودیت‌ها به‌درستی قالب‌بندی شده باشند. این شماره‌ها همچنان همان اعتبارسنجی شماره تلفن کاربر واقعی را طی خواهند کرد.
  3. می‌توانید حداکثر ۱۰ شماره تلفن برای توسعه اضافه کنید.
  4. از شماره تلفن‌ها/کدهای آزمایشی استفاده کنید که حدس زدن آن‌ها دشوار است و آن‌ها را مرتباً تغییر دهید.

ایجاد شماره تلفن‌ها و کدهای درستی‌سنجی ساختگی

  1. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.
  2. در برگه روش ورود به سیستم، ارائه‌دهنده ورود به سیستم تلفن را فعال کنید (اگر قبلاً این کار را نکرده‌اید).
  3. بخش شماره‌های تلفن برای آزمایش را ازهم باز کنید.
  4. شماره تلفنی را که می‌خواهید آزمایش کنید ارائه دهید، برای مثال: +1 650-555-3434.
  5. کد درستی‌سنجی ۶ رقمی را برای آن شماره خاص ارائه دهید، برای مثال: 654321.
  6. برای هر شماره، روی افزودن کلیک کنید. درصورت نیاز، می‌توانید شماره تلفن و کد آن را با نگه داشتن نشانگر روی ردیف مربوطه و کلیک کردن روی نماد سطل زباله حذف کنید.

آزمایش دستی

می‌توانید مستقیماً از شماره تلفن ساختگی در برنامه‌تان استفاده کنید. این کار به شما امکان می‌دهد آزمایش دستی را در مراحل توسعه بدون مواجه شدن با مشکلات سهمیه یا محدودسازی انجام دهید. همچنین می‌توانید مستقیماً از شبیه‌ساز iOS یا شبیه‌ساز Android بدون نصب «خدمات Google Play» آزمایش کنید.

وقتی شماره تلفن ساختگی را ارائه می‌دهید و کد درستی‌سنجی را ارسال می‌کنید، هیچ پیامک واقعی‌ای ارسال نمی‌شود. درعوض، باید کد درستی‌سنجی‌ای را که قبلاً پیکربندی کرده‌اید ارائه دهید تا ورود به سیستم تکمیل شود.

پس‌از تکمیل ورود به سیستم، کاربر Firebase با آن شماره تلفن ایجاد می‌شود. این کاربر رفتار و ویژگی‌های مشابهی با کاربر شماره تلفن واقعی دارد و می‌تواند به همان روش به Realtime Database/Cloud Firestore و سرویس‌های دیگر دسترسی داشته باشد. شناسه ID که درطول این فرایند ایجاد می‌شود، همان امضای کاربر شماره تلفن واقعی را دارد.

گزینه دیگر این است که اگر می‌خواهید دسترسی را بیشتر محدود کنید، نقش آزمایشی را ازطریق ادعاهای سفارشی برای این کاربران تنظیم کنید تا آن‌ها را به‌عنوان کاربران جعلی متمایز کنید.

آزمایش یکپارچه‌سازی

علاوه‌بر آزمایش دستی، Firebase Authentication میاناهای برنامه‌سازی کاربردی‌ای ارائه می‌دهد که به نوشتن آزمایش‌های ادغام برای آزمایش اصالت‌سنجی تلفن کمک می‌کند. این میاناهای برنامه‌سازی کاربردی با غیرفعال کردن الزام reCAPTCHA در وب و اعلان‌های لحظه‌ای بی‌صدا در iOS، درستی‌سنجی برنامه را غیرفعال می‌کنند. این کار آزمایش خودکارسازی را در این جریان‌ها ممکن می‌کند و پیاده‌سازی آن را آسان‌تر می‌کند. علاوه‌براین، این شماره‌ها به ارائه توانایی آزمایش جریان‌های درستی‌سنجی فوری در Android کمک می‌کنند.

در iOS، تنظیم appVerificationDisabledForTesting باید روی TRUE تنظیم شود تا بتوانید با verifyPhoneNumber تماس بگیرید. این فرایند بدون نیاز به هیچ‌گونه کد APN یا ارسال اعلان‌های لحظه‌ای بی‌صدا در پس‌زمینه انجام می‌شود، که آزمایش در شبیه‌ساز را آسان‌تر می‌کند. این کار همچنین جریان بازگشت reCAPTCHA را غیرفعال می‌کند.

توجه داشته باشید که وقتی درستی‌سنجی برنامه غیرفعال است، استفاده از شماره تلفن واقعی باعث می‌شود ورود به سیستم تکمیل نشود. فقط شماره تلفن‌های ساختگی را می‌توان با این API استفاده کرد.

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

پیوست: استفاده از ورود به سیستم با تلفن بدون Swizzling

Firebase Authentication از روش تغییر پیاده‌سازی برای دریافت خودکار کد APN برنامه‌تان، برای مدیریت اعلان‌های لحظه‌ای بی‌صدایی که Firebase به برنامه‌تان ارسال می‌کند، و برای رهگیری خودکار طرح سفارشی تغییرمسیر از صفحه درستی‌سنجی reCAPTCHA درطول درستی‌سنجی استفاده می‌کند.

اگر ترجیح می‌دهید از swizzling استفاده نکنید، می‌توانید آن را با افزودن پرچم FirebaseAppDelegateProxyEnabled به فایل Info.plist برنامه‌تان و تنظیم آن روی NO غیرفعال کنید. توجه داشته باشید که تنظیم این پرچم روی NO swizzling را برای سایر محصولات Firebase، ازجمله Firebase Cloud Messaging نیز غیرفعال می‌کند.

اگر swizzling را غیرفعال کنید، باید به‌طور صریح کد APNs دستگاه، اعلان‌های لحظه‌ای، و نشانی وب هدایت طرح سفارشی را به Firebase Authentication ارسال کنید.

اگر درحال ساختن برنامه SwiftUI هستید، باید به‌طور صریح کد APNs دستگاه، اعلان‌های لحظه‌ای، و نشانی وب تغییرمسیر طرح سفارشی را به Firebase Authentication ارسال کنید.

برای دریافت کد دستگاه APN، روش 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:): ، با فراخوانی روش canHandleNotification(_:) Auth، اعلان‌های مربوط به احراز هویت Firebase را بررسی کنید.

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

برای رسیدگی به نشانی وب هدایتگر طرح‌واره سفارشی، روش application(_:open:options:) را پیاده‌سازی کنید و در آن‌ها، نشانی وب را به روش 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:) را پیاده‌سازی کنید و در آن‌ها، نشانی وب را به روش 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;
}

همچنین ممکن است بخواهید کد رسیدگی به خطا را برای طیف کامل خطاهای اصالت‌سنجی اضافه کنید. رسیدگی به خطاها را ببینید.