Firebase 将于 5 月 10 日重返 Google I/O 大会!立即报名

المصادقة باستخدام تسجيل الدخول بحساب جوجل على منصات آبل

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

قبل ان تبدأ

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

  1. في Xcode ، مع فتح مشروع التطبيق الخاص بك ، انتقل إلى ملف> إضافة حزم .
  2. عند المطالبة ، أضف مستودع SDK لأنظمة Apple الأساسية لـ Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. اختر مكتبة مصادقة Firebase.
  5. عند الانتهاء ، سيبدأ Xcode تلقائيًا في حل وتنزيل التبعيات الخاصة بك في الخلفية.

قم بتمكين تسجيل الدخول إلى Google لمشروع Firebase الخاص بك

للسماح للمستخدمين بتسجيل الدخول باستخدام تسجيل الدخول بحساب Google ، يجب أولاً تمكين موفر تسجيل الدخول إلى Google لمشروع Firebase الخاص بك:

  1. في وحدة تحكم Firebase ، افتح قسم المصادقة .
  2. في علامة التبويب طريقة تسجيل الدخول ، قم بتمكين مزود Google .
  3. انقر فوق حفظ .

قم باستيراد ملفات الرأس المطلوبة

أولاً ، يجب عليك استيراد ملفات رأس Firebase SDK و Google Sign-In SDK إلى تطبيقك.

سويفت

import FirebaseCore
import FirebaseAuth
import GoogleSignIn

ج موضوعية

@import FirebaseCore;
@import GoogleSignIn;

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

نفِّذ تسجيل الدخول بحساب Google باتباع هذه الخطوات. راجع وثائق مطور Google Sign-In Developer للحصول على تفاصيل حول استخدام Google Sign-In with iOS.

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

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

  2. في application:didFinishLaunchingWithOptions: method ، قم بتكوين كائن FirebaseApp .

    سويفت

    FirebaseApp.configure()
    

    ج موضوعية

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

    سويفت

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

    سويفت

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

    ج موضوعية

    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. اختياري : إذا كنت تريد تخصيص الزر ، فقم بما يلي:

    سويفت

    1. في وحدة التحكم في العرض ، قم بتعريف زر تسجيل الدخول كخاصية.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. قم بتوصيل الزر بخاصية signInButton التي أعلنتها للتو.
    3. تخصيص الزر عن طريق تعيين خصائص كائن GIDSignInButton .

    ج موضوعية

    1. في ملف الرأس الخاص بوحدة التحكم في العرض ، قم بتعريف زر تسجيل الدخول كخاصية.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. قم بتوصيل الزر بخاصية signInButton التي أعلنتها للتو.
    3. تخصيص الزر عن طريق تعيين خصائص كائن GIDSignInButton .

المصادقة باستخدام Firebase

أخيرًا ، أكمل عملية تسجيل الدخول إلى Firebase باستخدام بيانات اعتماد المصادقة التي تم إنشاؤها في الخطوة السابقة.

سويفت

Auth.auth().signIn(with: credential) { result, error in

  // 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 . انظر إدارة المستخدمين .

  • في قاعدة بيانات Firebase Realtime وقواعد أمان التخزين السحابي ، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير 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;
}

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

و

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

قبل ان تبدأ

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

  1. في Xcode ، مع فتح مشروع التطبيق الخاص بك ، انتقل إلى ملف> إضافة حزم .
  2. عند المطالبة ، أضف مستودع SDK لأنظمة Apple الأساسية لـ Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk
  4. اختر مكتبة مصادقة Firebase.
  5. عند الانتهاء ، سيبدأ Xcode تلقائيًا في حل وتنزيل التبعيات الخاصة بك في الخلفية.

قم بتمكين تسجيل الدخول إلى Google لمشروع Firebase الخاص بك

للسماح للمستخدمين بتسجيل الدخول باستخدام تسجيل الدخول بحساب Google ، يجب أولاً تمكين موفر تسجيل الدخول إلى Google لمشروع Firebase الخاص بك:

  1. في وحدة تحكم Firebase ، افتح قسم المصادقة .
  2. في علامة التبويب طريقة تسجيل الدخول ، قم بتمكين مزود Google .
  3. انقر فوق حفظ .

قم باستيراد ملفات الرأس المطلوبة

أولاً ، يجب عليك استيراد ملفات رأس Firebase SDK و Google Sign-In SDK إلى تطبيقك.

سويفت

import FirebaseCore
import FirebaseAuth
import GoogleSignIn

ج موضوعية

@import FirebaseCore;
@import GoogleSignIn;

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

نفِّذ تسجيل الدخول بحساب Google باتباع هذه الخطوات. راجع وثائق مطور Google Sign-In Developer للحصول على تفاصيل حول استخدام Google Sign-In with iOS.

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

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

  2. في application:didFinishLaunchingWithOptions: method ، قم بتكوين كائن FirebaseApp .

    سويفت

    FirebaseApp.configure()
    

    ج موضوعية

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

    سويفت

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

    سويفت

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

    ج موضوعية

    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. اختياري : إذا كنت تريد تخصيص الزر ، فقم بما يلي:

    سويفت

    1. في وحدة التحكم في العرض ، قم بتعريف زر تسجيل الدخول كخاصية.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. قم بتوصيل الزر بخاصية signInButton التي أعلنتها للتو.
    3. تخصيص الزر عن طريق تعيين خصائص كائن GIDSignInButton .

    ج موضوعية

    1. في ملف الرأس الخاص بوحدة التحكم في العرض ، قم بتعريف زر تسجيل الدخول كخاصية.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. قم بتوصيل الزر بخاصية signInButton التي أعلنتها للتو.
    3. تخصيص الزر عن طريق تعيين خصائص كائن GIDSignInButton .

المصادقة باستخدام Firebase

أخيرًا ، أكمل عملية تسجيل الدخول إلى Firebase باستخدام بيانات اعتماد المصادقة التي تم إنشاؤها في الخطوة السابقة.

سويفت

Auth.auth().signIn(with: credential) { result, error in

  // 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 . انظر إدارة المستخدمين .

  • في قاعدة بيانات Firebase Realtime وقواعد أمان التخزين السحابي ، يمكنك الحصول على معرف المستخدم الفريد للمستخدم الذي قام بتسجيل الدخول من متغير 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;
}

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