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

אימות באמצעות Apple ו- C ++

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

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

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

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

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

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

יש להפעיל את כניסת Apple ולהגדיר כראוי בפרויקט Firebase שלך. התצורה משתנה בין פלטפורמות Android ו- iOS. אנא עקוב אחר הקטע "הגדר כניסה באמצעות Apple" במדריכי iOS ו / או Android לפני שתמשיך.

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

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

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

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

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

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

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

גש ל- firebase::auth::Auth class

מחלקת Auth היא השער לכל שיחות ה- API.
  1. הוסף את קבצי הכותרת Auth ו- App:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. בקוד האתחול שלך, צור firebase::App מחלקת firebase::App .
    #if defined(__ANDROID__)
      firebase::App* app =
          firebase::App::Create(firebase::AppOptions(), my_jni_env, my_activity);
    #else
      firebase::App* app = firebase::App::Create(firebase::AppOptions());
    #endif  // defined(__ANDROID__)
    
  3. רכוש את firebase::auth::Auth מחלקה firebase::App עבור firebase::App שלך firebase::App . יש מיפוי אחד לאחד בין App Auth .
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

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

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

ב- iOS

אמת את המשתמשים שלך באמצעות Firebase באמצעות ה- Apple Sign In Objective-C SDK שהופעל מקוד C ++ שלך.

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

      - (NSString *)randomNonce:(NSInteger)length {
        NSAssert(length > 0, @"Expected nonce to have positive length");
        NSString *characterSet = @"0123456789ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz-._";
        NSMutableString *result = [NSMutableString string];
        NSInteger remainingLength = length;
    
        while (remainingLength > 0) {
          NSMutableArray *randoms = [NSMutableArray arrayWithCapacity:16];
          for (NSInteger i = 0; i < 16; i++) {
            uint8_t random = 0;
            int errorCode = SecRandomCopyBytes(kSecRandomDefault, 1, &random);
            NSAssert(errorCode == errSecSuccess, @"Unable to generate nonce: OSStatus %i", errorCode);
    
            [randoms addObject:@(random)];
          }
    
          for (NSNumber *random in randoms) {
            if (remainingLength == 0) {
              break;
            }
    
            if (random.unsignedIntValue < characterSet.length) {
              unichar character = [characterSet characterAtIndex:random.unsignedIntValue];
              [result appendFormat:@"%C", character];
              remainingLength--;
            }
          }
        }
      }
    
    

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

  2. התחל את זרימת הכניסה של אפל, כולל בבקשתך את ה- Hash של SHA256 של ה- nonce ושל מחלקת הנציגים שתטפל בתגובה של אפל (ראה את השלב הבא):

      - (void)startSignInWithAppleFlow {
        NSString *nonce = [self randomNonce:32];
        self.currentNonce = nonce;
        ASAuthorizationAppleIDProvider *appleIDProvider = [[ASAuthorizationAppleIDProvider alloc] init];
        ASAuthorizationAppleIDRequest *request = [appleIDProvider createRequest];
        request.requestedScopes = @[ASAuthorizationScopeFullName, ASAuthorizationScopeEmail];
        request.nonce = [self stringBySha256HashingString:nonce];
    
        ASAuthorizationController *authorizationController =
            [[ASAuthorizationController alloc] initWithAuthorizationRequests:@[request]];
        authorizationController.delegate = self;
        authorizationController.presentationContextProvider = self;
        [authorizationController performRequests];
      }
    
      - (NSString *)stringBySha256HashingString:(NSString *)input {
        const char *string = [input UTF8String];
        unsigned char result[CC_SHA256_DIGEST_LENGTH];
        CC_SHA256(string, (CC_LONG)strlen(string), result);
    
        NSMutableString *hashed = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
        for (NSInteger i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
          [hashed appendFormat:@"%02x", result[i]];
        }
        return hashed;
      }
    
  3. טפל בתגובת אפל ביישום ASAuthorizationControllerDelegate שלך. אם הכניסה הצליחה, השתמש באסימון הזיהוי מהתגובה של אפל עם ה- nonce שלא נפגע כדי לאמת עם Firebase:

      - (void)authorizationController:(ASAuthorizationController *)controller
         didCompleteWithAuthorization:(ASAuthorization *)authorization API_AVAILABLE(ios(13.0)) {
        if ([authorization.credential isKindOfClass:[ASAuthorizationAppleIDCredential class]]) {
          ASAuthorizationAppleIDCredential *appleIDCredential = authorization.credential;
          NSString *rawNonce = self.currentNonce;
          NSAssert(rawNonce != nil, @"Invalid state: A login callback was received, but no login request was sent.");
    
          if (appleIDCredential.identityToken == nil) {
            NSLog(@"Unable to fetch identity token.");
            return;
          }
    
          NSString *idToken = [[NSString alloc] initWithData:appleIDCredential.identityToken
                                                    encoding:NSUTF8StringEncoding];
          if (idToken == nil) {
            NSLog(@"Unable to serialize id token from data: %@", appleIDCredential.identityToken);
          }
        }
    
  4. השתמש במחרוזת האסימונים המתקבלת ובלא מיקום אורגניאלי כדי לבנות אישורי Firebase ולהיכנס ל- Firebase.

    firebase::auth::OAuthProvider::GetCredential(
            /*provider_id=*/"apple.com", token, nonce,
            /*access_token=*/nullptr);
    
    firebase::Future<firebase::auth::User*> result =
        auth->SignInWithCredential(credential);
    
  5. ניתן להשתמש באותה תבנית עם Reauthenticate אשר ניתן להשתמש בה כדי לאחזר אישורים חדשים לפעולות רגישות הדורשות כניסה לאחרונה.

    firebase::Future<firebase::auth::SignInResult> result =
        user->Reauthenticate(credential);
    
  6. ניתן להשתמש באותה תבנית לקישור חשבון עם Apple Sign In. עם זאת, אתה עלול להיתקל בשגיאה כאשר חשבון Firebase קיים כבר מקושר לחשבון Apple שאליו אתה מנסה לקשר. כאשר זה קורה העתיד יחזיר סטטוס של kAuthErrorCredentialAlreadyInUse והאובייקט UserInfo של SignInResult עשוי להכיל updated_credential חוקי. ניתן להשתמש SignInWithCredential לחשבון המקושר ל- Apple באמצעות SignInWithCredential ללא צורך ליצור אסימון כניסה אחר של Apple וללא כניסה.

    שים לב שעליך להשתמש ב- LinkAndRetrieveDataWithCredential מנת LinkAndRetrieveDataWithCredential זו תכיל את האישור שכן updated_credential הוא חבר באובייקט SignInResult.UserInfo .

    firebase::Future<firebase::auth::SignInResult> link_result =
        auth->current_user()->LinkAndRetrieveDataWithCredential(credential);
    
    // To keep example simple, wait on the current thread until call completes.
    while (link_result.status() == firebase::kFutureStatusPending) {
      Wait(100);
    }
    
    // Determine the result of the link attempt
    if (link_result.error() == firebase::auth::kAuthErrorNone) {
      // user linked correctly.
    } else if (link_result.error() ==
                   firebase::auth::kAuthErrorCredentialAlreadyInUse &&
               link_result.result()->info.updated_credential.is_valid()) {
      // Sign In with the new credential
      firebase::Future<firebase::auth::User*> result = auth->SignInWithCredential(
          link_result.result()->info.updated_credential);
    } else {
      // Another link error occurred.
    }
    

באנדרואיד

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

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

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

    firebase::auth::FederatedOAuthProviderData provider_data("apple.com");
    
  2. אופציונלי: ציין טווחי OAuth 2.0 נוספים מעבר לברירת המחדל שברצונך לבקש מספק האימות.

    provider_data.scopes.push_back("email");
    provider_data.scopes.push_back("name");
    
  3. אופציונלי: אם ברצונך להציג את מסך הכניסה של אפל בשפה שאינה אנגלית, הגדר את פרמטר locale . עיין במסמכי הכניסה עם Apple עבור האזורים הנתמכים.

    // Localize to French.
    provider_data.custom_parameters["language"] = "fr";
    ```
    
  4. לאחר הגדרת נתוני הספק שלך, השתמש בהם כדי ליצור ספק FederatedOAuthProvider.

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

    כדי להתחיל את זרימת הכניסה, התקשר ל- signInWithProvider :

    firebase::Future<firebase::auth::SignInResult> result =
      auth->SignInWithProvider(provider_data);
    

    היישום שלך עשוי לחכות או לרשום התקשרות חוזרת לעתיד .

  6. ניתן להשתמש באותה תבנית עם ReauthenticateWithProvider אשר ניתן להשתמש בה כדי לאחזר אישורים חדשים לפעולות רגישות הדורשות כניסה לאחרונה.

    firebase::Future<firebase::auth::SignInResult> result =
      user->ReauthenticateWithProvider(provider_data);
    

    הבקשה שלך עשויה לחכות או לרשום התקשרות חוזרת לעתיד .

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

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

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

    // Initialize a Facebook credential with a Facebook access token.
    AuthCredential credential =
        firebase::auth::FacebookAuthProvider.getCredential(token);
    
    // Assuming the current user is an Apple user linking a Facebook provider.
    firebase::Future<firebase::auth::SignInResult> result =
        auth.getCurrentUser().linkWithCredential(credential);
    

היכנס באמצעות Apple Notes

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

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

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

הצעדים הבאים

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

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

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