با استفاده از Apple و C ++ احراز هویت شوید

با استفاده از Firebase SDK می توانید به کاربران خود اجازه دهید با استفاده از Apple ID خود با Firebase احراز هویت کنند تا جریان ورود به سیستم OAuth 2.0 را به صورت کامل انجام دهند.

قبل از اینکه شروع کنی

برای ورود کاربران با استفاده از Apple ، ابتدا ورود به سیستم با Apple را در سایت توسعه دهندگان Apple پیکربندی کنید ، سپس Apple را به عنوان ارائه دهنده ورود به سیستم پروژه Firebase خود فعال کنید.

به برنامه توسعه دهندگان اپل بپیوندید

ورود به سیستم با اپل تنها می تواند توسط اعضای پیکربندی اپل توسعهدهنده برنامه .

پیکربندی ورود به سیستم با Apple

ورود به سیستم Apple باید در پروژه Firebase شما فعال و به درستی پیکربندی شود. پیکربندی در سیستم عامل های Android و iOS متفاوت است. لطفا "ثبت نام پیکربندی به با اپل" بخش از دنبال به در iOS و / یا آندروید راهنماهای قبل از اقدام.

اپل را به عنوان ارائه دهنده ورود به سیستم فعال کنید

  1. در فایربیس کنسول ، باز کردن بخش تایید. بر روی ثبت نام در تب روش، فعال کردن ارائه دهنده اپل.
  2. تنظیمات ارائه دهنده ورود به سیستم Apple را پیکربندی کنید:
    1. اگر برنامه خود را فقط در iOS مستقر می کنید ، می توانید شناسه سرویس ، Apple Team ID ، کلید خصوصی و شناسه کلید را خالی بگذارید.
    2. برای پشتیبانی در دستگاه های Android:
      1. اضافه کردن فایربیس به پروژه آندروید خود را . هنگام تنظیم برنامه در کنسول Firebase ، حتماً امضای SHA-1 برنامه خود را ثبت کنید.
      2. در فایربیس کنسول ، باز کردن بخش تایید. بر روی ثبت نام در تب روش، فعال کردن ارائه دهنده اپل. شناسه خدماتی را که در قسمت قبل ایجاد کرده اید مشخص کنید. همچنین ، در بخش پیکربندی کد OAuth ، شناسه تیم Apple خود و کلید خصوصی و شناسه کلیدی را که در قسمت قبل ایجاد کرده اید ، مشخص کنید.

از الزامات داده ناشناس اپل پیروی کنید

ورود به سیستم با اپل به کاربران می دهد این گزینه از بی نام داده، از جمله آدرس ایمیل خود، هنگامی که ورود به سیستم. کاربرانی که این گزینه را انتخاب کنید آدرس ایمیل با دامنه privaterelay.appleid.com . هنگامی که از برنامه ورود به سیستم با Apple در برنامه خود استفاده می کنید ، باید از هرگونه خط مشی توسعه دهنده یا شرایط مربوط به Apple در مورد این شناسه های ناشناس Apple استفاده کنید.

این شامل اخذ رضایت کاربر مورد نیاز قبل از ارتباط مستقیم اطلاعات شخصی با یک Apple ID ناشناس است. هنگام استفاده از احراز هویت Firebase ، این ممکن است شامل اقدامات زیر باشد:

  • پیوند آدرس ایمیل به Apple ID ناشناس یا برعکس.
  • یک شماره تلفن را به Apple ID ناشناس یا بالعکس پیوند دهید
  • یک اعتبار اجتماعی ناشناس (فیس بوک ، گوگل و غیره) را به Apple ID ناشناس پیوند دهید یا برعکس.

لیست بالا جامع نیست. در قسمت عضویت در حساب توسعه دهنده خود به موافقت نامه مجوز برنامه توسعه دهندگان Apple مراجعه کنید تا مطمئن شوید برنامه شما با الزامات Apple مطابقت دارد.

دسترسی به firebase::auth::Auth کلاس

Auth کلاس دروازه برای همه تماس API است.
  1. اضافه کردن فایل های هدر تایید و برنامه:
    #include "firebase/app.h"
    #include "firebase/auth.h"
    
  2. در کد دهی اولیه خود، ایجاد یک 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 . یک نگاشت یک به یک بین App و Auth .
    firebase::auth::Auth* auth = firebase::auth::Auth::GetAuth(app);
    

جریان ورود به سیستم را با Firebase SDK مدیریت کنید

روند ورود به سیستم با 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 اصلی و مقایسه آن با مقدار تصویب شده توسط Apple ، پاسخ را معتبر می کند.

  2. جریان ورود به سیستم اپل را شروع کنید ، از جمله در درخواست شما هش 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 خود کنترل کنید. اگر ورود به سیستم موفقیت آمیز بود ، از شناسه ای که از پاسخ اپل به همراه uncehed بدون استفاده شده برای تأیید اعتبار با 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 از رشته توکن و nonce اصلی استفاده کنید.

    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 استفاده کرد. با این حال ، هنگامی که یک حساب Firebase موجود قبلاً به حساب Apple پیوند داده شده است که می خواهید با آن ارتباط برقرار کنید ، ممکن است با خطا روبرو شوید. هنگامی که این اتفاق می افتد آینده وضعیت بازگشت kAuthErrorCredentialAlreadyInUse و جسم UserInfo از SignInResult ممکن است حاوی معتبر updated_credential . این گواهینامه می تواند به ثبت نام در حساب اپل مرتبط از طریق استفاده SignInWithCredential بدون نیاز به تولید یکی دیگر از نشانه اپل در رمز و فعلا.

    توجه داشته باشید که شما باید با استفاده از 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 ، با یکپارچه سازی OAuth عمومی مبتنی بر وب در برنامه خود با استفاده از Firebase SDK ، کاربران خود را با Firebase احراز هویت کنید تا جریان ورود از سیستم به پایان برسد.

برای مدیریت جریان ورود به سیستم با Firebase SDK ، این مراحل را دنبال کنید:

  1. ساخت یک نمونه از یک FederatedOAuthProviderData پیکربندی شده با مناسب ارائه دهنده ID برای اپل.

    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 پارامتر. مشاهده ورود به سیستم با اسناد اپل برای مناطق پشتیبانی شده است.

    // 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. با استفاده از شیء ارائه دهنده Auth با Firebase احراز هویت کنید. توجه داشته باشید که برخلاف سایر عملیات FirebaseAuth ، با ظاهر شدن نمای وب که کاربر می تواند اعتبار خود را در آن وارد کند ، کنترل UI شما را در دست می گیرد.

    برای شروع ثبت نام در جریان، پاسخ 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 )، آن سهام با برنامه شما. اگر سرویس رله ایمیل خصوصی را پیکربندی کرده اید ، اپل ایمیل های ارسال شده به آدرس ناشناس را به آدرس ایمیل واقعی کاربر ارسال می کند.

اپل این اطلاعات را تنها سهام کاربر مانند نام نمایش با برنامه های اولین بار که کاربر در. معمولا، فروشگاه های فایربیس نام صفحه نمایش اولین بار که کاربر با شرکت اپل، که شما می توانید با گرفتن getCurrentUser().getDisplayName() . با این حال ، اگر قبلاً از Apple برای ورود کاربر به برنامه بدون استفاده از Firebase استفاده کرده اید ، اپل نام نمایشی کاربر را به Firebase ارائه نمی دهد.

مراحل بعدی

پس از ورود کاربر برای اولین بار ، یک حساب کاربری جدید ایجاد می شود و به اعتبارنامه - یعنی نام کاربری و گذرواژه ، شماره تلفن یا اطلاعات ارائه دهنده تأیید - که کاربر با آن وارد شده است پیوند داده می شود. این حساب جدید به عنوان بخشی از پروژه Firebase شما ذخیره می شود و می تواند بدون در نظر گرفتن نحوه ورود کاربر در هر برنامه ای در پروژه شما ، کاربر را شناسایی کند.

در برنامه های خود می توانید اطلاعات اولیه مشخصات کاربر را از شیء firebase :: auth :: user دریافت کنید. مشاهده مدیریت کاربران .

در قوانین امنیتی Firebase Reatime Database و Cloud Storage ، می توانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر author دریافت کرده و از آن برای کنترل داده هایی که کاربر می تواند به آنها دسترسی داشته باشد استفاده کنید.