شما میتوانید با ادغام ورود به سیستم گوگل در برنامه خود، به کاربران خود اجازه دهید تا با استفاده از حسابهای گوگل خود در فایربیس احراز هویت کنند.
قبل از اینکه شروع کنی
برای نصب و مدیریت وابستگیهای Firebase از Swift Package Manager استفاده کنید.
- در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.
- وقتی از شما خواسته شد، مخزن SDK پلتفرمهای اپل فایربیس را اضافه کنید:
- کتابخانه Firebase Authentication را انتخاب کنید.
- پرچم
-ObjCرا به بخش Other Linker Flags در تنظیمات ساخت هدف خود اضافه کنید. - پس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگیهای شما در پسزمینه میکند.
https://github.com/firebase/firebase-ios-sdk.git
کیت توسعه نرمافزار ورود به سیستم گوگل (Google Sign-In SDK) را به پروژه خود اضافه کنید.
در Xcode، با باز کردن پروژه برنامه خود، به File > Add Packages بروید.
وقتی از شما خواسته شد، مخزن SDK ورود به سیستم Google را اضافه کنید:
https://github.com/google/GoogleSignIn-iOSپس از اتمام، Xcode به طور خودکار شروع به حل و دانلود وابستگیهای شما در پسزمینه میکند.
ورود به سیستم گوگل را برای پروژه فایربیس خود فعال کنید
برای اینکه به کاربران اجازه دهید با استفاده از Google Sign-In وارد سیستم شوند، ابتدا باید ارائه دهنده Google Sign-In را برای پروژه Firebase خود فعال کنید:
- در کنسول Firebase ، بخش Authentication (احراز هویت) را باز کنید.
- در برگه «روش ورود» ، ارائهدهنده گوگل را فعال کنید.
روی ذخیره کلیک کنید.
یک کپی جدید از فایل
GoogleService-Info.plistپروژه خود دانلود کنید و آن را در پروژه Xcode خود کپی کنید. نسخههای موجود را با نسخه جدید جایگزین کنید. (به بخش افزودن Firebase به پروژه iOS خود مراجعه کنید.)
فایلهای هدر مورد نیاز را وارد کنید
ابتدا باید فایلهای هدر Firebase SDK و Google Sign-In SDK را به برنامه خود وارد کنید.
سویفت
import FirebaseAuth import GoogleSignIn
هدف-سی
@import FirebaseCore; @import GoogleSignIn;
ورود به سیستم با گوگل را پیادهسازی کنید
با دنبال کردن این مراحل، Google Sign-In را پیادهسازی کنید. برای جزئیات بیشتر در مورد استفاده از Google Sign-In با iOS، به مستندات توسعهدهنده Google Sign-In مراجعه کنید.
- طرحهای URL سفارشی را به پروژه Xcode خود اضافه کنید:
- پیکربندی پروژه خود را باز کنید: روی نام پروژه در نمای درختی سمت چپ کلیک کنید. برنامه خود را از بخش TARGETS انتخاب کنید، سپس تب Info را انتخاب کنید و بخش URL Types را باز کنید.
- روی دکمه + کلیک کنید و یک طرح URL برای شناسه کلاینت معکوس شده خود اضافه کنید. برای یافتن این مقدار، فایل پیکربندی
را باز کنید و به دنبال کلیدGoogleService-Info.plist REVERSED_CLIENT_IDبگردید. مقدار آن کلید را کپی کرده و در کادر طرحهای URL در صفحه پیکربندی جایگذاری کنید. سایر فیلدها را دست نخورده باقی بگذارید.پس از تکمیل، پیکربندی شما باید چیزی شبیه به موارد زیر باشد (اما با مقادیر خاص برنامه شما):

- در متد application
application:didFinishLaunchingWithOptions:از نماینده برنامه خود، شیءFirebaseAppرا پیکربندی کنید.سویفت
// Use Firebase library to configure APIs FirebaseApp.configure()
هدف-سی
// Use Firebase library to configure APIs [FIRApp configure];
-
application:openURL:options:مربوط به نماینده برنامه خود را پیادهسازی کنید. این متد باید متدhandleURLمربوط به نمونهGIDSignInرا فراخوانی کند، که به درستی URL دریافتی برنامه شما را در پایان فرآیند احراز هویت مدیریت خواهد کرد.سویفت
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) { // ... } 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 Sign-In منتقل کنید و یک اعتبارنامه احراز هویت Firebase را از توکن احراز هویت گوگل حاصل ایجاد کنید:سویفت
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) }
هدف-سی
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 خود، یک View اضافه کنید و کلاس سفارشی آن را رویGIDSignInButtonتنظیم کنید. - اختیاری : اگر میخواهید دکمه را سفارشی کنید، موارد زیر را انجام دهید:
سویفت
- در کنترلر نمای خود، دکمه ورود را به عنوان یک ویژگی (property) تعریف کنید.
@IBOutlet weak var signInButton: GIDSignInButton!
- دکمه را به ویژگی
signInButtonکه اخیراً تعریف کردهاید، متصل کنید. - با تنظیم ویژگیهای شیء GIDSignInButton، دکمه را سفارشی کنید.
هدف-سی
- در فایل هدر کنترلر ویو خود، دکمه ورود را به عنوان یک ویژگی (property) تعریف کنید.
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- دکمه را به ویژگی
signInButtonکه اخیراً تعریف کردهاید، متصل کنید. - با تنظیم ویژگیهای شیء GIDSignInButton، دکمه را سفارشی کنید.
- در کنترلر نمای خود، دکمه ورود را به عنوان یک ویژگی (property) تعریف کنید.
احراز هویت با فایربیس
در نهایت، فرآیند ورود به Firebase را با اعتبارنامهی auth که در مرحلهی قبل ایجاد کردهاید، تکمیل کنید.
سویفت
Auth.auth().signIn(with: credential) { result, error in guard error == nil else { // ... return } // 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دریافت کنید. به بخش مدیریت کاربران مراجعه کنید.در قوانین امنیتی پایگاه داده و Cloud Storage Firebase Realtime Database ، میتوانید شناسه کاربری منحصر به فرد کاربر وارد شده را از متغیر
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; }
همچنین میتوانید کد مدیریت خطا را برای طیف کامل خطاهای احراز هویت اضافه کنید. به بخش مدیریت خطاها مراجعه کنید.