אימות באמצעות Apple ו-Unity

אתם יכולים לאפשר למשתמשים שלכם לבצע אימות באמצעות Firebase באמצעות Apple ID שלהם, על ידי שימוש ב-Firebase SDK כדי לבצע את תהליך הכניסה מקצה לקצה של OAuth 2.0.

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

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

הצטרפות לתוכנית המפתחים של אפל

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

הגדרת כניסה באמצעות Apple

צריך להפעיל את התכונה 'כניסה באמצעות חשבון Apple' ולהגדיר אותה בצורה נכונה בפרויקט Firebase. ההגדרה של Apple Developer משתנה בין פלטפורמות Android ו-Apple. לפני שממשיכים, צריך לפעול לפי ההוראות שבקטע 'הגדרת כניסה באמצעות אפל' במדריכים ל-iOS+‎ או ל-Android.

הפעלת Apple כספק כניסה

  1. במסוף Firebase, פותחים את הקטע אימות. בכרטיסייה שיטת הכניסה, מפעילים את הספק Apple.
  2. מגדירים את הספק 'כניסה באמצעות חשבון Apple':
    1. אם אתם פורסים את האפליקציה רק בפלטפורמות של אפל, אתם יכולים להשאיר את השדות Service ID, ‏ Apple Team ID, ‏ private key ו-key ID ריקים.
    2. לקבלת תמיכה במכשירי Android:
      1. איך מוסיפים את Firebase לפרויקט Android חשוב לרשום את חתימת ה-SHA-1 של האפליקציה כשמגדירים את האפליקציה במסוף Firebase.
      2. במסוף Firebase, פותחים את הקטע אימות. בכרטיסייה שיטת הכניסה, מפעילים את הספק Apple. מציינים את מזהה השירות שיצרתם בקטע הקודם. בנוסף, בקטע ההגדרות של תהליך קבלת קוד OAuth, מציינים את מזהה הצוות שלכם ב-Apple, את המפתח הפרטי ואת מזהה המפתח שיצרתם בקטע הקודם.

עמידה בדרישות של Apple לגבי נתונים שעברו אנונימיזציה

התכונה 'כניסה באמצעות אפל' מאפשרת למשתמשים להפוך את הנתונים שלהם לאנונימיים, כולל כתובת האימייל שלהם, כשהם נכנסים לחשבון. משתמשים שבוחרים באפשרות הזו מקבלים כתובות אימייל עם הדומיין privaterelay.appleid.com. כשמשתמשים בתכונה 'כניסה באמצעות Apple' באפליקציה, צריך לפעול בהתאם לכללי המדיניות או לתנאים הרלוונטיים למפתחים של Apple בנוגע למזהי Apple האנונימיים האלה.

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

  • קישור של כתובת אימייל ל-Apple ID שעבר אנונימיזציה או להפך.
  • קישור של מספר טלפון ל-Apple ID אנונימי או להיפך
  • לקשר פרטי כניסה לרשתות חברתיות שלא עברו אנונימיזציה (פייסבוק, Google וכו') למזהה Apple שעבר אנונימיזציה או להיפך.

הרשימה שלמעלה היא חלקית. כדי לוודא שהאפליקציה עומדת בדרישות של Apple, אפשר לעיין בהסכם הרישיון של Apple Developer Program בקטע Membership בחשבון הפיתוח.

גישה לכיתה Firebase.Auth.FirebaseAuth

המחלקות FirebaseAuth הן שער לכל הקריאות ל-API. אפשר לגשת אליו דרך FirebaseAuth.DefaultInstance.
Firebase.Auth.FirebaseAuth auth = Firebase.Auth.FirebaseAuth.DefaultInstance;

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

תהליך הכניסה באמצעות Apple משתנה בין פלטפורמות Apple ו-Android.

בפלטפורמות של Apple

  1. מתקינים פלאגין של צד שלישי לטיפול בערך חד-פעמי (nonce) ובטוקן של הכניסה באמצעות חשבון Apple, כמו Unity's Sign In With Apple Asset Storage Package. יכול להיות שתצטרכו לשנות את הקוד כדי להעביר את המחרוזת האקראית של ה-nonce שנוצרה במצב המחרוזת הגולמית שלה לשימוש בפעולות של Firebase (כלומר, לשמור עותק שלה לפני שנוצר טופס הגיבוב SHA256 של ה-nonce).

  2. משתמשים במחרוזת האסימון וב-nonce הגולמי שמתקבלים כדי ליצור FirebaseCredential ולהיכנס ל-Firebase.

    Firebase.Auth.Credential credential =
        Firebase.Auth.OAuthProvider.GetCredential("apple.com", appleIdToken, rawNonce, null);
    auth.SignInAndRetrieveDataWithCredentialAsync(credential).ContinueWith(task => {
      if (task.IsCanceled) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync was canceled.");
        return;
      }
      if (task.IsFaulted) {
        Debug.LogError("SignInAndRetrieveDataWithCredentialAsync encountered an error: " + task.Exception);
        return;
      }
    
      Firebase.Auth.AuthResult result = task.Result;
      Debug.LogFormat("User signed in successfully: {0} ({1})",
          result.User.DisplayName, result.User.UserId);
    });

  3. אפשר להשתמש באותו דפוס עם ReauthenticateAsync כדי לאחזר פרטי כניסה עדכניים לפעולות רגישות שדורשות כניסה עדכנית. מידע נוסף זמין במאמר בנושא ניהול משתמשים.

  4. כשמקשרים באמצעות 'כניסה באמצעות חשבון אפל' בפלטפורמות של אפל, יכול להיות שתיתקלו בשגיאה שלפיה חשבון Firebase קיים כבר קושר לחשבון אפל. כשזה קורה, מוצגת Firebase.Auth.FirebaseAccountLinkException במקום Firebase.FirebaseException הרגיל. במקרה כזה, החריגה כוללת מאפיין UserInfo.UpdatedCredential שאם הוא תקין, אפשר להשתמש בו כדי להיכנס לחשבון של המשתמש שמקושר ל-Apple דרך FirebaseAuth.SignInAndRetrieveDataWithCredentialAsync. האישורים המעודכנים מאפשרים לבצע את פעולת הכניסה בלי ליצור טוקן חדש של כניסה באמצעות Apple עם ערך חד-פעמי.

    auth.CurrentUser.LinkWithCredentialAsync(
      Firebase.Auth.OAuthProvider.GetCredential("apple.com", idToken, rawNonce, null))
        .ContinueWithOnMainThread( task => {
          if (task.IsCompletedSuccessfully) {
            // Link Success
          } else {
            if (task.Exception != null) {
              foreach (Exception exception in task.Exception.Flatten().InnerExceptions) {
                Firebase.Auth.FirebaseAccountLinkException firebaseEx =
                  exception as Firebase.Auth.FirebaseAccountLinkException;
                if (firebaseEx != null && firebaseEx.UserInfo.UpdatedCredential.IsValid()) {
                  // Attempt to sign in with the updated credential.
                  auth.SignInAndRetrieveDataWithCredentialAsync(firebaseEx.UserInfo.UpdatedCredential).
                    ContinueWithOnMainThread( authResultTask => {
                      // Handle Auth result.
                    });
                } else {
                  Debug.Log("Link with Apple failed:" + firebaseEx );
                }
              } // end for loop
            }
          }
        });

ב-Android

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

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

  1. יוצרים מופע של FederatedOAuthProviderData שמוגדר עם מזהה הספק שמתאים ל-Apple.

    Firebase.Auth.FederatedOAuthProviderData providerData =
      new Firebase.Auth.FederatedOAuthProviderData();
    
    providerData.ProviderId = "apple.com";
    
  2. אופציונלי: מציינים היקפי הרשאות נוספים של OAuth 2.0 מעבר לברירת המחדל שרוצים לבקש מספק האימות.

    providerData.Scopes = new List<string>();
    providerData.Scopes.Add("email");
    providerData.Scopes.Add("name");
    
  3. אופציונלי: אם רוצים להציג את מסך הכניסה של אפל בשפה שאינה אנגלית, מגדירים את הפרמטר locale. במסמכים בנושא 'כניסה באמצעות Apple' מפורטים הלוקאלים הנתמכים.

    providerData.CustomParameters = new Dictionary<string,string>;
    
    // Localize to French.
    providerData.CustomParameters.Add("language", "fr");
    
  4. אחרי שמגדירים את נתוני הספק, משתמשים בהם כדי ליצור FederatedOAuthProvider.

    // Construct a FederatedOAuthProvider for use in Auth methods.
    Firebase.Auth.FederatedOAuthProvider provider =
      new Firebase.Auth.FederatedOAuthProvider();
    provider.SetProviderData(providerData);
    
  5. מתבצע אימות באמצעות Firebase באמצעות אובייקט ספק האימות. שימו לב: בניגוד לפעולות אחרות של FirebaseAuth, הפעולה הזו תשתלט על ממשק המשתמש על ידי הצגת תצוגת אינטרנט שבה המשתמש יכול להזין את פרטי הכניסה שלו.

    כדי להתחיל את תהליך הכניסה, קוראים לפונקציה signInWithProvider:

    auth.SignInWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("SignInWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError("SignInWithProviderAsync encountered an error: " +
              task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User signed in successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  6. אפשר להשתמש באותו דפוס עם ReauthenticateWithProvider כדי לאחזר פרטי כניסה עדכניים לפעולות רגישות שדורשות כניסה עדכנית.

    user.ReauthenticateWithProviderAsync(provider).ContinueOnMainThread(task => {
        if (task.IsCanceled) {
            Debug.LogError("ReauthenticateWithProviderAsync was canceled.");
            return;
        }
        if (task.IsFaulted) {
            Debug.LogError(
            "ReauthenticateWithProviderAsync encountered an error: " +
                task.Exception);
            return;
        }
    
        Firebase.Auth.AuthResult authResult = task.Result;
        Firebase.Auth.FirebaseUser user = authResult.User;
        Debug.LogFormat("User reauthenticated successfully: {0} ({1})",
            user.DisplayName, user.UserId);
    });
    
  7. בנוסף, אפשר להשתמש ב-LinkWithCredentialAsync() כדי לקשר ספקי זהויות שונים לחשבונות קיימים.

    חשוב לזכור שחברת אפל דורשת לקבל מהמשתמשים הסכמה מפורשת לפני שמקשרים את החשבונות שלהם ב-Apple לנתונים אחרים.

    לדוגמה, כדי לקשר חשבון פייסבוק לחשבון Firebase הנוכחי, משתמשים באסימון הגישה שקיבלתם מהתחברות המשתמש לפייסבוק:

    // Initialize a Facebook credential with a Facebook access token.
    
    Firebase.Auth.Credential credential =
        Firebase.Auth.FacebookAuthProvider.GetCredential(facebook_token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    user.LinkWithCredentialAsync(credential)
        .ContinueWithOnMainThread( task => {
          if (task.IsCanceled) {
              Debug.LogError("LinkWithCredentialAsync was canceled.");
              return;
          }
          if (task.IsFaulted) {
            Debug.LogError("LinkWithCredentialAsync encountered an error: "
                           + task.Exception);
              return;
          }
    
          Firebase.Auth.AuthResult result = task.Result;
          Firebase.Auth.FirebaseUser user = result.User;
          Debug.LogFormat("User linked successfully: {0} ({1})",
              user.DisplayName, user.UserId);
        });
    

כניסה באמצעות 'הערות' של אפל

בניגוד לספקים אחרים שנתמכים על ידי Firebase Auth, ‏ Apple לא מספקת כתובת URL של תמונה.

בנוסף, אם המשתמש בוחר לא לשתף את כתובת האימייל שלו עם האפליקציה, אפל מספקת למשתמש כתובת אימייל ייחודית (בפורמט xyz@privaterelay.appleid.com) ומשתפת אותה עם האפליקציה שלכם. אם הגדרתם את שירות העברת האימייל הפרטי, אפל מעבירה את האימיילים שנשלחים לכתובת האנונימית לכתובת האימייל האמיתית של המשתמש.

‫Apple משתפת מידע על המשתמשים, כמו השם לתצוגה, רק עם אפליקציות שבהן המשתמש נכנס לחשבון בפעם הראשונה. בדרך כלל, Firebase שומר את שם התצוגה בפעם הראשונה שמשתמש נכנס לחשבון באמצעות Apple, ואפשר לקבל אותו באמצעות auth.CurrentUser.DisplayName. עם זאת, אם השתמשתם בעבר ב-Apple כדי להחתים משתמש באפליקציה בלי להשתמש ב-Firebase, ‏ Apple לא תספק ל-Firebase את השם המוצג של המשתמש.

השלבים הבאים

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

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

בכללי האבטחה של Firebase Realtime Database ו-Cloud Storage, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה auth, ולהשתמש בו כדי לקבוע לאילו נתונים המשתמש יכול לגשת.