يمكنك السماح للمستخدمين بالمصادقة باستخدام Firebase باستخدام حساباتهم على Google من خلال دمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيقك.
قبل البدء
استخدِم Swift Package Manager لتثبيت تبعيات Firebase وإدارتها.
- في Xcode، مع فتح مشروع تطبيقك، انتقِل إلى ملف > إضافة حِزم.
- أضِف مستودع حزمة تطوير البرامج (SDK) لمنصّات Apple من Firebase عندما يُطلب منك ذلك:
- اختَر مكتبة Firebase Authentication.
- أضِف العلامة
-ObjC
إلى قسم رموز ربط أخرى في إعدادات الإنشاء الخاصة بالهدف. - عند الانتهاء، سيبدأ Xcode تلقائيًا في حلّ ملفاتك المضمّنة وتنزيلها في الخلفية.
https://github.com/firebase/firebase-ios-sdk.git
إضافة حزمة تطوير البرامج (SDK) لميزة "تسجيل الدخول باستخدام حساب Google" إلى مشروعك
في Xcode، مع فتح مشروع تطبيقك، انتقِل إلى ملف > إضافة حِزم.
أضِف مستودع حزمة تطوير البرامج (SDK) لميزة "تسجيل الدخول باستخدام حساب Google" عندما يُطلب منك ذلك:
https://github.com/google/GoogleSignIn-iOS
عند الانتهاء، سيبدأ Xcode تلقائيًا في حلّ ملفاتك المضمّنة وتنزيلها في الخلفية.
تفعيل ميزة "تسجيل الدخول باستخدام حساب Google" لمشروعك على Firebase
للسماح للمستخدمين بتسجيل الدخول باستخدام ميزة "تسجيل الدخول باستخدام حساب Google"، عليك أولاً تفعيل موفِّر ميزة "تسجيل الدخول باستخدام حساب Google" لمشروعك على Firebase:
- في وحدة تحكّم Firebase، افتح قسم المصادقة.
- في علامة التبويب طريقة تسجيل الدخول، فعِّل موفِّر Google.
انقر على حفظ.
نزِّل نسخة جديدة من ملف
GoogleService-Info.plist
الخاص بمشروعك وانسخه إلى مشروع Xcode. استبدِل أي إصدارات حالية بالإصدار الجديد. (اطّلِع على مقالة إضافة Firebase إلى مشروعك على iOS).
استيراد ملفات الرأس المطلوبة
أولاً، عليك استيراد حزمة تطوير البرامج (SDK) لمنصّة Firebase وملفات رأس حزمة تطوير البرامج (SDK) لميزة "تسجيل الدخول باستخدام حساب Google" إلى تطبيقك.
import FirebaseCore import FirebaseAuth import GoogleSignIn
@import FirebaseCore; @import GoogleSignIn;
تنفيذ ميزة "تسجيل الدخول باستخدام حساب Google"
يمكنك تنفيذ ميزة "تسجيل الدخول باستخدام حساب Google" باتّباع الخطوات التالية: اطّلِع على مستندات المطوّرين الخاصة بخدمة "تسجيل الدخول باستخدام حساب Google" للحصول على تفاصيل عن استخدام ميزة "تسجيل الدخول باستخدام حساب Google" على أجهزة iOS.
- أضِف مخطّطات عناوين URL مخصّصة إلى مشروعك على Xcode:
- افتح إعدادات المشروع: انقر على اسم المشروع في العرض التدرّجي على يمين الصفحة. اختَر تطبيقك من قسم الاستهدافات، ثم اختَر علامة التبويب المعلومات ووسِّع قسم أنواع عناوين URL.
- انقر على الزر + وأضِف مخطّط عنوان URL لمعرّف العميل الذي تم عكسه. للعثور على هذه القيمة، افتحملف الضبط
وابحث عن المفتاحGoogleService-Info.plist REVERSED_CLIENT_ID
. انسخ قيمة هذا المفتاح، والصقها في مربّع أنظمة عناوين URL في صفحة الإعداد. اترك الحقول الأخرى بدون تغيير.عند الانتهاء، من المفترض أن تظهر الإعدادات على النحو التالي (ولكن مع القيم الخاصة بتطبيقك):
- في طريقة
application:didFinishLaunchingWithOptions:
لوكيل التطبيق، اضبط عنصرFirebaseApp
.FirebaseApp.configure()
// Use Firebase library to configure APIs [FIRApp configure];
- نفِّذ طريقة
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]; }
- نقْل وحدة التحكّم في العرض المعروض ورقم تعريف العميل لتطبيقك إلى
signIn
طريقة مقدّم خدمة "تسجيل الدخول بحساب Google" وإنشاء بيانات اعتماد مصادقة Firebase من الرمز المميّز الناتج لمصادقة 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 { // ... } }];
- أضِف
GIDSignInButton
إلى مخطّط القصة أو ملف XIB أو انشئ مثيلًا له آليًا. لإضافة الزر إلى لوحة القصة أو ملف XIB ، أضِف عرضًا واضبط فئته المخصّصة علىGIDSignInButton
. - اختياري: إذا أردت تخصيص الزر، اتّبِع الخطوات التالية:
- في "عنصر التحكّم في العرض"، حدِّد زر تسجيل الدخول كخاصية.
@IBOutlet weak var signInButton: GIDSignInButton!
- اربط الزرّ بموقع
signInButton
الذي أعلنّا عنه للتو. - يمكنك تخصيص الزر من خلال ضبط خصائص العنصر GIDSignInButton.
- في ملف الرأس الخاص بعنصر التحكّم في العرض، حدِّد زر تسجيل الدخول على أنّه
خاصية.
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- اربط الزرّ بموقع
signInButton
الذي أعلنّت عنه للتو. - يمكنك تخصيص الزر من خلال ضبط خصائص العنصر 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 Database وCloud Storage قواعد الأمان، يمكنك الحصول على معرّف المستخدم الفريد للمستخدم الذي سجّل الدخول من متغيّر
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; }
يمكنك أيضًا إضافة رمز لمعالجة الأخطاء في النطاق الكامل لأخطاء مصادقة العميل. راجِع مقالة معالجة الأخطاء.