אתם יכולים להשתמש ב-Firebase Authentication כדי להכניס משתמש לחשבון על ידי שליחת הודעת SMS לטלפון של המשתמש. המשתמש נכנס לחשבון באמצעות קוד חד-פעמי שמופיע בהודעת ה-SMS.
במאמר הזה מוסבר איך מטמיעים תהליך כניסה באמצעות מספר טלפון באמצעות Firebase SDK.
לפני שמתחילים
- איך מוסיפים את Firebase לפרויקט C++
- אם עדיין לא קישרתם את האפליקציה לפרויקט Firebase, אתם יכולים לעשות זאת דרך מסוף Firebase.
- הסבר על דרישות הפלטפורמה לכניסה באמצעות מספר טלפון:
- הכניסה באמצעות מספר טלפון מיועדת לפלטפורמות לנייד בלבד.
- ב-iOS, הכניסה באמצעות מספר טלפון דורשת מכשיר פיזי ולא תפעל בסימולטור.
בעיות אבטחה
אימות באמצעות מספר טלפון בלבד הוא נוח, אבל פחות מאובטח מהשיטות האחרות שזמינות, כי אפשר להעביר בקלות את הבעלות על מספר טלפון ממשתמש אחד למשתמש אחר. בנוסף, במכשירים עם כמה פרופילי משתמשים, כל משתמש שיכול לקבל הודעות SMS יכול להיכנס לחשבון באמצעות מספר הטלפון של המכשיר.
אם אתם משתמשים באפליקציה שלכם בכניסה שמבוססת על מספר טלפון, אתם צריכים להציע אותה לצד שיטות כניסה מאובטחות יותר, וליידע את המשתמשים לגבי הפשרות בנושא אבטחה שקשורות לשימוש בכניסה באמצעות מספר טלפון.
הפעלת כניסה באמצעות מספר טלפון בפרויקט Firebase
כדי לאפשר למשתמשים להיכנס באמצעות SMS, קודם צריך להפעיל את שיטת הכניסה באמצעות מספר טלפון בפרויקט Firebase:
- במסוף Firebase, פותחים את הקטע Authentication.
- בדף שיטת הכניסה, מפעילים את שיטת הכניסה באמצעות מספר טלפון.
- בדף הגדרות, מגדירים מדיניות לגבי האזורים שרוצים לאפשר או לא לאפשר בהם שליחת הודעות SMS. בפרויקטים חדשים, מדיניות ברירת המחדל לא מאפשרת שימוש באזורים.
התחלת קבלת התראות APNs (פלטפורמות של אפל)
כדי להשתמש באימות באמצעות מספר טלפון בפלטפורמות של אפל, האפליקציה שלכם צריכה להיות מסוגלת לקבל התראות APNs מ-Firebase. כשנכנסים לחשבון של משתמש באמצעות מספר הטלפון שלו בפעם הראשונה במכשיר, Firebase Authentication שולח למכשיר התראה שקטה מסוג push כדי לוודא שבקשת הכניסה באמצעות מספר הטלפון מגיעה מהאפליקציה שלכם. (לכן, אי אפשר להשתמש בכניסה באמצעות מספר הטלפון בסימולטור).
כדי להפעיל התראות APNs לשימוש ב-Firebase Authentication:
- ב-Xcode, מפעילים התראות פוש לפרויקט.
מעלים את אישור ה-APNs ל-Firebase. אם עדיין אין לכם אישור APNs, אתם צריכים ליצור אותו ב-Apple Developer Member Center.
-
בפרויקט במסוף Firebase, לוחצים על סמל גלגל השיניים, בוחרים באפשרות Project Settings ואז בוחרים בכרטיסייה Cloud Messaging.
-
לוחצים על הלחצן העלאת אישור כדי להעלות את אישור הפיתוח, את אישור הייצור או את שניהם. צריך להוסיף לפחות תמונה אחת.
-
לכל אישור, בוחרים את קובץ ה- .p12 ומזינים את הסיסמה, אם יש כזו. מוודאים שמזהה החבילה של האישור הזה תואם למזהה החבילה של האפליקציה. לוחצים על שמירה.
-
שליחת קוד אימות לטלפון של המשתמש
כדי להתחיל את תהליך הכניסה באמצעות מספר טלפון, מציגים למשתמש ממשק שמבקש ממנו לספק את מספר הטלפון שלו, ואז קוראים ל-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 עם קוד אימות למספר הטלפון שצוין ומעבירה מזהה אימות לפונקציית ההשלמה. כדי להיכנס לחשבון של המשתמש, תצטרכו את קוד האימות ואת מזהה האימות.
-
שומרים את מזהה האימות ומשחזרים אותו כשהאפליקציה נטענת. כך תוכלו לוודא שעדיין יש לכם מזהה אימות תקף אם האפליקציה נסגרת לפני שהמשתמש מסיים את תהליך הכניסה (לדוגמה, בזמן המעבר לאפליקציית ה-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();