אתם יכולים להשתמש ב-Firebase Authentication כדי להכניס משתמש לחשבון על ידי שליחת הודעת SMS לטלפון של המשתמש. המשתמש נכנס לחשבון באמצעות קוד חד-פעמי שמופיע בהודעת ה-SMS.
במאמר הזה מוסבר איך מטמיעים תהליך כניסה באמצעות מספר טלפון באמצעות Firebase SDK.
לפני שמתחילים
- איך מוסיפים את Firebase לפרויקט C++
- אם עדיין לא קישרתם את האפליקציה לפרויקט Firebase, אתם צריכים לעשות זאת דרך מסוף Firebase.
- הסבר על דרישות הפלטפורמה לכניסה באמצעות מספר טלפון:
- התחברות באמצעות מספר טלפון אפשרית רק בפלטפורמות לנייד.
- ב-iOS, כדי להיכנס באמצעות מספר טלפון צריך להשתמש במכשיר פיזי, ואי אפשר לעשות זאת באמצעות סימולטור.
בעיות אבטחה
אימות באמצעות מספר טלפון בלבד הוא נוח, אבל הוא פחות מאובטח מהשיטות האחרות שזמינות, כי אפשר להעביר בקלות את הבעלות על מספר טלפון בין משתמשים. בנוסף, במכשירים עם כמה פרופילי משתמשים, כל משתמש שיכול לקבל הודעות SMS יכול להיכנס לחשבון באמצעות מספר הטלפון של המכשיר.
אם אתם משתמשים באפליקציה שלכם בכניסה שמבוססת על מספר טלפון, אתם צריכים להציע אותה לצד שיטות כניסה מאובטחות יותר, וליידע את המשתמשים לגבי הפשרות בנושא אבטחה שקשורות לשימוש בכניסה שמבוססת על מספר טלפון.
הפעלת כניסה באמצעות מספר טלפון בפרויקט Firebase
כדי לאפשר למשתמשים להיכנס באמצעות SMS, קודם צריך להפעיל את שיטת הכניסה באמצעות מספר טלפון בפרויקט Firebase:
- במסוף Firebase, עוברים אל Security (אבטחה) > Authentication (אימות).
- בכרטיסייה שיטת התחברות, מפעילים את ספק הכניסה Phone (טלפון).
-
מגדירים מדיניות לגבי האזורים שרוצים לאפשר או לאסור שליחת הודעות SMS אליהם. הגדרת מדיניות אזורית לגבי הודעות SMS יכולה לעזור להגן על האפליקציות מפני ניצול לרעה של הודעות SMS. בפרויקטים חדשים, מדיניות ברירת המחדל לא מאפשרת שימוש באזורים.
- במסוף Firebase, עוברים אל Security (אבטחה) > Authentication (אימות) > הכרטיסייה Settings (הגדרות).
- בקטע SMS region policy, מגדירים את המדיניות לגבי אזורים גיאוגרפיים לאחסון נתונים של SMS.
התחלת קבלת התראות APNs (פלטפורמות של אפל)
כדי להשתמש באימות באמצעות מספר טלפון בפלטפורמות של אפל, האפליקציה שלכם צריכה להיות מסוגלת לקבל התראות APNs מ-Firebase. כשנכנסים לחשבון של משתמש באמצעות מספר הטלפון שלו בפעם הראשונה במכשיר מסוים, Firebase Authentication שולח למכשיר התראה שקטה מסוג push כדי לאמת שבקשת הכניסה באמצעות מספר הטלפון מגיעה מהאפליקציה שלכם. (לכן, אי אפשר להשתמש בכניסה באמצעות מספר הטלפון בסימולטור).
כדי להפעיל התראות APNs לשימוש ב-Firebase Authentication:
- ב-Xcode, מפעילים התראות פוש לפרויקט.
מעלים את אישור ה-APNs ל-Firebase. אם עדיין אין לכם אישור APNs, אתם צריכים ליצור אותו ב-Apple Developer Member Center.
-
במסוף Firebase, עוברים אל
הגדרות > כללי. ואז לוחצים על הכרטיסייה העברת הודעות בענן. - לוחצים על Upload Certificate (העלאת אישור) כדי להעלות את אישור הפיתוח, את אישור הייצור או את שניהם. צריך להוסיף לפחות אחד.
-
לכל אישור, בוחרים את קובץ
.p12ומזינים את הסיסמה, אם יש. מוודאים שמזהה החבילה של האישור הזה זהה למזהה החבילה של האפליקציה. לוחצים על שמירה.
-
במסוף Firebase, עוברים אל
שליחת קוד אימות לטלפון של המשתמש
כדי להתחיל את תהליך הכניסה באמצעות מספר טלפון, מציגים למשתמש ממשק שמבקש ממנו לספק את מספר הטלפון שלו, ואז קוראים ל-PhoneAuthProvider::VerifyPhoneNumber כדי לבקש מ-Firebase לשלוח קוד אימות לטלפון של המשתמש באמצעות SMS:
-
קבלת מספר הטלפון של המשתמש.
הדרישות המשפטיות משתנות, אבל כדאי להודיע למשתמשים שאם הם משתמשים בכניסה באמצעות הטלפון, יכול להיות שהם יקבלו הודעת SMS לאימות, ושחלים עליהם תעריפים רגילים.
- תתקשר אל
PhoneAuthProvider::VerifyPhoneNumberותעביר אליו את מספר הטלפון של המשתמש. כשמתקשרים אלclass PhoneListener : public PhoneAuthProvider::Listener { public: ~PhoneListener() override {} void OnVerificationCompleted(PhoneAuthCredential 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; PhoneAuhtOptions options; options.timeout_milliseconds = kAutoVerifyTimeOut; options.phone_number = phone_number; PhoneAuthProvider& phone_provider = PhoneAuthProvider::GetInstance(auth); phone_provider->VerifyPhoneNumber(options, &phone_listener);
PhoneAuthProvider::VerifyPhoneNumber, Firebase,- (ב-iOS) שולח התראה שקטה לאפליקציה,
- שולחת הודעת SMS עם קוד אימות למספר הטלפון שצוין ומעבירה מזהה אימות לפונקציית ההשלמה. כדי להיכנס לחשבון של המשתמש, צריך גם את קוד האימות וגם את מזהה האימות.
-
שומרים את מזהה האימות ומשחזרים אותו כשהאפליקציה נטענת. כך תוכלו לוודא שעדיין יש לכם מזהה אימות תקין אם האפליקציה נסגרת לפני שהמשתמש מסיים את תהליך הכניסה (לדוגמה, בזמן המעבר לאפליקציית סמס).
אפשר לשמור את מזהה האימות בכל דרך שרוצים. אם אתם כותבים באמצעות מסגרת C++ בפלטפורמות שונות, היא צריכה לספק התראות על סגירה ושחזור של האפליקציה. באירועים האלה אפשר לשמור את מזהה האימות ולשחזר אותו.
אם השיחה אל VerifyPhoneNumber גורמת להפעלת OnCodeSent ב-Listener, אפשר לבקש מהמשתמש להקליד את קוד האימות כשהוא מקבל אותו בהודעת ה-SMS.
לעומת זאת, אם הקריאה אל VerifyPhoneNumber מחזירה OnVerificationCompleted, האימות האוטומטי הצליח ועכשיו יש לכם PhoneAuthCredential שתוכלו להשתמש בו כמו שמתואר בהמשך.
כניסה של המשתמש באמצעות קוד האימות
אחרי שהמשתמש מספק לאפליקציה שלכם את קוד האימות מהודעת ה-SMS, צריך להחתים את המשתמש על ידי יצירת אובייקט PhoneAuthCredential מקוד האימות ומזהה האימות, והעברת האובייקט הזה אל Auth::SignInWithCredential.
- מבקשים מהמשתמש את קוד האימות.
- יוצרים אובייקט
Credentialמקוד האימות וממזהה האימות.PhoneAuthCredential credential = phone_auth_provider->GetCredential( verification_id_.c_str(), verification_code.c_str());
- מבצעים כניסה של המשתמש באמצעות האובייקט
Credential:Future<User> future = auth_->SignInWithCredential(credential); future.OnCompletion( [](const Future<User*>& result, void*) { if (result.error() == kAuthErrorNone) { // Successful. // User is signed in. 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.is_valid()) { 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 Realtime Database ובCloud Storage כללי האבטחה, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה
auth, ולהשתמש בו כדי לקבוע לאילו נתונים המשתמש יכול לגשת.
אתם יכולים לאפשר למשתמשים להיכנס לאפליקציה שלכם באמצעות כמה ספקי אימות על ידי קישור פרטי הכניסה של ספק האימות לחשבון משתמש קיים.
כדי להוציא משתמש מהחשבון, מתקשרים אל
SignOut():
auth->SignOut();