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

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

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

  1. اضافه کردن فایربیس به پروژه های iOS خود را . شامل غلاف زیر را در خود Podfile :
    pod 'Firebase/Auth'
    pod 'GoogleSignIn'
    
  2. اگر هنوز برنامه خود را متصل به پروژه فایربیس شما نیست، انجام این کار از کنسول فایربیس .
  3. ورود به سیستم Google را در کنسول Firebase فعال کنید:
    1. در فایربیس کنسول ، باز کردن بخش تایید.
    2. بر روی ثبت نام در تب روش، فعال کردن Google وارد شوید در روش و روی Save کلیک کنید.

1. فایلهای هدر مورد نیاز را وارد کنید

ابتدا ، باید فایلهای سرصفحه Firebase SDK و Google Sign-In SDK را به برنامه خود وارد کنید.

سریع

import Firebase
import GoogleSignIn

هدف-ج

@import Firebase;
@import GoogleSignIn;

2. پیاده سازی ورود به سیستم Google

با دنبال کردن این مراحل ، ورود به سیستم Google را پیاده سازی کنید. مراجعه کنید Google وارد شوید اسناد توسعه برای جزئیات بیشتر در مورد استفاده از Google وارد شوید با iOS.

  1. طرح های URL سفارشی را به پروژه Xcode خود اضافه کنید:
    1. پیکربندی پروژه خود را باز کنید: روی نام پروژه در نمای چپ درخت دوبار کلیک کنید. برنامه خود را از بخش اهداف انتخاب کنید، سپس برگه اطلاعات را انتخاب کنید، و گسترش بخش انواع URL.
    2. کلیک بر روی دکمه و اضافه کردن یک طرح URL برای ID مشتری معکوس خود را. برای پیدا کردن این ارزش، باز کردن GoogleService-Info.plist فایل پیکربندی، و برای نگاه REVERSED_CLIENT_ID کلیدی است. کپی ارزش آن کلید، و آن را به طرح URL در صفحه تنظیمات جعبه بچسبانید. سایر فیلدها را خالی بگذارید.

      پس از تکمیل ، پیکربندی شما باید شبیه به موارد زیر باشد (اما با مقادیر خاص برنامه شما):

  2. در نماینده برنامه شما application:didFinishLaunchingWithOptions: روش، پیکربندی FirebaseApp شی.

    سریع

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

    هدف-ج

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
  3. پیاده سازی application:openURL:options: روش نماینده برنامه شما. روش باید پاسخ handleURL روش از GIDSignIn عنوان مثال، درست است که URL که نرم افزار خود را دریافت در پایان فرآیند احراز هویت رسیدگی خواهد شد.

    سریع

    @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any])
      -> Bool {
      return GIDSignIn.sharedInstance.handle(url)
    }
    

    هدف-ج

    - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options {
      return [[GIDSignIn sharedInstance] handleURL:url];
    }
    
  4. کنترل کننده نمای نماینده و شناسه سرویس گیرنده برای برنامه خود را به روش ورود به سیستم Google وارد کنید و از رمز تأیید Google نتیجه کار ، اعتبارنامه Firebase ایجاد کنید:

    سریع

    guard let clientID = FirebaseApp.app()?.options.clientID else { return }
    
    // Create Google Sign In configuration object.
    let config = GIDConfiguration(clientID: clientID)
    
    // Start the sign in flow!
    GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [unowned self] user, error in
    
      if let error = error {
        // ...
        return
      }
    
      guard
        let authentication = user?.authentication,
        let idToken = authentication.idToken
      else {
        return
      }
    
      let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                     accessToken: authentication.accessToken)
    
      // ...
    }
    

    هدف-ج

    GIDConfiguration *config = [[GIDConfiguration alloc] initWithClientID:[FIRApp defaultApp].options.clientID];
    
    __weak __auto_type weakSelf = self;
    [GIDSignIn.sharedInstance signInWithConfiguration:config presentingViewController:self callback:^(GIDGoogleUser * _Nullable user, NSError * _Nullable error) {
      __auto_type strongSelf = weakSelf;
      if (strongSelf == nil) { return; }
    
      if (error == nil) {
        GIDAuthentication *authentication = user.authentication;
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                         accessToken:authentication.accessToken];
        // ...
      } else {
        // ...
      }
    }];
    
    
  5. اضافه کردن GIDSignInButton به داستانپردازی خود را، فایل XIB یا نمونه آن را از کار. برای اضافه کردن دکمه به داستانپردازی خود را و یا فایل XIB، اضافه کردن یک نمایش و تنظیم کلاس سفارشی خود را به GIDSignInButton .
  6. اختیاری: اگر شما می خواهید برای سفارشی کردن دکمه، انجام موارد زیر:

    سریع

    1. در کنترلر نمای خود ، دکمه ورود به سیستم را به عنوان یک ویژگی اعلام کنید.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. دکمه به اتصال signInButton اموال شما فقط اعلام کرد.
    3. سفارشی کردن دکمه با تنظیم خواص GIDSignInButton شی.

    هدف-ج

    1. در فایل هدر کنترلر نمای خود ، دکمه ورود به سیستم را به عنوان یک ویژگی اعلام کنید.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. دکمه به اتصال signInButton اموال شما فقط اعلام کرد.
    3. سفارشی کردن دکمه با تنظیم خواص GIDSignInButton شی.

3. احراز هویت با 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;
}

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