אמת באמצעות Firebase ב- iOS באמצעות מספר טלפון

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

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

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

  1. להוסיף Firebase לפרויקט iOS שלך .
  2. כלול את התרמילים הבאים שלך Podfile :
    pod 'Firebase/Auth'
    
  3. אם עדיין לא מחוברת האפליקציה שלך לפרויקט Firebase שלך, לעשות זאת מתוך קונסולת Firebase .

חששות אבטחה

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

הגדר אימות reCAPTCHA

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

  1. הוסף תוכניות URL מותאמות אישית לפרויקט Xcode שלך:
    1. פתח את תצורת הפרויקט שלך: לחץ פעמיים על שם הפרויקט בתצוגת העץ השמאלית. בחר ביישום מהמדור הממקד, ולאחר מכן בחר את כרטיסיית המידע, וכן להרחיב את מקטע סוגי URL.
    2. לחץ על הלחצן +, ולהוסיף ערכת URL עבור זיהוי הלקוח הפוך שלך. כדי למצוא את הערך הזה, לפתוח את GoogleService-Info.plist קובץ תצורה, ולחפש את REVERSED_CLIENT_ID המפתח. העתק את הערך של המפתח, ולהדביק אותו בשדה כתובת האתר הקמעונות בדף התצורה. השאר את השדות האחרים ריקים.

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

  2. אופציונלי: אם ברצונך להתאים אישית את הדרך מתנות האפליקציה שלך SFSafariViewController או UIWebView בעת הצגת reCAPTCHA למשתמש, ליצור מחלקה מותאמת אישית תואמת את FIRAuthUIDelegate פרוטוקול, ולהעביר אותו 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
          // ...
      }

    אובייקטיבי-ג

    [[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:UIDelegate:completion: , Firebase תשלח התראה בדחיפה אילמת האפליקציה שלך, או בעיות אתגר reCAPTCHA למשתמש. לאחר שהאפליקציה שלך תקבל את ההודעה או שהמשתמש ישלים אתגר reCAPTCHA, Firebase שולח הודעת SMS המכילה קוד אימות למספר הטלפון שצוין ומעביר מזהה אימות לפונקציית ההשלמה שלך. תצטרך את קוד האימות ואת מזהה האימות כדי להיכנס למשתמש.

    הודעת SMS ששלחה Firebase יכול גם להיות מקומי על ידי ציון השפה auth דרך languageCode רכוש על מופע המחבר שלך.

    מָהִיר

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

    אובייקטיבי-ג

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

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

    מָהִיר

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

    אובייקטיבי-ג

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

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

    מָהִיר

    let verificationID = UserDefaults.standard.string(forKey: "authVerificationID")
    

    אובייקטיבי-ג

    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
    )

    אובייקטיבי-ג

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

    אובייקטיבי-ג

    [[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 ספרות עבור מספר מסוים, למשל: 654,321.
  6. מוסיפים את המספר. אם יש צורך, תוכל למחוק את מספר הטלפון והקוד שלו על ידי ריחוף מעל השורה המתאימה ולחיצה על סמל האשפה.

בדיקה ידנית

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

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

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

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

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

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

ב- iOS appVerificationDisabledForTesting ההגדרה צריכה להיות מוגדרת TRUE לפני פניית verifyPhoneNumber . זה מעובד ללא צורך באסימון APN כלשהו או בשליחת הודעות דחיפה שקטות ברקע, מה שמקל על הבדיקה בסימולטור. זה גם משבית את זרימת החזרה של 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
    }];
}];

אובייקטיבי-ג

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

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

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

כדי להשיג את האסימון מכשיר ה- APN, ליישם את application:didRegisterForRemoteNotificationsWithDeviceToken: שיטה, וגם זה, להעביר את המכשיר האסימון FIRAuth של setAPNSToken:type: השיטה.

מָהִיר

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

אובייקטיבי-ג

- (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: שיטה, בדוק אם יש התראות הקשורות auth Firebase ידי התקשרות FIRAuth של canHandleNotification: השיטה.

מָהִיר

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, developer should handle it.
}

אובייקטיבי-ג

- (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, developer should handle it.
}

כדי להתמודד עם אתר להפניה מחדש תוכנית מותאמת אישית, ליישם את application:openURL:sourceApplication:annotation: שיטת למכשירים בעלי מערכת הפעלה iOS 8 ומעלה, ואת application:openURL:options: שיטת למכשירים בעלי מערכת הפעלה iOS 9 ומעלה, ובשנת אותם, להעביר את כתובת האתר FIRAuth של canHandleURL השיטה.

מָהִיר

// For iOS 9+
func application(_ application: UIApplication, open url: URL,
    options: [UIApplicationOpenURLOptionsKey : Any]) -> Bool {
  if Auth.auth().canHandle(url) {
    return true
  }
  // URL not auth related, developer should handle it.
}

// For iOS 8-
func application(_ application: UIApplication,
                 open url: URL,
                 sourceApplication: String?,
                 annotation: Any) -> Bool {
  if Auth.auth().canHandle(url) {
    Return true
  }
  // URL not auth related, developer should handle it.
}

אובייקטיבי-ג

// For iOS 9+
- (BOOL)application:(UIApplication *)app
            openURL:(NSURL *)url
            options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related, developer should handle it.
}

// For iOS 8-
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
  if ([[FIRAuth auth] canHandleURL:url]) {
    return YES;
  }
  // URL not auth related, developer should handle it.
}

אם אתה משתמש SwiftUI או UISceneDelegate , כדי להתמודד עם אתר להפניה מחדש, ליישם את scene:openURLContexts: שיטה, וגם אותם, להעביר את כתובת האתר כדי FIRAuth של canHandleURL השיטה.

מָהִיר

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

אובייקטיבי-ג

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

הצעדים הבאים

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

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

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

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

כדי לצאת מהחשבון משתמש, קוראים signOut: .

מָהִיר

    let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}
  

אובייקטיבי-ג

    NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

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