با استفاده از ورود فیس بوک در iOS احراز هویت شوید

با ادغام ورود به سیستم فیس بوک در برنامه خود ، می توانید به کاربران خود اجازه دهید با Firebase با استفاده از حساب های فیس بوک خود احراز هویت کنند.

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

  1. اضافه کردن فایربیس به پروژه های iOS خود را .

  2. شامل غلاف زیر را در خود Podfile :

    pod 'Firebase/Auth'
    

  3. اگر هنوز برنامه خود را متصل به پروژه فایربیس شما نیست، انجام این کار از کنسول فایربیس .

  4. در فیس بوک برای توسعه دهندگان وب سایت، دریافت ID برنامه و راز برنامه برای برنامه شما.
  5. ورود به فیس بوک را فعال کنید:
    1. در فایربیس کنسول ، باز کردن بخش تایید.
    2. بر روی ثبت نام در تب روش، فعال کردن فیس بوک ورود به سیستم روش و مشخص ID نرم افزار و برنامه راز شما را از فیس بوک است.
    3. سپس، مطمئن شوید که شما از OAuth تغییر مسیر URI (به عنوان مثال my-app-12345.firebaseapp.com/__/auth/handler ) به عنوان یکی از OAuth حفظ URI ها تغییر مسیر خود را در صفحه فیس بوک خود را برنامه تنظیمات در لیست شده فیس بوک برای توسعه دهندگان وب سایت در محصولات تنظیمات> فیس بوک ورود به پیکربندی.

احراز هویت با Firebase

  1. ادغام فیس بوک ورود به برنامه خود را با زیر مستندات توسعه دهنده . هنگامی که شما مقداردهی اولیه FBSDKLoginButton شی، یک نماینده به دریافت ورود و خروج حوادث. مثلا:

    سریع

    let loginButton = FBSDKLoginButton()
    loginButton.delegate = self
    

    هدف-ج

    FBSDKLoginButton *loginButton = [[FBSDKLoginButton alloc] init];
    loginButton.delegate = self;
    
    در نماینده خود را، پیاده سازی didCompleteWithResult:error: .

    سریع

    func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
      if let error = error {
        print(error.localizedDescription)
        return
      }
      // ...
    }
    

    هدف-ج

    - (void)loginButton:(FBSDKLoginButton *)loginButton
        didCompleteWithResult:(FBSDKLoginManagerLoginResult *)result
                        error:(NSError *)error {
      if (error == nil) {
        // ...
      } else {
        NSLog(error.localizedDescription);
      }
    }
    
  2. واردات ماژول فایربیس خود را UIApplicationDelegate :

    سریع

    import Firebase

    هدف-ج

    @import Firebase;
  3. پیکربندی FirebaseApp عنوان مثال مشترک، به طور معمول در برنامه شما application:didFinishLaunchingWithOptions: روش:

    سریع

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    هدف-ج

    // Use Firebase library to configure APIs
    [FIRApp configure];
  4. پس از یک کاربر با موفقیت علائم در، در اجرای خود از didCompleteWithResult:error: ، دریافت رمز دسترسی برای کاربر وارد شده به و تبادل آن را برای یک فایربیس اعتبار:

    سریع

    let credential = FacebookAuthProvider
      .credential(withAccessToken: AccessToken.current!.tokenString)
    

    هدف-ج

    FIRAuthCredential *credential = [FIRFacebookAuthProvider
        credentialWithAccessToken:[FBSDKAccessToken currentAccessToken].tokenString];
    
  5. در نهایت ، با Firebase با استفاده از اعتبار Firebase احراز هویت کنید:

    سریع

    Auth.auth().signIn(with: credential) { authResult, error in
        if let error = error {
          let authError = error as NSError
          if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue {
            // The user is a multi-factor user. Second factor challenge is required.
            let resolver = authError
              .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver
            var displayNameString = ""
            for tmpFactorInfo in resolver.hints {
              displayNameString += tmpFactorInfo.displayName ?? ""
              displayNameString += " "
            }
            self.showTextInputPrompt(
              withMessage: "Select factor to sign in\n\(displayNameString)",
              completionBlock: { userPressedOK, displayName in
                var selectedHint: PhoneMultiFactorInfo?
                for tmpFactorInfo in resolver.hints {
                  if displayName == tmpFactorInfo.displayName {
                    selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo
                  }
                }
                PhoneAuthProvider.provider()
                  .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil,
                                     multiFactorSession: resolver
                                       .session) { verificationID, error in
                    if error != nil {
                      print(
                        "Multi factor start sign in failed. Error: \(error.debugDescription)"
                      )
                    } else {
                      self.showTextInputPrompt(
                        withMessage: "Verification code for \(selectedHint?.displayName ?? "")",
                        completionBlock: { userPressedOK, verificationCode in
                          let credential: PhoneAuthCredential? = PhoneAuthProvider.provider()
                            .credential(withVerificationID: verificationID!,
                                        verificationCode: verificationCode!)
                          let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator
                            .assertion(with: credential!)
                          resolver.resolveSignIn(with: assertion!) { authResult, error in
                            if error != nil {
                              print(
                                "Multi factor finanlize sign in failed. Error: \(error.debugDescription)"
                              )
                            } else {
                              self.navigationController?.popViewController(animated: true)
                            }
                          }
                        }
                      )
                    }
                  }
              }
            )
          } else {
            self.showMessagePrompt(error.localizedDescription)
            return
          }
          // ...
          return
        }
        // User is signed in
        // ...
    }
    

    هدف-ج

    [[FIRAuth auth] signInWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult,
                                           NSError * _Nullable error) {
        if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
          FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
          NSMutableString *displayNameString = [NSMutableString string];
          for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
            [displayNameString appendString:tmpFactorInfo.displayName];
            [displayNameString appendString:@" "];
          }
          [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                               completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
           FIRPhoneMultiFactorInfo* selectedHint;
           for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
             if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
               selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
             }
           }
           [FIRPhoneAuthProvider.provider
            verifyPhoneNumberWithMultiFactorInfo:selectedHint
            UIDelegate:nil
            multiFactorSession:resolver.session
            completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
              if (error) {
                [self showMessagePrompt:error.localizedDescription];
              } else {
                [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                     completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
                 FIRPhoneAuthCredential *credential =
                     [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                                  verificationCode:verificationCode];
                 FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
                 [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
                   if (error) {
                     [self showMessagePrompt:error.localizedDescription];
                   } else {
                     NSLog(@"Multi factor finanlize sign in succeeded.");
                   }
                 }];
               }];
              }
            }];
         }];
        }
      else if (error) {
        // ...
        return;
      }
      // User successfully signed in. Get user data from the FIRUser object
      if (authResult == nil) { return; }
      FIRUser *user = authResult.user;
      // ...
    }];
    

مراحل بعدی

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

  • در برنامه های خود را، شما می توانید اطلاعات نمایه کاربر از دریافت FIRUser شی. مشاهده مدیریت کاربران .

  • در خود پایگاه فایربیس بیدرنگ و ابر ذخیره سازی قوانین امنیتی ، شما می توانید دریافت امضا در شناسه کاربری منحصر به فرد کاربر را از auth متغیر، و استفاده از آن برای کنترل آنچه داده دسترسی کاربر می تواند.

شما می توانید اجازه به کاربران برای ورود به سیستم برنامه خود را با استفاده از ارائه دهندگان تأیید هویت چندگانه توسط ارتباط تایید اعتبار ارائه دهنده به یک حساب کاربری موجود.

برای خروج از سیستم یک کاربر، پاسخ signOut: .

سریع

    let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}
  

هدف-ج

    NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

همچنین ممکن است بخواهید برای همه دامنه خطاهای احراز هویت ، کد مدیریت خطا را اضافه کنید. مشاهده خطاها دسته .