اصالت‌سنجی بااستفاده از «ورود به سیستم با Google» در پلاتفرم‌های Apple

با ادغام «ورود به سیستم با Google» در برنامه‌تان، می‌توانید به کاربران اجازه دهید بااستفاده از «حساب‌های Google» خودشان با Firebase اصالت‌سنجی کنند.

برای دریافت کمک از هوش مصنوعی، پیام‌واره زیر را در عامل کدنویسی هوش مصنوعی خود (مثل Antigravity،‏ Claude Code،‏ Codex، و Cursor) کپی کنید. می‌توانید پیام‌واره را سفارشی‌سازی کنید و با نماینده‌تان تکرار کنید. برای اطلاعات دقیق نصب، به مهارت‌های عامل Firebase مراجعه کنید.

Help me use Firebase in my app.
1. Make sure that **Firebase agent skills** are installed and updated. For Claude Code, Codex, or Cursor agents, help me install the Firebase plugin. For other agents, run `npx skills add firebase/agent-skills`. Always try to use **Firebase agent skills** for Firebase-related tasks.
2. Help me set up and use Firebase Authentication with Google Sign-In in my app.

قبل از شروع

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

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

افزودن «کیت توسعه نرم‌افزار ورود به سیستم با Google» به پروژه

  1. در Xcode، با باز بودن پروژه برنامه، به File > Add Packages (فایل > افزودن بسته‌ها) پیمایش کنید.

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

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

«ورود به سیستم با Google» را برای پروژه Firebase خود فعال کنید

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

  1. در کنسول Firebase، به امنیت > اصالت‌سنجی بروید.

  2. در برگه روش ورود به سیستم، ارائه‌دهنده Google را فعال کنید.

  3. روی ذخیره کردن کلیک کنید.

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

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

ابتدا باید فایل‌های سرصفحه «کیت توسعه نرم‌افزار Firebase» و «کیت توسعه نرم‌افزار ورود به سیستم با Google» را به برنامه‌تان وارد کنید.

Swift

import FirebaseAuth
import GoogleSignIn

Objective-C

@import FirebaseCore;
@import GoogleSignIn;

پیاده‌سازی «ورود به سیستم با Google»

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

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

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

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

    Swift

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

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. روش application:openURL:options: نماینده برنامه‌تان را پیاده‌سازی کنید. این روش باید روش handleURL نمونه GIDSignIn را فراخوانی کند که نشانی اینترنتی دریافتی برنامه شما در پایان فرایند اصالت‌سنجی را به‌درستی مدیریت می‌کند.

    Swift

    func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
      // ...
    }
      return GIDSignIn.sharedInstance.handle(url)
    }

    Objective-C

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

    Swift

    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)
    }

    Objective-C

    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 یا تابلوی داستان، «نمایی» اضافه کنید و کلاس سفارشی آن را روی GIDSignInButton تنظیم کنید.
  6. اختیاری: اگر می‌خواهید دکمه را سفارشی‌سازی کنید، کارهای زیر را انجام دهید:

    Swift

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

    Objective-C

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

اصالت‌سنجی با Firebase

درنهایت، فرایند ورود به سیستم Firebase را با اطلاعات اعتباری اصالت‌سنجی که در مرحله قبلی ایجاد شده است تکمیل کنید.

Swift

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

  // At this point, our user is signed in
}
    

Objective-C

[[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 شیء دریافت کنید. به مدیریت کاربران مراجعه کنید.

  • در Firebase Realtime Database و Cloud Storage قوانین امنیتی، می‌توانید شناسه کاربر یکتای کاربر واردشده به سیستم را از متغیر auth دریافت کنید و از آن برای کنترل داده‌هایی که کاربر می‌تواند به آن‌ها دسترسی داشته باشد استفاده کنید.

می‌توانید به کاربران اجازه دهید با پیوند دادن اطلاعات اعتباری ارائه‌دهنده اصالت‌سنجی به حساب کاربری موجود بااستفاده از چندین ارائه‌دهنده اصالت‌سنجی به سیستم برنامه‌تان وارد شوند.

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

Swift

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

Objective-C

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

همچنین ممکن است بخواهید کد مدیریت خطا را برای طیف کامل خطاهای اصالت‌سنجی اضافه کنید. مدیریت خطاها را ببینید.