Catch up on everthing we announced at this year's Firebase Summit. Learn more

אמת עם Firebase באמצעות מספר טלפון ו- C ++

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

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

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

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

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

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

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

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

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

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

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

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

התחל לקבל הודעות APNs (פלטפורמות אפל)

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

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

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

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

    2. בחר בלחצן העלאת האישור עבור תעודת הפיתוח, אישור גרסת הייצור, או שניהם. נדרש לפחות אחד.

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

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

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

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

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

  2. התקשר PhoneAuthProvider::VerifyPhoneNumber , עובר אליו את מספר הטלפון של המשתמש.
    class PhoneListener : public PhoneAuthProvider::Listener {
     public:
      ~PhoneListener() override {}
    
      void OnVerificationCompleted(Credential credential) override {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // No need for the user to input the verification code manually.
        // `credential` can be used instead of calling GetCredential().
      }
    
      void OnVerificationFailed(const std::string& error) override {
        // Verification code not sent.
      }
    
      void OnCodeSent(const std::string& verification_id,
                      const PhoneAuthProvider::ForceResendingToken&
                          force_resending_token) override {
        // Verification code successfully sent via SMS.
        // Show the Screen to enter the Code.
        // Developer may want to save that verification_id along with other app states in case
        // the app is terminated before the user gets the SMS verification code.
      }
    };
    
    PhoneListener phone_listener;
    PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth);
    phone_provider->VerifyPhoneNumber(phone_number, kAutoVerifyTimeOut, null,
                                      &phone_listener);
    
    כשאתה מתקשר PhoneAuthProvider::VerifyPhoneNumber , Firebase,
    • (ב-iOS) שולח הודעת דחיפה שקטה לאפליקציה שלך,
    • שולח הודעת SMS המכילה קוד אימות למספר הטלפון שצוין ומעביר מזהה אימות לפונקציית ההשלמה שלך. תצטרך גם את קוד האימות וגם את מזהה האימות כדי להיכנס למשתמש.
  3. שמור את מזהה האימות ושחזר אותו כשהאפליקציה שלך נטענת. על ידי כך, אתה יכול להבטיח שעדיין יש לך מזהה אימות חוקי אם האפליקציה שלך תסתיים לפני שהמשתמש ישלים את זרימת הכניסה (לדוגמה, תוך כדי מעבר לאפליקציית SMS).

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

אם קריאת VerifyPhoneNumber תוצאות OnCodeSent להיקרא על המאזין שלך, אתה יכול לבקש מהמשתמש להקליד את קוד האימות כשהם מקבלים אותו בהודעת SMS.

מצד השני, אם קריאת VerifyPhoneNumber תוצאות OnVerificationCompleted , אז אימות אוטומטית הצליחה ואתה עכשיו יש Credential שבה ניתן להשתמש כמתואר להלן.

היכנס למשתמש עם קוד האימות

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

  1. קבל את קוד האימות מהמשתמש.
  2. צור Credential אובייקט מקוד אימות זיהוי ואימות.
    Credential credential = phone_auth_provider->GetCredential(
        verification_id_.c_str(), verification_code.c_str());
        
  3. כניסה למשתמש עם Credential האובייקט:
    Future<User*> future = auth_->SignInWithCredential(credential);
    future.OnCompletion(
        [](const Future<User*>& result, void*) {
          if (result.error() == kAuthErrorNone) {
            // Successful.
            // User is signed in.
            const User* user = *result.result();
    
            // This should display the phone number.
            printf("Phone number: %s", user->phone_number().c_str());
    
            // The phone number provider UID is the phone number itself.
            printf("Phone provider uid: %s", user->uid().c_str());
    
            // The phone number providerID is 'phone'
            printf("Phone provider ID: %s", user->provider_id().c_str());
          } else {
            // Error.
            printf("Sign in error: %s", result.error_message().c_str());
          }
        },
        nullptr);
    

הצעדים הבאים

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

  • באפליקציות שלך, אתה יכול לקבל את המידע הבסיסי של הפרופיל האישי של המשתמש מן firebase::auth::User האובייקט:

    firebase::auth::User* user = auth->current_user();
    if (user != nullptr) {
      std::string name = user->display_name();
      std::string email = user->email();
      std::string photo_url = user->photo_url();
      // The user's ID, unique to the Firebase project.
      // Do NOT use this value to authenticate with your backend server,
      // if you have one. Use firebase::auth::User::Token() instead.
      std::string uid = user->uid();
    }
    
  • בבסיס הנתונים בזמן אמת Firebase שלך לאחסון בענן אבטחה חוקי , אתה יכול לקבל את שנכנסים למערכת זיהוי המשתמש הייחודי של המשתמש מן auth משתנה, ולהשתמש בו כדי לקבוע אילו נתונים גישה יכול משתמש.

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

כדי לצאת מהחשבון משתמש, קוראים SignOut() :

auth->SignOut();