आप अपने ऐप में Google साइन-इन को एकीकृत करके अपने उपयोगकर्ताओं को उनके Google खातों का उपयोग करके फायरबेस के साथ प्रमाणित करने दे सकते हैं।
शुरू करने से पहले
- अपने Apple प्रोजेक्ट में Firebase जोड़ें । अपने
Podfile
में निम्नलिखित पॉड शामिल करें:pod 'FirebaseAuth' pod 'GoogleSignIn'
- अगर आपने अभी तक अपने ऐप को अपने फायरबेस प्रोजेक्ट से कनेक्ट नहीं किया है, तो फायरबेस कंसोल से ऐसा करें।
- Firebase कंसोल में Google को साइन-इन विधि के रूप में सक्षम करें:
- Firebase कंसोल में, प्रामाणिक अनुभाग खोलें।
- साइन इन विधि टैब पर, Google साइन-इन विधि सक्षम करें और सहेजें पर क्लिक करें।
1. आवश्यक शीर्षलेख फ़ाइलें आयात करें
सबसे पहले, आपको अपने ऐप्लिकेशन में Firebase SDK और Google साइन-इन SDK हेडर फ़ाइलें आयात करनी होंगी.
तीव्र
import FirebaseCore import GoogleSignIn
उद्देश्य सी
@import FirebaseCore; @import GoogleSignIn;
2. Google साइन-इन लागू करें
इन चरणों का पालन करके Google साइन-इन लागू करें। IOS के साथ Google साइन-इन का उपयोग करने के विवरण के लिए Google साइन-इन डेवलपर दस्तावेज़ देखें।
- अपने Xcode प्रोजेक्ट में कस्टम URL स्कीम जोड़ें:
- अपना प्रोजेक्ट कॉन्फ़िगरेशन खोलें: बाएं ट्री व्यू में प्रोजेक्ट के नाम पर डबल-क्लिक करें। TARGETS अनुभाग से अपने ऐप का चयन करें, फिर जानकारी टैब का चयन करें और URL प्रकार अनुभाग का विस्तार करें।
- + बटन पर क्लिक करें, और अपनी उलटी क्लाइंट आईडी के लिए एक URL योजना जोड़ें। यह मान खोजने के लिए,
कॉन्फ़िगरेशन फ़ाइल खोलें, औरGoogleService-Info.plist REVERSED_CLIENT_ID
कुंजी देखें। उस कुंजी के मान की प्रतिलिपि बनाएँ, और उसे कॉन्फ़िगरेशन पृष्ठ पर URL स्कीम बॉक्स में पेस्ट करें। अन्य क्षेत्रों को खाली छोड़ दें।पूर्ण होने पर, आपका कॉन्फ़िगरेशन निम्न के समान दिखना चाहिए (लेकिन आपके एप्लिकेशन-विशिष्ट मानों के साथ):
- आपके ऐप प्रतिनिधि के
application:didFinishLaunchingWithOptions:
विधि में,FirebaseApp
ऑब्जेक्ट को कॉन्फ़िगर करें।तीव्र
// Use Firebase library to configure APIs FirebaseApp.configure()
उद्देश्य सी
// Use Firebase library to configure APIs [FIRApp configure];
-
application:openURL:options:
आपके ऐप प्रतिनिधि की विधि। विधि कोhandleURL
उदाहरण के हैंडलURL विधि को कॉल करना चाहिए, जो प्रमाणीकरण प्रक्रिया के अंत में आपके एप्लिकेशन को प्राप्त होने वाले URL को ठीक सेGIDSignIn
।तीव्र
@available(iOS 9.0, *) func application(_ application: 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]; }
- Google साइन इन साइन-इन विधि के लिए अपने ऐप के लिए प्रेजेंटिंग व्यू कंट्रोलर और क्लाइंट आईडी पास करें और परिणामी Google ऑथेंटिक टोकन से फायरबेस ऑथ क्रेडेंशियल बनाएं:
तीव्र
guard let clientID = FirebaseApp.app()?.options.clientID else { return } // Create Google Sign In configuration object. let config = GIDConfiguration(clientID: clientID) // Start the sign in flow! GIDSignIn.sharedInstance.signIn(with: config, presenting: self) { [unowned self] user, error in if let error = error { // ... return } guard let authentication = user?.authentication, let idToken = authentication.idToken else { return } let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken) // ... }
उद्देश्य सी
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 { // ... } }];
- अपने स्टोरीबोर्ड, XIB फ़ाइल में एक
GIDSignInButton
जोड़ें, या इसे प्रोग्रामेटिक रूप से तुरंत चालू करें। बटन को अपने स्टोरीबोर्ड या XIB फ़ाइल में जोड़ने के लिए, एक View जोड़ें और इसकी कस्टम क्लास कोGIDSignInButton
पर सेट करें। - वैकल्पिक : यदि आप बटन को अनुकूलित करना चाहते हैं, तो निम्न कार्य करें:
तीव्र
- अपने व्यू कंट्रोलर में, साइन-इन बटन को प्रॉपर्टी के रूप में घोषित करें।
@IBOutlet weak var signInButton: GIDSignInButton!
- बटन को आपके द्वारा घोषित
signInButton
संपत्ति से कनेक्ट करें। - GIDSignInButton ऑब्जेक्ट के गुणों को सेट करके बटन को अनुकूलित करें।
उद्देश्य सी
- अपने व्यू कंट्रोलर की हेडर फाइल में, साइन-इन बटन को प्रॉपर्टी के रूप में घोषित करें।
@property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
- बटन को आपके द्वारा घोषित
signInButton
संपत्ति से कनेक्ट करें। - GIDSignInButton ऑब्जेक्ट के गुणों को सेट करके बटन को अनुकूलित करें।
- अपने व्यू कंट्रोलर में, साइन-इन बटन को प्रॉपर्टी के रूप में घोषित करें।
3. फायरबेस के साथ प्रमाणित करें
अंत में, पिछले चरण में बनाए गए प्रामाणिक क्रेडेंशियल के साथ फायरबेस लॉगिन प्रक्रिया को पूरा करें।
तीव्र
Auth.auth().signIn(with: credential) { authResult, error in if let error = error { let authError = error as NSError if isMFAEnabled, authError.code == AuthErrorCode.secondFactorRequired.rawValue { // The user is a multi-factor user. Second factor challenge is required. let resolver = authError .userInfo[AuthErrorUserInfoMultiFactorResolverKey] as! MultiFactorResolver var displayNameString = "" for tmpFactorInfo in resolver.hints { displayNameString += tmpFactorInfo.displayName ?? "" displayNameString += " " } self.showTextInputPrompt( withMessage: "Select factor to sign in\n\(displayNameString)", completionBlock: { userPressedOK, displayName in var selectedHint: PhoneMultiFactorInfo? for tmpFactorInfo in resolver.hints { if displayName == tmpFactorInfo.displayName { selectedHint = tmpFactorInfo as? PhoneMultiFactorInfo } } PhoneAuthProvider.provider() .verifyPhoneNumber(with: selectedHint!, uiDelegate: nil, multiFactorSession: resolver .session) { verificationID, error in if error != nil { print( "Multi factor start sign in failed. Error: \(error.debugDescription)" ) } else { self.showTextInputPrompt( withMessage: "Verification code for \(selectedHint?.displayName ?? "")", completionBlock: { userPressedOK, verificationCode in let credential: PhoneAuthCredential? = PhoneAuthProvider.provider() .credential(withVerificationID: verificationID!, verificationCode: verificationCode!) let assertion: MultiFactorAssertion? = PhoneMultiFactorGenerator .assertion(with: credential!) resolver.resolveSignIn(with: assertion!) { authResult, error in if error != nil { print( "Multi factor finanlize sign in failed. Error: \(error.debugDescription)" ) } else { self.navigationController?.popViewController(animated: true) } } } ) } } } ) } else { self.showMessagePrompt(error.localizedDescription) return } // ... return } // 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; // ... }];
अगले कदम
उपयोगकर्ता द्वारा पहली बार साइन इन करने के बाद, एक नया उपयोगकर्ता खाता बनाया जाता है और क्रेडेंशियल्स से लिंक किया जाता है—यानी, उपयोगकर्ता नाम और पासवर्ड, फ़ोन नंबर, या प्रमाणीकरण प्रदाता जानकारी—जिसके साथ उपयोगकर्ता ने साइन इन किया है। यह नया खाता आपके फायरबेस प्रोजेक्ट के हिस्से के रूप में संग्रहीत है, और उपयोगकर्ता द्वारा साइन इन किए जाने पर ध्यान दिए बिना, आपके प्रोजेक्ट में प्रत्येक ऐप में उपयोगकर्ता की पहचान करने के लिए इसका उपयोग किया जा सकता है।
अपने ऐप्लिकेशन में, आप
User
ऑब्जेक्ट से उपयोगकर्ता की मूल प्रोफ़ाइल जानकारी प्राप्त कर सकते हैं। उपयोगकर्ता प्रबंधित करें देखें।आपके फायरबेस रीयलटाइम डेटाबेस और क्लाउड स्टोरेज सुरक्षा नियमों में, आप
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; }
आप प्रमाणीकरण त्रुटियों की पूरी श्रृंखला के लिए त्रुटि प्रबंधन कोड भी जोड़ना चाह सकते हैं। हैंडल एरर देखें।