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