Google is committed to advancing racial equity for Black communities. See how.
דף זה תורגם על ידי Cloud Translation API.
Switch to English

אמת באמצעות אפל באנדרואיד

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

לפני שאתה מתחיל

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

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

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

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

באתר המפתחים של אפל , בצע את הפעולות הבאות:

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

    https://YOUR_FIREBASE_PROJECT_ID.firebaseapp.com/__/auth/handler

    תוכל לקבל את מזהה הפרויקט שלך ב- Firebase בדף ההגדרות של מסוף Firebase .

    כשתסיים, שים לב למזהה השירות החדש שלך, שתצטרך בסעיף הבא.

  2. צור כניסה באמצעות מפתח פרטי של Apple . תצטרך את המפתח הפרטי החדש שלך ואת מזהה המפתח בחלק הבא.
  3. אם אתה משתמש בתכונות של אימות Firebase השולח דוא"ל למשתמשים, כולל כניסה לקישור דוא"ל, אימות כתובת דוא"ל, ביטול שינוי חשבון ואחרים, הגדר את שירות ממסר הדוא"ל הפרטי של Apple noreply@ YOUR_FIREBASE_PROJECT_ID .firebaseapp.com (או תחום תבנית הדוא"ל המותאם אישית שלך) כדי שאפל תוכל להעביר דוא"ל שנשלח על ידי Firebase Authentication לכתובות דוא"ל של Apple אנונימיות.

אפשר את אפל כספקית כניסה

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

מלא את דרישות הנתונים האנונימיות של Apple

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

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

  • קשר כתובת דוא"ל לתעודת מזהה אפל אנונימית או להיפך.
  • קשר מספר טלפון למזהה אפל אנונימי או להיפך
  • קשר אישורים חברתיים לא אנונימיים (פייסבוק, גוגל וכו ') לתעודת מזהה אפל אנונימית או להיפך.

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

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

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

כדי לטפל בזרימת הכניסה עם Firebase Android SDK, בצע את הצעדים הבאים:

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

    ג'אווה

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

    Kotlin + KTX

    val provider = OAuthProvider.newBuilder("apple.com")
    
  2. אופציונלי: ציין טווחי OAuth 2.0 נוספים מעבר לברירת המחדל שברצונך לבקש מספק האימות.

    ג'אווה

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

    Kotlin + KTX

    provider.setScopes(arrayOf("email", "name"))
    

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

  3. אופציונלי: אם ברצונך להציג את מסך הכניסה של אפל בשפה שאינה אנגלית, הגדר את פרמטר locale . עיין במסמכי הכניסה עם Apple עבור האזורים הנתמכים.

    ג'אווה

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

    Kotlin + KTX

    // Localize the Apple authentication screen in French.
    provider.addCustomParameter("locale", "fr")
    
  4. אמת באמצעות Firebase באמצעות אובייקט ספק ה- OAuth. שים לב שבניגוד לפעולות אחרות של FirebaseAuth , זה ישתלט על ממשק המשתמש שלך על ידי פתיחת כרטיסיית Chrome מותאמת אישית. כתוצאה מכך, אל OnSuccessListener OnFailureListener שלך ב- OnSuccessListener וב- OnFailureListener שאתה מצרף מכיוון שהם OnFailureListener מיד כאשר הפעולה תפעיל את ממשק המשתמש.

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

    כדי לבדוק אם יש תוצאה בהמתנה, התקשר ל- getPendingAuthResult() :

    ג'אווה

    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 + KTX

    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")
    }
    

    אם אין תוצאה ממתינים, התחל את זרימת הכניסה באמצעות קריאה ל- startActivityForSignInWithProvider() :

    ג'אווה

    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 + KTX

    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)
            }
    

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

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

    אפל משתפת פרטי משתמש, כגון שם התצוגה, רק עם אפליקציות בפעם הראשונה שמשתמש נכנס. בדרך כלל Firebase שומרת את שם התצוגה בפעם הראשונה שמשתמש נכנס עם Apple, אותה תוכל להשיג באמצעות getCurrentUser().getDisplayName() . עם זאת, אם בעבר השתמשת באפל כדי להיכנס למשתמש לאפליקציה מבלי להשתמש ב- Firebase, אפל לא תספק ל- Firebase את שם התצוגה של המשתמש.

אימות מחדש וקישור חשבונות

ניתן להשתמש באותה תבנית עם startActivityForReauthenticateWithProvider() בה תוכלו להשתמש בכדי לאחזר אישורים חדשים לפעולות רגישות הדורשות כניסה לאחרונה:

ג'אווה

// The user is already signed-in.
FirebaseUser firebaseUser = mAuth.getCurrentUser();

firebaseUser
    .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
    .addOnSuccessListener(
        new OnSuccessListener<AuthResult>() {
          @Override
          public void onSuccess(AuthResult authResult) {
            // User is re-authenticated with fresh tokens and
            // should be able to perform sensitive operations
            // like account deletion and email or password
            // update.
          }
        })
    .addOnFailureListener(
        new OnFailureListener() {
          @Override
          public void onFailure(@NonNull Exception e) {
            // Handle failure.
          }
        });

Kotlin + KTX

// The user is already signed-in.
val firebaseUser = auth.getCurrentUser()

firebaseUser
    .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build())
    .addOnSuccessListener( authResult -> {
        // User is re-authenticated with fresh tokens and
        // should be able to perform sensitive operations
        // like account deletion and email or password
        // update.
    })
    .addOnFailureListener( e -> {
        // Handle failure.
    })

בנוסף, תוכלו להשתמש ב- linkWithCredential() כדי לקשר ספקי זהות שונים לחשבונות קיימים.

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

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

ג'אווה

// Initialize a Facebook credential with a Facebook access token.
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());

// Assuming the current user is an Apple user linking a Facebook provider.
mAuth.getCurrentUser().linkWithCredential(credential)
    .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
      @Override
      public void onComplete(@NonNull Task<AuthResult> task) {
        if (task.isSuccessful()) {
          // Facebook credential is linked to the current Apple user.
          // The user can now sign in to the same account
          // with either Apple or Facebook.
        }
      }
    });

Kotlin + KTX

// Initialize a Facebook credential with a Facebook access token.
val credential = FacebookAuthProvider.getCredential(token.getToken())

// Assuming the current user is an Apple user linking a Facebook provider.
mAuth.getCurrentUser().linkWithCredential(credential)
    .addOnCompleteListener(this, task -> {
        if (task.isSuccessful()) {
          // Facebook credential is linked to the current Apple user.
          // The user can now sign in to the same account
          // with either Apple or Facebook.
        }
      });

מתקדם: לטפל בזרימת הכניסה באופן ידני

ניתן גם לבצע אימות עם Firebase באמצעות חשבון Apple על ידי טיפול בזרימת הכניסה באמצעות שימוש בכניסה JS SDK של Apple, בנייה ידנית של זרימת OAuth או שימוש בספריית OAuth כגון AppAuth .

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

    באפשרותך ליצור Nonce מאובטח בהצפנה באנדרואיד באמצעות SecureRandom , כמו בדוגמה הבאה:

    ג'אווה

    private String generateNonce(int length) {
        SecureRandom generator = new SecureRandom();
    
        CharsetDecoder charsetDecoder = StandardCharsets.US_ASCII.newDecoder();
        charsetDecoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
        charsetDecoder.onMalformedInput(CodingErrorAction.IGNORE);
    
        byte[] bytes = new byte[length];
        ByteBuffer inBuffer = ByteBuffer.wrap(bytes);
        CharBuffer outBuffer = CharBuffer.allocate(length);
        while (outBuffer.hasRemaining()) {
            generator.nextBytes(bytes);
            inBuffer.rewind();
            charsetDecoder.reset();
            charsetDecoder.decode(inBuffer, outBuffer, false);
        }
        outBuffer.flip();
        return outBuffer.toString();
    }
    

    Kotlin + KTX

    private fun generateNonce(length: Int): String {
        val generator = SecureRandom()
    
        val charsetDecoder = StandardCharsets.US_ASCII.newDecoder()
        charsetDecoder.onUnmappableCharacter(CodingErrorAction.IGNORE)
        charsetDecoder.onMalformedInput(CodingErrorAction.IGNORE)
    
        val bytes = ByteArray(length)
        val inBuffer = ByteBuffer.wrap(bytes)
        val outBuffer = CharBuffer.allocate(length)
        while (outBuffer.hasRemaining()) {
            generator.nextBytes(bytes)
            inBuffer.rewind()
            charsetDecoder.reset()
            charsetDecoder.decode(inBuffer, outBuffer, false)
        }
        outBuffer.flip()
        return outBuffer.toString()
    }
    

    לאחר מכן, קבל את ה- SHA246 של ה- nonce כמחרוזת hex:

    ג'אווה

    private String sha256(String s) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] digest = md.digest(s.getBytes());
        StringBuilder hash = new StringBuilder();
        for (byte c: digest) {
            hash.append(String.format("%02x", c));
        }
        return hash.toString();
    }
    

    Kotlin + KTX

    private fun sha256(s: String): String {
        val md = MessageDigest.getInstance("SHA-256")
        val digest = md.digest(s.toByteArray())
        val hash = StringBuilder()
        for (c in digest) {
            hash.append(String.format("%02x", c))
        }
        return hash.toString()
    }
    

    אתה תשלח את ה- SHA256 של ה- nonce עם בקשת הכניסה שלך, שאפל תעביר ללא שינוי בתגובה. Firebase מאמת את התגובה על ידי גיבוב של ה- nonce המקורי ומשווה אותו לערך שהועברה על ידי אפל.

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

  3. לאחר שתקבל את תגובת אפל, השג את אסימון המזהה מהתגובה והשתמש בו ובנונצ'ה הבלתי מעורערת ליצירת AuthCredential :

    ג'אווה

    AuthCredential credential =  OAuthProvider.newCredentialBuilder("apple.com")
        .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce)
        .build();
    

    Kotlin + KTX

    val credential =  OAuthProvider.newCredentialBuilder("apple.com")
        .setIdTokenWithRawNonce(appleIdToken, rawUnhashedNonce)
        .build()
    
  4. אמת באמצעות Firebase באמצעות אישורי Firebase:

    ג'אווה

    mAuth.signInWithCredential(credential)
        .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
          @Override
          public void onComplete(@NonNull Task<AuthResult> task) {
            if (task.isSuccessful()) {
              // User successfully signed in with Apple ID token.
              // ...
            }
          }
        });
    

    Kotlin + KTX

    auth.signInWithCredential(credential)
          .addOnCompleteListener(this) { task ->
              if (task.isSuccessful) {
                // User successfully signed in with Apple ID token.
                // ...
              }
          }
    

אם הקריאה ל- signInWithCredential מצליחה, תוכל להשתמש בשיטת getCurrentUser כדי לקבל את נתוני החשבון של המשתמש.

הצעדים הבאים

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

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

  • במסד הנתונים שלך בזמן אמת של Firebase ובכללי האבטחה של אחסון ענן, אתה יכול לקבל את מזהה המשתמש הייחודי של המשתמש auth ממשתנה auth , ולהשתמש בו כדי לשלוט לאילו נתונים המשתמש יכול לגשת.

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

כדי לצאת ממשתמש, התקשר ל- signOut :

ג'אווה

FirebaseAuth.getInstance().signOut();

Kotlin + KTX

Firebase.auth.signOut()