כניסה של משתמשים באמצעות Apple ב-Android

במאמר הזה מוסבר איך להשתמש ב-Identity Platform כדי להוסיף את האפשרות כניסה באמצעות Apple לאפליקציית Android.

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

  • הפעלתם את Identity Platform ויש לכם אפליקציית Android בסיסית. במאמר מדריך למתחילים מוסבר איך להפעיל את Identity Platform ולהיכנס לחשבון.

  • מצטרפים ל-Apple Developer Program.

הגדרת האפליקציה באמצעות אפל

באתר של Apple למפתחים:

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

    1. רישום של כתובת URL להחזרה, שנראית כך:

      https://project-id.firebaseapp.com/__/auth/handler
      
    2. אנחנו מארחים באופן זמני קובץ בכתובת ה-URL הבאה כדי לאמת את הדומיין שלך:

      https://project-id.firebaseapp.com/.well-known/apple-developer-domain-association.txt
      

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

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

  3. אם אתם משתמשים ב-Identity Platform כדי לשלוח אימיילים למשתמשים, אתם צריכים להגדיר את הפרויקט באמצעות שירות ממסר האימייל הפרטי של Apple באמצעות כתובת האימייל הבאה:

    noreply@project-id.firebaseapp.com
    

    אפשר גם להשתמש בתבנית אימייל מותאמת אישית, אם יש כזו באפליקציה.

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

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

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

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

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

הגדרת Apple כספק

כדי להגדיר את Apple כספק זהויות:

  1. נכנסים לדף Identity Providers במסוף Google Cloud .

    כניסה לדף Identity Providers

  2. לוחצים על הוספת ספק.

  3. בוחרים באפשרות Apple מהרשימה.

  4. בקטע פלטפורמה, בוחרים באפשרות Android.

  5. מזינים את מזהה השירות, מזהה צוות Apple, מזהה המפתח והמפתח הפרטי.

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

  7. בקטע Configure your application (הגדרת האפליקציה), לוחצים על Android (Android). מעתיקים את קטע הקוד לקוד של האפליקציה כדי להפעיל את Identity Platform client SDK.

  8. לוחצים על Save.

כניסה של משתמשים באמצעות ה-SDK של הלקוח

  1. יוצרים מופע של אובייקט הספק OAuthProvider באמצעות המזהה apple.com:

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("apple.com");
    

    Kotlin

    val provider = OAuthProvider.newBuilder("apple.com")
    
  2. אופציונלי: מוסיפים היקפי הרשאות של OAuth. ההיקפים מציינים אילו נתונים אתם מבקשים מ-Apple. יכול להיות שנתונים רגישים יותר ידרשו היקפי הרשאה ספציפיים. כברירת מחדל, כשהאפשרות חשבון אחד לכל כתובת אימייל מופעלת,‏ Identity Platform מבקש את היקפי ההרשאות email ו-name.

    Java

    List<String> scopes =
        new ArrayList<String>() {
          {
            add("email");
            add("name");
          }
        };
    provider.setScopes(scopes);
    

    Kotlin

    provider.setScopes(arrayOf("email", "name"))
    
  3. אופציונלי: התאמה לשפה המקומית של תהליך האימות. אפשר לציין שפה או להשתמש בשפת ברירת המחדל של המכשיר:

    Java

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr");
    

    Kotlin

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr");
    
  4. מבצעים כניסה של המשתמש באמצעות Identity Platform.

    1. בודקים אם כבר יש תשובה על ידי קריאה ל-startActivityForSignInWithProvider():

      Java

      mAuth = FirebaseAuth.getInstance();
      Task<AuthResult> pending = mAuth.getPendingAuthResult();
      if (pending != null) {
          pending.addOnSuccessListener(new OnSuccessListener<AuthResult>() {
              @Override
              public void onSuccess(AuthResult authResult) {
                  Log.d(TAG, "checkPending:onSuccess:" + authResult);
                  // Get the user profile with authResult.getUser() and
                  // authResult.getAdditionalUserInfo(), and the ID
                  // token from Apple with authResult.getCredential().
              }
          }).addOnFailureListener(new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                  Log.w(TAG, "checkPending:onFailure", e);
              }
          });
      } else {
          Log.d(TAG, "pending: null");
      }
      

      Kotlin

      val pending = auth.pendingAuthResult
      if (pending != null) {
          pending.addOnSuccessListener { authResult ->
              Log.d(TAG, "checkPending:onSuccess:$authResult")
              // Get the user profile with authResult.getUser() and
              // authResult.getAdditionalUserInfo(), and the ID
              // token from Apple with authResult.getCredential().
          }.addOnFailureListener { e ->
              Log.w(TAG, "checkPending:onFailure", e)
          }
      } else {
          Log.d(TAG, "pending: null")
      }
      

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

    2. אם אין תוצאה בהמתנה, מתקשרים למספר startActivityForSignInWithProvider():

      Java

      mAuth.startActivityForSignInWithProvider(this, provider.build())
          .addOnSuccessListener(
                  new OnSuccessListener<AuthResult>() {
                      @Override
                      public void onSuccess(AuthResult authResult) {
                          // Sign-in successful!
                          Log.d(TAG, "activitySignIn:onSuccess:" + authResult.getUser());
                          FirebaseUser user = authResult.getUser();
                          // ...
                      }
                  })
          .addOnFailureListener(
                  new OnFailureListener() {
                      @Override
                      public void onFailure(@NonNull Exception e) {
                          Log.w(TAG, "activitySignIn:onFailure", e);
                      }
                  });
      

      Kotlin

      auth.startActivityForSignInWithProvider(this, provider.build())
        .addOnSuccessListener { authResult ->
            // Sign-in successful!
            Log.d(TAG, "activitySignIn:onSuccess:${authResult.user}")
            val user = authResult.user
            // ...
        }
        .addOnFailureListener { e ->
            Log.w(TAG, "activitySignIn:onFailure", e)
        }
      

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

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

‫Apple משתפת מידע על משתמשים, כמו שמות לתצוגה, רק עם אפליקציות שמשתמשים נכנסים אליהן בפעם הראשונה. ברוב המקרים, Identity Platform מאחסן את הנתונים האלה, כך שאפשר לאחזר אותם באמצעות firebase.auth().currentUser.displayName במהלך סשנים עתידיים. עם זאת, אם אפשרתם למשתמשים להיכנס לאפליקציה שלכם באמצעות אפל לפני השילוב עם Identity Platform, פרטי המשתמשים לא יהיו זמינים.

המאמרים הבאים