בצע אימות עם Firebase בפלטפורמות של Apple באמצעות מספר טלפון

אתה יכול להשתמש באימות Firebase כדי להיכנס למשתמש על ידי שליחת הודעת SMS לטלפון של המשתמש. המשתמש נכנס באמצעות קוד חד פעמי הכלול בהודעת ה-SMS.

הדרך הקלה ביותר להוסיף כניסה עם מספר טלפון לאפליקציה שלך היא להשתמש ב-FirebaseUI, הכולל ווידג'ט כניסה נפתח המיישם זרימות כניסה לכניסה למספר טלפון, כמו גם כניסה מבוססת סיסמה ומאוחדת -ב. מסמך זה מתאר כיצד ליישם זרימת כניסה למספר טלפון באמצעות Firebase SDK.

לפני שאתה מתחיל

  1. אם עדיין לא חיברת את האפליקציה שלך לפרויקט Firebase שלך, עשה זאת ממסוף Firebase .
  2. השתמש ב- Swift Package Manager כדי להתקין ולנהל תלות ב-Firebase.

    1. ב-Xcode, כשפרויקט האפליקציה שלך פתוח, נווט אל קובץ > הוסף חבילות .
    2. כשתתבקש, הוסף את מאגר Firebase Apple platforms SDK:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. בחר את ספריית האימות של Firebase.
    5. הוסף את הדגל -ObjC לקטע Other Linker Flags של הגדרות הבנייה של היעד שלך.
    6. בסיום, Xcode יתחיל באופן אוטומטי לפתור ולהוריד את התלות שלך ברקע.

דאגות ביטחוניות

אימות באמצעות מספר טלפון בלבד, אמנם נוח, הוא פחות מאובטח משאר השיטות הזמינות, מכיוון שניתן להעביר בקלות את החזקת מספר טלפון בין משתמשים. כמו כן, במכשירים עם מספר פרופילי משתמש, כל משתמש שיכול לקבל הודעות SMS יכול להיכנס לחשבון באמצעות מספר הטלפון של המכשיר.

אם אתה משתמש בכניסה מבוססת מספר טלפון באפליקציה שלך, עליך להציע זאת לצד שיטות כניסה מאובטחות יותר, ולהודיע ​​למשתמשים על פשרות האבטחה של שימוש בכניסה למספר טלפון.

אפשר כניסה למספר טלפון עבור פרויקט Firebase שלך

כדי להיכנס למשתמשים באמצעות SMS, תחילה עליך להפעיל את שיטת הכניסה למספר טלפון עבור פרויקט Firebase שלך:

  1. במסוף Firebase , פתח את הקטע אימות .
  2. בדף שיטת הכניסה , הפעל את שיטת הכניסה למספר טלפון .

מכסת הבקשות לכניסה למספרי טלפון של Firebase גבוהה מספיק כדי שרוב האפליקציות לא יושפעו. עם זאת, אם אתה צריך להיכנס לכמות גדולה מאוד של משתמשים עם אימות טלפון, ייתכן שתצטרך לשדרג את תוכנית התמחור שלך. עיין בעמוד התמחור .

אפשר אימות אפליקציה

כדי להשתמש באימות מספרי טלפון, Firebase חייבת להיות מסוגלת לאמת שבקשות כניסה למספר טלפון מגיעות מהאפליקציה שלך. ישנן שתי דרכים שבהן אימות Firebase משיג זאת:

  • התראות APN שקטות : כאשר אתה נכנס למשתמש עם מספר הטלפון שלו בפעם הראשונה במכשיר, אימות Firebase שולח אסימון למכשיר באמצעות הודעת דחיפה שקטה. אם האפליקציה שלך תקבל בהצלחה את ההתראה מ-Firebase, הכניסה למספר טלפון יכולה להמשיך.

    עבור iOS 8.0 ואילך, הודעות שקטות אינן מצריכות הסכמה מפורשת של המשתמש ולכן אינן מושפעות ממשתמש שמסרב לקבל הודעות APN באפליקציה. לפיכך, האפליקציה לא צריכה לבקש הרשאת משתמש כדי לקבל הודעות דחיפה בעת הטמעת אימות מספר הטלפון של Firebase.

  • אימות reCAPTCHA : במקרה שלא ניתן לשלוח או לקבל הודעת דחיפה שקטה, כגון כאשר המשתמש השבית את רענון הרקע עבור האפליקציה שלך, או בעת בדיקת האפליקציה שלך בסימולטור iOS, אימות Firebase משתמש באימות reCAPTCHA כדי להשלים את הטלפון זרימת כניסה. לעתים קרובות ניתן להשלים את אתגר reCAPTCHA מבלי שהמשתמש יצטרך לפתור דבר.

כאשר הודעות דחיפה שקטות מוגדרות כהלכה, רק אחוז קטן מאוד מהמשתמשים יחוו את זרימת reCAPTCHA. עם זאת, עליך לוודא שהכניסה למספר טלפון פועלת כהלכה, בין אם הודעות דחיפה שקטות זמינות או לא.

התחל לקבל התראות שקטות

כדי להפעיל התראות APNs לשימוש עם אימות Firebase:

  1. ב-Xcode, אפשר הודעות דחיפה עבור הפרויקט שלך.
  2. העלה את מפתח האימות של ה-APN שלך ל-Firebase. אם עדיין אין לך מפתח אימות APNs, הקפד ליצור אחד ב- Apple Developer Member Center .

    1. בתוך הפרויקט שלך במסוף Firebase, בחר בסמל גלגל השיניים, בחר הגדרות פרויקט ולאחר מכן בחר בכרטיסייה הודעות ענן .

    2. במפתח אימות APN תחת תצורת אפליקציית iOS , לחץ על כפתור העלה .

    3. דפדף למיקום שבו שמרת את המפתח שלך, בחר אותו ולחץ על פתח . הוסף את מזהה המפתח של המפתח (זמין ב- Apple Developer Member Center ) ולחץ על העלה .

    אם כבר יש לך אישור APNs, אתה יכול להעלות את האישור במקום זאת.

הגדר אימות reCAPTCHA

כדי לאפשר ל-Firebase SDK להשתמש באימות reCAPTCHA:

  1. הוסף סכימות כתובת URL מותאמות אישית לפרויקט Xcode שלך:
    1. פתח את תצורת הפרויקט שלך: לחץ פעמיים על שם הפרויקט בתצוגת העץ השמאלית. בחר את האפליקציה שלך מהקטע 'יעדים' ולאחר מכן בחר בכרטיסייה 'מידע ' והרחב את הקטע 'סוגי כתובות אתרים' .
    2. לחץ על הלחצן + , והוסף את מזהה האפליקציה המקודדת שלך כסכימת כתובת URL. אתה יכול למצוא את מזהה האפליקציה המקודדת שלך בדף ההגדרות הכלליות של מסוף Firebase, בקטע של אפליקציית iOS שלך. השאר את השדות האחרים ריקים.

      לאחר השלמתו, התצורה שלך אמורה להיראות משהו דומה להלן (אבל עם הערכים הספציפיים ליישום שלך):

      צילום מסך של ממשק הגדרת סכימת ה-URL המותאמת אישית של Xcode
  2. אופציונלי : אם ברצונך להתאים אישית את האופן שבו האפליקציה שלך מציגה את SFSafariViewController בעת הצגת ה-reCAPTCHA למשתמש, צור מחלקה מותאמת אישית התואמת את פרוטוקול AuthUIDelegate , והעבר אותו ל- verifyPhoneNumber(_:uiDelegate:completion:) .

שלח קוד אימות לטלפון של המשתמש

כדי להתחיל בכניסה למספר טלפון, הצג למשתמש ממשק שמבקש ממנו לספק את מספר הטלפון שלו, ולאחר מכן התקשר ל- verifyPhoneNumber(_:uiDelegate:completion:) כדי לבקש מ-Firebase לשלוח קוד אימות לטלפון של המשתמש ב-SMS:

  1. קבל את מספר הטלפון של המשתמש.

    הדרישות המשפטיות משתנות, אך כשיטת עבודה מומלצת וכדי להגדיר ציפיות למשתמשים שלך, עליך ליידע אותם שאם הם משתמשים בכניסה טלפונית, הם עשויים לקבל הודעת SMS לאימות ויחולו תעריפים סטנדרטיים.

  2. התקשר ל- verifyPhoneNumber(_:uiDelegate:completion:) , והעביר אליו את מספר הטלפון של המשתמש.

    מָהִיר

    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 שלך.

    מָהִיר

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

    Objective-C

     // Change language code to french.
     [FIRAuth auth].languageCode = @"fr";
    
  3. שמור את מזהה האימות ושחזר אותו כשהאפליקציה שלך נטענת. על ידי כך, אתה יכול להבטיח שעדיין יש לך מזהה אימות חוקי אם האפליקציה שלך תסתיים לפני שהמשתמש ישלים את זרימת הכניסה (לדוגמה, תוך כדי מעבר לאפליקציית SMS).

    אתה יכול להתמיד במזהה האימות בכל דרך שתרצה. דרך פשוטה היא לשמור את מזהה האימות עם האובייקט NSUserDefaults :

    מָהִיר

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

    Objective-C

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

    לאחר מכן, תוכל לשחזר את הערך השמור:

    מָהִיר

    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 מקוד האימות ומזהה האימות.

    מָהִיר

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

    Objective-C

    FIRAuthCredential *credential = [[FIRPhoneAuthProvider provider]
        credentialWithVerificationID:verificationID
                    verificationCode:userInput];
  3. היכנס למשתמש עם האובייקט FIRPhoneAuthCredential :

    מָהִיר

    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 או אמולטור אנדרואיד ללא שירותי Google Play.
  • כתוב מבחני אינטגרציה מבלי להיחסם על ידי בדיקות אבטחה המופעלות בדרך כלל על מספרי טלפון אמיתיים בסביבת ייצור.

מספרי טלפון בדיוניים חייבים לעמוד בדרישות הבאות:

  1. ודא שאתה משתמש במספרי טלפון שהם אכן בדיוניים, ולא קיימים כבר. אימות Firebase אינו מאפשר לך להגדיר מספרי טלפון קיימים המשמשים משתמשים אמיתיים כמספרי בדיקה. אפשרות אחת היא להשתמש ב-555 מספרי קידומת כמספרי טלפון לבדיקה בארה"ב, לדוגמה: +1 650-555-3434
  2. מספרי טלפון צריכים להיות בפורמט נכון עבור אורך ואילוצים אחרים. הם עדיין יעברו את אותו אימות כמו מספר הטלפון של משתמש אמיתי.
  3. ניתן להוסיף עד 10 מספרי טלפון לפיתוח.
  4. השתמש במספרי טלפון/קודים לבדיקה שקשה לנחש ושנה אותם לעתים קרובות.

צור מספרי טלפון בדיוניים וקודי אימות

  1. במסוף Firebase , פתח את הקטע אימות .
  2. בכרטיסייה שיטת כניסה , הפעל את ספק הטלפון אם עדיין לא עשית זאת.
  3. פתח את תפריט מספרי טלפון לבדיקת אקורדיון.
  4. ספק את מספר הטלפון שברצונך לבדוק, לדוגמה: ‎+1 650-555-3434 .
  5. ספק את קוד האימות בן 6 הספרות עבור אותו מספר ספציפי, לדוגמה: 654321 .
  6. הוסף את המספר. אם יש צורך, תוכל למחוק את מספר הטלפון והקוד שלו על ידי ריחוף מעל השורה המתאימה ולחיצה על סמל האשפה.

בדיקה ידנית

אתה יכול להתחיל להשתמש ישירות במספר טלפון בדיוני באפליקציה שלך. זה מאפשר לך לבצע בדיקות ידניות במהלך שלבי הפיתוח מבלי להיתקל בבעיות מכסה או מצערת. אתה יכול גם לבדוק ישירות מסימולטור iOS או אמולטור אנדרואיד ללא שירותי Google Play מותקנים.

כאשר אתה מספק את מספר הטלפון הבדיוני ושולח את קוד האימות, לא נשלח SMS בפועל. במקום זאת, עליך לספק את קוד האימות שהוגדר קודם לכן כדי להשלים את הכניסה.

עם השלמת הכניסה, משתמש Firebase נוצר עם מספר הטלפון הזה. למשתמש יש את אותה התנהגות ומאפיינים כמו משתמש מספר טלפון אמיתי, והוא יכול לגשת למסד הנתונים בזמן אמת/Cloud Firestore ולשירותים אחרים באותה דרך. לאסימון הזיהוי שהוטבע במהלך תהליך זה יש חתימה זהה למשתמש במספר טלפון אמיתי.

אפשרות נוספת היא להגדיר תפקיד בדיקה באמצעות תביעות מותאמות אישית על משתמשים אלה כדי להבדיל אותם כמשתמשים מזויפים אם אתה רוצה להגביל עוד יותר את הגישה.

בדיקת אינטגרציה

בנוסף לבדיקות ידניות, Firebase Authentication מספק ממשקי API שיעזרו בכתיבת מבחני אינטגרציה עבור בדיקות אימות טלפוניות. ממשקי API אלה משביתים את אימות האפליקציה על ידי השבתת דרישת reCAPTCHA באינטרנט והודעות דחיפה שקטות ב-iOS. זה מאפשר בדיקות אוטומציה בזרימות אלו וקלות יותר ליישום. בנוסף, הם עוזרים לספק את היכולת לבדוק זרימות אימות מיידי באנדרואיד.

ב-iOS, יש להגדיר את ההגדרה appVerificationDisabledForTesting ל- TRUE לפני שתתקשר אל verifyPhoneNumber . זה מעובד ללא צורך באסימון APNs או שליחת הודעות דחיפה שקטות ברקע, מה שמקל על הבדיקה בסימולטור. זה גם משבית את זרימת החזרה של reCAPTCHA.

שים לב שכאשר אימות האפליקציה מושבת, שימוש במספר טלפון לא בדיוני לא יצליח להשלים את הכניסה. ניתן להשתמש רק במספרי טלפון בדיוניים עם API זה.

מָהִיר

let phoneNumber = "+16505554567"

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

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

Objective-C

NSString *phoneNumber = @"+16505554567";

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

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

נספח: שימוש בכניסה לטלפון ללא לחיצה

Authentication Firebase משתמש בשיטת swizzling כדי להשיג אוטומטית את אסימון APNs של האפליקציה שלך, לטפל בהתראות הדחיפה השקטות ש-Firebase שולחת לאפליקציה שלך, וכדי ליירט אוטומטית את ההפניה מחדש של הסכמה המותאמת אישית מדף האימות של reCAPTCHA במהלך האימות.

אם אתה מעדיף לא להשתמש ב- swizzling, אתה יכול להשבית אותו על ידי הוספת הדגל FirebaseAppDelegateProxyEnabled לקובץ Info.plist של האפליקציה שלך והגדרתו ל- NO . שים לב שהגדרת הדגל הזה ל- NO משביתה גם את ה-swizzling עבור מוצרי Firebase אחרים, כולל Firebase Cloud Messaging.

אם אתה משבית את ה-swissing, עליך להעביר במפורש את אסימון מכשיר ה-APN, הודעות דחיפה ואת כתובת האתר להפניה מחדש של הסכמה המותאמת אישית לאימות Firebase.

אם אתה בונה אפליקציית SwiftUI, עליך להעביר במפורש את אסימון מכשיר ה-APN, הודעות דחיפה וכתובת האתר להפניה מחדש של הסכמה המותאמת אישית לאימות Firebase.

כדי להשיג את אסימון ההתקן של APNs, הטמיע את שיטת application(_:didRegisterForRemoteNotificationsWithDeviceToken:) , ובתוכה, העבר את אסימון המכשיר לשיטת setAPNSToken(_:type:) של Auth .

מָהִיר

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

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

Objective-C

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

כדי לטפל בהתראות דחיפה, בשיטת application(_:didReceiveRemoteNotification:fetchCompletionHandler:): בדוק אם יש הודעות הקשורות לאישור Firebase על ידי קריאה לשיטת canHandleNotification(_:) של Auth .

מָהִיר

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 .

מָהִיר

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 .

מָהִיר

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

Objective-C

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

הצעדים הבאים

לאחר שמשתמש נכנס בפעם הראשונה, נוצר חשבון משתמש חדש ומקושר לאישורים - כלומר, שם המשתמש והסיסמה, מספר הטלפון או פרטי ספק האישורים - המשתמש נכנס איתו. החשבון החדש הזה מאוחסן כחלק מפרויקט Firebase שלך, וניתן להשתמש בו כדי לזהות משתמש בכל אפליקציה בפרויקט שלך, ללא קשר לאופן שבו המשתמש נכנס.

  • באפליקציות שלך, תוכל לקבל את פרטי הפרופיל הבסיסיים של המשתמש מאובייקט User . ראה ניהול משתמשים .

  • בכללי האבטחה של מסד הנתונים בזמן אמת של Firebase ואחסון בענן , תוכל לקבל את מזהה המשתמש הייחודי של המשתמש המחובר ממשתנה auth , ולהשתמש בו כדי לשלוט לאילו נתונים המשתמש יכול לגשת.

אתה יכול לאפשר למשתמשים להיכנס לאפליקציה שלך באמצעות מספר ספקי אימות על ידי קישור אישורי ספק אימות לחשבון משתמש קיים.

כדי לצאת ממשתמש, התקשר ל- signOut: .

מָהִיר

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

ייתכן שתרצה להוסיף קוד לטיפול בשגיאות עבור כל מגוון שגיאות האימות. ראה טיפול בשגיאות .