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

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

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

قبل از شروع

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

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

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

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

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

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

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

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

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

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

  • اعلان‌های APN بی‌صدا: وقتی کاربری را برای اولین‌بار با شماره تلفنش در دستگاهی به سیستم وارد می‌کنید، 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، قابلیت «حالت‌های پس‌زمینه» را برای پروژه‌تان فعال کنید، و سپس چارگوش‌های حالت‌های واکشی پس‌زمینه و اعلان‌های از دور را انتخاب کنید.

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

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

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

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

    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 به شما اجازه نمی‌دهد شماره تلفن‌های موجود مورداستفاده کاربران واقعی را به‌عنوان شماره‌های آزمایشی تنظیم کنید. یکی از گزینه‌ها استفاده از شماره‌های پیش‌شماره ۵۵۵ به‌عنوان شماره تلفن‌های آزمایشی ایالات متحده است، برای مثال: +1 650-555-3434
  2. شماره تلفن‌ها باید ازنظر طول و دیگر محدودیت‌ها قالب‌بندی صحیح داشته باشند. این شماره‌ها همچنان همان فرایند اعتبارسنجی شماره تلفن کاربر واقعی را طی خواهند کرد.
  3. می‌توانید حداکثر ۱۰ شماره تلفن برای توسعه اضافه کنید.
  4. از شماره تلفن‌ها/کدهای آزمایشی استفاده کنید که حدس زدن آن‌ها دشوار باشد و آن‌ها را مرتباً تغییر دهید.

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

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

آزمایش دستی

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

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

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

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

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

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

در iOS، تنظیم appVerificationDisabledForTesting باید قبل‌از تماس با verifyPhoneNumber روی TRUE تنظیم شود. این کار بدون نیاز به هیچ کد APNs یا ارسال اعلان‌های لحظه‌ای بی‌صدا در پس‌زمینه پردازش می‌شود و آزمایش کردن در شبیه‌ساز را آسان‌تر می‌کند. این کار همچنین جریان بازگشت 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;
    }];
}];

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

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

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

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

اگر درحال ساختن برنامه SwiftUI هستید، باید به‌طور صریح نشان دستگاه APNs، اعلان‌های لحظه‌ای، و نشانی وب هدایت طرح سفارشی را به 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.
}

برای مدیریت نشانی وب هدایتگر طرح‌واره سفارشی، 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;
}

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