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

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

قبل البدء

استخدِم Swift Package Manager لتثبيت التبعيات في Firebase وإدارتها.

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

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

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

  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 FirebaseAuth
import GoogleSignIn

Objective-C

@import FirebaseCore;
@import GoogleSignIn;

تنفيذ ميزة تسجيل الدخول باستخدام حساب Google

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

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

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

  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، التي ستتعامل بشكلٍ صحيح مع عنوان URL الذي يتلقّاه تطبيقك في نهاية عملية المصادقة.

    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" وأنشئ بيانات اعتماد "مصادقة 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: 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;
}

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