احراز هویت با استفاده از Google Sign-In در پلتفرم های اپل

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

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

برای نصب و مدیریت وابستگی‌های Firebase از Swift Package Manager استفاده کنید.

  1. در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.
  2. وقتی از شما خواسته شد، مخزن SDK پلتفرم‌های اپل فایربیس را اضافه کنید:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. کتابخانه Firebase Authentication را انتخاب کنید.
  5. پرچم -ObjC را به بخش Other Linker Flags در تنظیمات ساخت هدف خود اضافه کنید.
  6. پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگی‌های شما در پس‌زمینه می‌کند.

کیت توسعه نرم‌افزار ورود به سیستم گوگل (Google Sign-In SDK) را به پروژه خود اضافه کنید.

  1. در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.

  2. وقتی از شما خواسته شد، مخزن SDK ورود به سیستم Google را اضافه کنید:

    https://github.com/google/GoogleSignIn-iOS
    
  3. پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگی‌های شما در پس‌زمینه می‌کند.

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

برای اینکه به کاربران اجازه دهید با استفاده از Google Sign-In وارد سیستم شوند، ابتدا باید ارائه دهنده Google Sign-In را برای پروژه Firebase خود فعال کنید:

  1. در کنسول Firebase ، بخش Authentication (احراز هویت) را باز کنید.
  2. در برگه «روش ورود» ، ارائه‌دهنده گوگل را فعال کنید.
  3. روی ذخیره کلیک کنید.

  4. یک کپی جدید از فایل GoogleService-Info.plist پروژه خود دانلود کنید و آن را در پروژه Xcode خود کپی کنید. نسخه‌های موجود را با نسخه جدید جایگزین کنید. (به بخش افزودن Firebase به پروژه iOS خود مراجعه کنید.)

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

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

سویفت

import FirebaseAuth
import GoogleSignIn

هدف-سی

@import FirebaseCore;
@import GoogleSignIn;

ورود به سیستم با گوگل را پیاده‌سازی کنید

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

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

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

  2. در متد application 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 دریافتی برنامه شما را در پایان فرآیند احراز هویت مدیریت خواهد کرد.

    سویفت

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
      // ...
    }
      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. کنترلر نمای ارائه دهنده و شناسه کلاینت را برای برنامه خود به متد signIn از ارائه دهنده Google Sign-In منتقل کنید و یک اعتبارنامه احراز هویت Firebase را از توکن احراز هویت گوگل حاصل ایجاد کنید:

    سویفت

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

    هدف-سی

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

    سویفت

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

    هدف-سی

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

احراز هویت با فایربیس

در نهایت، فرآیند ورود به Firebase را با اعتبارنامه‌ی auth که در مرحله‌ی قبل ایجاد کرده‌اید، تکمیل کنید.

سویفت

Auth.auth().signIn(with: credential) { result, error in
  guard error == nil else {
    // ...
    return
  }

  // At this point, our 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 شما ذخیره می‌شود و می‌تواند برای شناسایی کاربر در هر برنامه در پروژه شما، صرف نظر از نحوه ورود کاربر، مورد استفاده قرار گیرد.

  • در برنامه‌های خود، می‌توانید اطلاعات اولیه پروفایل کاربر را از شیء User دریافت کنید. به بخش مدیریت کاربران مراجعه کنید.

  • در قوانین امنیتی پایگاه داده و Cloud Storage Firebase Realtime Database ، می‌توانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر 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;
}

همچنین می‌توانید کد مدیریت خطا را برای طیف کامل خطاهای احراز هویت اضافه کنید. به بخش مدیریت خطاها مراجعه کنید.