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

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

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

לפני שמתחילים

  1. לפני שמשתמשים Firebase Authentication צריך להוסיף את Firebase Unity SDK (באופן ספציפי, FirebaseAuth.unitypackage) לפרויקט ב-Unity.

    הוראות מפורטות לשלבי הגדרה ראשוניים אלה מפורטות ב הוספת Firebase ל-Unity פרויקט.

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

חששות אבטחה

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

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

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

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

  1. במסוף Firebase, פותחים את הקטע אימות.
  2. בדף Sign-in Method מפעילים את שיטת הכניסה Phone Number.

קבלת התראות על נקודות APN (ב-iOS בלבד)

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

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

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

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

    2. בוחרים את אישור ההעלאה. לאישור הפיתוח, אישור ייצור, או שניהם. צריך להזין לפחות תמונה אחת.

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

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

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

  1. מאתרים את מספר הטלפון של המשתמש.

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

  2. קוראים ל-PhoneAuthProvider.VerifyPhoneNumber ומעבירים לו את PhoneAuthOptions שמכיל את מספר הטלפון של המשתמש.
    PhoneAuthProvider provider = PhoneAuthProvider.GetInstance(firebaseAuth);
    provider.VerifyPhoneNumber(
      new Firebase.Auth.PhoneAuthOptions {
        PhoneNumber = phoneNumber,
        TimeoutInMilliseconds = phoneAuthTimeoutMs,
        ForceResendingToken = null
      },
      verificationCompleted: (credential) => {
        // Auto-sms-retrieval or instant validation has succeeded (Android only).
        // There is no need to input the verification code.
        // `credential` can be used instead of calling GetCredential().
      },
      verificationFailed: (error) => {
        // The verification code was not sent.
        // `error` contains a human readable explanation of the problem.
      },
      codeSent: (id, token) => {
        // Verification code was successfully sent via SMS.
        // `id` contains the verification id that will need to passed in with
        // the code from the user when calling GetCredential().
        // `token` can be used if the user requests the code be sent again, to
        // tie the two requests together.
      },
      codeAutoRetrievalTimeout: (id) => {
        // Called when the auto-sms-retrieval has timed out, based on the given
        // timeout parameter.
        // `id` contains the verification id of the request that timed out.
      });
    כשקוראים לפונקציה PhoneAuthProvider.VerifyPhoneNumber, ל-Firebase,
    • (ב-iOS), שולחת התראה שקטה לאפליקציה.
    • מערכת Firebase שולחת הודעת SMS עם קוד אימות למספר הטלפון שצוין, ומעבירה מזהה אימות לפונקציית השלמת הטופס. יהיה צורך גם בקוד האימות ואת מזהה האימות לכניסה לחשבון.
  3. כדאי לשמור את מזהה האימות ולשחזר אותו כשהאפליקציה נטענת. כך, אפשר לוודא שעדיין יש לך מזהה אימות תקף, אם האפליקציה הופסק לפני שהמשתמש משלים את תהליך הכניסה (לדוגמה, עוברים לאפליקציית ה-SMS).

    אתם יכולים לשמור את מזהה האימות איך שתרצו. דרך פשוטה שומרים את מזהה האימות בכתובת UnityEngine.PlayerPrefs.

אם תתבצע שיחה חוזרת (callback) שהועברה אל codeSent, אפשר לבקש מהמשתמש להקליד את קוד האימות כשהוא מקבל אותו ב-SMS הודעה.

לעומת זאת, אם הקריאה החוזרת של verificationCompleted היא האימות האוטומטי הסתיים בהצלחה, ועכשיו PhoneAuthCredential שבאמצעותו אפשר להשתמש כמו שמתואר בהמשך.

כניסה לחשבון באמצעות קוד האימות

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

  1. מקבלים את קוד האימות מהמשתמש.
  2. יצירת אובייקט Credential מהאימות קוד ומזהה אימות.
    PhoneAuthCredential credential =
        phoneAuthProvider.GetCredential(verificationId, verificationCode);
        
  3. כניסה של המשתמש באמצעות האובייקט PhoneAuthCredential:
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task =&gt {
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " +
                       task.Exception);
        return;
      }
    
      FirebaseUser newUser = task.Result.User;
      Debug.Log("User signed in successfully");
      // This should display the phone number.
      Debug.Log("Phone number: " + newUser.PhoneNumber);
      // The phone number providerID is 'phone'.
      Debug.Log("Phone provider ID: " + newUser.ProviderId);
    });

השלבים הבאים

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

  • באפליקציות שלכם, תוכלו לקבל את פרטי הפרופיל הבסיסיים של המשתמש דרך אובייקט Firebase.Auth.FirebaseUser:

    Firebase.Auth.FirebaseUser user = auth.CurrentUser;
    if (user != null) {
      string name = user.DisplayName;
      string email = user.Email;
      System.Uri photo_url = user.PhotoUrl;
      // 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 User.TokenAsync() instead.
      string uid = user.UserId;
    }
  • בתוך Firebase Realtime Database ו-Cloud Storage כללי אבטחה – מקבלים את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה auth, ולהשתמש בהם כדי לקבוע לאילו נתונים המשתמש יוכל לגשת.

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

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

auth.SignOut();