المصادقة باستخدام تسجيل الدخول بحساب Google على أنظمة Apple الأساسية

يمكنك السماح للمستخدمين بالمصادقة مع Firebase باستخدام حساباتهم على Google من خلال دمج تسجيل الدخول بحساب Google في تطبيقك.

قبل البدء

يمكنك استخدام "مدير حزم Swift" لتثبيت اعتماديات Firebase وإدارتها.

  1. في Xcode، بعد فتح مشروع تطبيقك، انتقِل إلى File > Add Packages (ملف > إضافة حِزم).
  2. أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Firebase Apple عندما يُطلب منك ذلك:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. اختر مكتبة مصادقة Firebase.
  5. أضِف العلامة -ObjC إلى القسم علامات الروابط الأخرى في إعدادات إصدار هدفك.
  6. عند الانتهاء، ستبدأ خدمة Xcode تلقائيًا في حلّ المشاكل المتعلّقة بالعناصر التي تعتمد عليها وتنزيلها في الخلفية.

إضافة حزمة تطوير البرامج (SDK) لتسجيل الدخول بحساب Google إلى مشروعك

  1. في Xcode، بعد فتح مشروع تطبيقك، انتقِل إلى File > Add Packages (ملف > إضافة حِزم).

  2. أضِف مستودع حزمة تطوير البرامج (SDK) لتسجيل الدخول بحساب 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).

استيراد ملفات العناوين المطلوبة

أولاً، يجب عليك استيراد حزمة تطوير البرامج (SDK) لمنصّة Firebase وملفات عناوين حزمة تطوير البرامج (SDK) لتسجيل الدخول بحساب Google إلى تطبيقك.

Swift

import FirebaseCore
import FirebaseAuth
import GoogleSignIn

Objective-C

@import FirebaseCore;
@import GoogleSignIn;

تطبيق نظام تسجيل الدخول بحساب Google

نفِّذ ميزة "تسجيل الدخول بحساب Google" باتّباع الخطوات التالية. اطّلع على وثائق مطوّري البرامج حول ميزة "تسجيل الدخول باستخدام حساب Google" للحصول على تفاصيل حول استخدام ميزة "تسجيل الدخول بحساب Google" على جهاز iOS.

  1. إضافة مخططات عناوين URL مخصصة إلى مشروع Xcode:
    1. افتح إعدادات المشروع: انقر على اسم المشروع في العرض التدرّجي الأيمن. اختَر تطبيقك من القسم الاستهدافات، ثم اختَر علامة التبويب المعلومات، ووسِّع القسم أنواع عناوين URL.
    2. انقر على الزر + وأضِف مخطط عنوان URL لمعرِّف العميل المعكوس. للعثور على هذه القيمة، افتح ملف الإعداد GoogleService-Info.plist وابحث عن المفتاح REVERSED_CLIENT_ID. انسخ قيمة هذا المفتاح، والصقها في مربّع مخططات عناوين URL في صفحة الضبط. ويجب عدم تغيير الحقول الأخرى.

      عند اكتمال العملية، من المفترض أن تظهر الإعدادات بشكل مشابه لما يلي (ولكن مع القيم الخاصة بالتطبيق):

  2. في طريقة application:didFinishLaunchingWithOptions: لدى تفويض تطبيقك، يمكنك ضبط العنصر FirebaseApp.

    Swift

    FirebaseApp.configure()
    

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
  3. نفِّذ طريقة application:openURL:options: لتفويض تطبيقك. ومن المفترض أن تستدعي الطريقة الطريقة handleURL لمثيل GIDSignIn، الذي سيعالج عنوان URL الذي يتلقّاه تطبيقك في نهاية عملية المصادقة بشكل صحيح.

    Swift

    func application(_ app: UIApplication,
                     open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
      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 وأنشئ بيانات اعتماد مصادقة Firebase من الرمز المميز لاعتماد Google الناتج:

    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: self) { [unowned self] result, error in
      guard error == nil else {
        // ...
      }
    
      guard let user = result?.user,
        let idToken = user.idToken?.tokenString
      else {
        // ...
      }
    
      let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                     accessToken: user.accessToken.tokenString)
    
      // ...
    }
    

    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

  // 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 في الوقت الفعلي وقواعد أمان 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;
}

يمكنك أيضًا إضافة رمز معالجة الأخطاء إلى المجموعة الكاملة من أخطاء المصادقة. يُرجى الاطّلاع على التعامل مع الأخطاء.