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

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

قبل البدء

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

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

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

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

  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. فتح إعدادات المشروع: انقر على اسم المشروع في الشجرة اليسرى. مشاهدة. اختَر تطبيقك من قسم TARGETS، ثم واختَر علامة التبويب المعلومات، ووسِّع القسم أنواع عناوين 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;
}

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