אתם יכולים לאפשר למשתמשים שלכם לבצע אימות באמצעות Firebase באמצעות Apple ID שלהם, על ידי שימוש ב-Firebase SDK כדי לבצע את תהליך הכניסה של OAuth 2.0 מקצה לקצה.
לפני שמתחילים
כדי לאפשר למשתמשים להיכנס באמצעות אפל, קודם צריך להגדיר את הכניסה באמצעות אפל באתר למפתחים של אפל, ואז להפעיל את אפל כספק כניסה בפרויקט Firebase.
הצטרפות לתוכנית המפתחים של אפל
רק חברים בתוכנית המפתחים של Apple יכולים להגדיר כניסה באמצעות Apple.
הגדרת כניסה באמצעות Apple
צריך להפעיל את התכונה 'כניסה באמצעות חשבון Apple' ולהגדיר אותה בצורה נכונה בפרויקט Firebase. ההגדרה של Apple Developer משתנה בין פלטפורמות Android ו-Apple. לפני שממשיכים, צריך לפעול לפי ההוראות שבקטע 'הגדרת כניסה באמצעות אפל' במדריכים ל-iOS+ או ל-Android.הפעלת Apple כספק כניסה
- במסוף Firebase, עוברים אל Security (אבטחה) > Authentication (אימות).
- בכרטיסייה שיטת כניסה, מפעילים את ספק הכניסה אפל.
- מגדירים את ספק הכניסה באמצעות חשבון Apple:
- Apple: אם אתם פורסים את האפליקציה רק בפלטפורמות של Apple, אתם יכולים להשאיר את השדות Service ID, Apple Team ID, private key ו-key ID ריקים.
-
Android: כדי לתמוך במכשירי Android, צריך לבצע את הפעולות הבאות:
- איך מוסיפים את Firebase לפרויקט Android
-
אם עדיין לא עשיתם זאת, מציינים את טביעת האצבע מסוג SHA-1 של האפליקציה.
-
במסוף Firebase, עוברים אל
הגדרות > הכרטיסייה כללי. - גוללים למטה לכרטיס האפליקציות שלך, בוחרים את האפליקציה ל-Android ומוסיפים את טביעת האצבע של אישור ה-SHA בשדה טביעות אצבע של אישור SHA.
במאמר אימות הלקוח מוסבר איך מקבלים את טביעת האצבע של ה-SHA של האפליקציה.
-
במסוף Firebase, עוברים אל
-
מגדירים את ספק הכניסה באמצעות חשבון Apple:
- במסוף Firebase, עוברים אל Security (אבטחה) > Authentication (אימות).
- בכרטיסייה שיטת הכניסה, לוחצים על ספק הכניסה 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
מתקינים פלאגין של צד שלישי כדי לטפל בערך חד-פעמי (nonce) ובטוקן של הכניסה באמצעות חשבון Apple, כמו Unity's Sign In With Apple Asset Storage Package. יכול להיות שתצטרכו לשנות את הקוד כדי להעביר את מחרוזת ה-nonce האקראית שנוצרה במצב המחרוזת הגולמית שלה לשימוש בפעולות של Firebase (כלומר, לאחסן עותק שלה לפני שנוצר טופס הגיבוב של ה-nonce ב-SHA256).
משתמשים במחרוזת האסימון וב-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); });
אפשר להשתמש באותו דפוס עם
ReauthenticateAsyncכדי לאחזר פרטי כניסה עדכניים לפעולות רגישות שדורשות כניסה עדכנית. מידע נוסף זמין במאמר בנושא ניהול משתמשים.כשמקשרים באמצעות 'כניסה באמצעות חשבון אפל' בפלטפורמות של אפל, יכול להיות שתיתקלו בשגיאה שלפיה חשבון Firebase קיים כבר קושר לחשבון אפל. במקרה כזה, במקום
Firebase.FirebaseExceptionהרגיל, תופעלFirebase.Auth.FirebaseAccountLinkException. במקרה כזה, החריגה כוללת מאפייןUserInfo.UpdatedCredentialשאם הוא תקין, אפשר להשתמש בו כדי להיכנס דרךFirebaseAuth.SignInAndRetrieveDataWithCredentialAsyncלחשבון המשתמש שמקושר ל-Apple. פרטי הכניסה המעודכנים מאפשרים לבצע את פעולת הכניסה בלי ליצור טוקן חדש לכניסה באמצעות אפל עם צופן חד-פעמי (nonce).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, פועלים לפי השלבים הבאים:
יוצרים מופע של
FederatedOAuthProviderDataשמוגדר עם מזהה הספק שמתאים ל-Apple.Firebase.Auth.FederatedOAuthProviderData providerData = new Firebase.Auth.FederatedOAuthProviderData(); providerData.ProviderId = "apple.com";אופציונלי: מציינים היקפי הרשאות נוספים של OAuth 2.0 מעבר להיקף ברירת המחדל שרוצים לבקש מספק האימות.
providerData.Scopes = new List<string>(); providerData.Scopes.Add("email"); providerData.Scopes.Add("name");אופציונלי: אם רוצים להציג את מסך הכניסה של אפל בשפה שאינה אנגלית, מגדירים את הפרמטר
locale. במסמכים בנושא 'כניסה באמצעות Apple' מפורטים הלוקאלים הנתמכים.providerData.CustomParameters = new Dictionary<string,string>; // Localize to French. providerData.CustomParameters.Add("language", "fr");אחרי שמגדירים את נתוני הספק, משתמשים בהם כדי ליצור FederatedOAuthProvider.
// Construct a FederatedOAuthProvider for use in Auth methods. Firebase.Auth.FederatedOAuthProvider provider = new Firebase.Auth.FederatedOAuthProvider(); provider.SetProviderData(providerData);מתבצע אימות באמצעות 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); });אפשר להשתמש באותו דפוס עם
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); });בנוסף, אפשר להשתמש ב-
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); });
כניסה באמצעות Apple Notes
בניגוד לספקים אחרים שנתמכים על ידי Firebase Auth, Apple לא מספקת כתובת URL של תמונה.
בנוסף, אם המשתמש בוחר לא לשתף את כתובת האימייל שלו עם האפליקציה, אפל מספקת כתובת אימייל ייחודית למשתמש (בפורמט xyz@privaterelay.appleid.com) ומשתפת אותה עם האפליקציה שלכם. אם הגדרתם את שירות העברת האימייל הפרטי, אפל מעבירה אימיילים שנשלחים לכתובת האנונימית לכתובת האימייל האמיתית של המשתמש.
Apple משתפת מידע על משתמשים, כמו השם לתצוגה, רק עם אפליקציות שמשתמש נכנס אליהן בפעם הראשונה. בדרך כלל, Firebase שומר את שם התצוגה בפעם הראשונה שמשתמש נכנס לחשבון באמצעות Apple, ואפשר לקבל אותו באמצעות auth.CurrentUser.DisplayName.
עם זאת, אם השתמשתם בעבר ב-Apple כדי להחתים משתמש באפליקציה בלי להשתמש ב-Firebase, Apple לא תספק ל-Firebase את השם המוצג של המשתמש.
השלבים הבאים
אחרי שמשתמש נכנס לחשבון בפעם הראשונה, נוצר חשבון משתמש חדש שמקושר לפרטי הכניסה – כלומר, שם המשתמש והסיסמה, מספר הטלפון או פרטי ספק האימות – שבאמצעותם המשתמש נכנס לחשבון. החשבון החדש הזה נשמר כחלק מפרויקט Firebase, ואפשר להשתמש בו כדי לזהות משתמש בכל האפליקציות בפרויקט, בלי קשר לשיטת הכניסה של המשתמש.באפליקציות שלכם, אתם יכולים לקבל את פרטי הפרופיל הבסיסיים של המשתמש מאובייקט Firebase.Auth.FirebaseUser. איך מנהלים משתמשים
בכללי האבטחה של מסד נתונים בזמן אמת ב-Firebase ו-Cloud Storage, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה auth, ולהשתמש בו כדי לקבוע לאילו נתונים המשתמש יכול לגשת.