আপনি একটি বিদ্যমান ব্যবহারকারীর অ্যাকাউন্টে প্রমাণীকরণ প্রদানকারীর শংসাপত্র লিঙ্ক করে একাধিক প্রমাণীকরণ প্রদানকারী ব্যবহার করে ব্যবহারকারীদের আপনার অ্যাপে সাইন ইন করার অনুমতি দিতে পারেন। ব্যবহারকারীরা সাইন ইন করতে যে প্রমাণীকরণ প্রদানকারীই ব্যবহার করুক না কেন একই Firebase ব্যবহারকারী আইডি দ্বারা শনাক্ত করা যায়৷ উদাহরণস্বরূপ, যে ব্যবহারকারী একটি পাসওয়ার্ড দিয়ে সাইন ইন করেছেন সে একটি Google অ্যাকাউন্ট লিঙ্ক করতে পারে এবং ভবিষ্যতে যেকোনো পদ্ধতিতে সাইন ইন করতে পারে৷ অথবা, একজন বেনামী ব্যবহারকারী একটি Facebook অ্যাকাউন্ট লিঙ্ক করতে পারেন এবং তারপরে, আপনার অ্যাপ ব্যবহার চালিয়ে যেতে Facebook-এ সাইন ইন করতে পারেন।
আপনি শুরু করার আগে
আপনার অ্যাপে দুই বা ততোধিক প্রমাণীকরণ প্রদানকারীর জন্য সমর্থন যোগ করুন (সম্ভবত বেনামী প্রমাণীকরণ সহ)।
একটি ব্যবহারকারীর অ্যাকাউন্টে অনুমোদন প্রদানকারীর শংসাপত্র লিঙ্ক করুন
একটি বিদ্যমান ব্যবহারকারী অ্যাকাউন্টে প্রমাণীকরণ প্রদানকারীর শংসাপত্রগুলি লিঙ্ক করতে:
- যেকোনো প্রমাণীকরণ প্রদানকারী বা পদ্ধতি ব্যবহার করে ব্যবহারকারীকে সাইন ইন করুন।
- নতুন প্রমাণীকরণ প্রদানকারীর জন্য সাইন-ইন প্রবাহ সম্পূর্ণ করুন, কিন্তু অন্তর্ভুক্ত নয়,
FIRAuth.signInWith
পদ্ধতিগুলির একটিতে কল করা। উদাহরণস্বরূপ, ব্যবহারকারীর গুগল আইডি টোকেন, ফেসবুক অ্যাক্সেস টোকেন বা ইমেল এবং পাসওয়ার্ড পান। নতুন প্রমাণীকরণ প্রদানকারীর জন্য একটি
FIRAuthCredential
পান:Google সাইন-ইন
সুইফট
guard let authentication = user?.authentication, let idToken = authentication.idToken else { return } let credential = GoogleAuthProvider.credential(withIDToken: idToken, accessToken: authentication.accessToken)
উদ্দেশ্য-C
FIRAuthCredential *credential = [FIRGoogleAuthProvider credentialWithIDToken:result.user.idToken.tokenString accessToken:result.user.accessToken.tokenString];
ফেসবুক লগইন
সুইফট
let credential = FacebookAuthProvider .credential(withAccessToken: AccessToken.current!.tokenString)
উদ্দেশ্য-C
FIRAuthCredential *credential = [FIRFacebookAuthProvider credentialWithAccessToken:[FBSDKAccessToken currentAccessToken].tokenString];
ইমেল-পাসওয়ার্ড সাইন-ইন
সুইফট
let credential = EmailAuthProvider.credential(withEmail: email, password: password)
উদ্দেশ্য-C
FIRAuthCredential *credential = [FIREmailAuthProvider credentialWithEmail:email password:password];
সাইন-ইন করা ব্যবহারকারীর
linkWithCredential:completion:
পদ্ধতিতেFIRAuthCredential
অবজেক্টটি পাস করুন:সুইফট
user.link(with: credential) { authResult, error in // ... } }
উদ্দেশ্য-C
[[FIRAuth auth].currentUser linkWithCredential:credential completion:^(FIRAuthDataResult *result, NSError *_Nullable error) { // ... }];
linkWithCredential:completion:
এর কল ব্যর্থ হবে যদি শংসাপত্রগুলি ইতিমধ্যেই অন্য ব্যবহারকারীর অ্যাকাউন্টের সাথে লিঙ্ক করা থাকে। এই পরিস্থিতিতে, আপনাকে অবশ্যই আপনার অ্যাপের জন্য উপযুক্ত হিসাবে অ্যাকাউন্ট এবং সংশ্লিষ্ট ডেটা মার্জিং পরিচালনা করতে হবে:সুইফট
let prevUser = Auth.auth().currentUser 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 // ... } // Merge prevUser and currentUser accounts and data // ... }
উদ্দেশ্য-C
FIRUser *prevUser = [FIRAuth auth].currentUser; [[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; // ... }]; // Merge prevUser and currentUser accounts and data // ... }];
linkWithCredential:completion:
কলটি সফল হলে, ব্যবহারকারী এখন যেকোনো লিঙ্ক করা প্রমাণীকরণ প্রদানকারী ব্যবহার করে সাইন ইন করতে পারবেন এবং একই Firebase ডেটা অ্যাক্সেস করতে পারবেন।
একটি ব্যবহারকারীর অ্যাকাউন্ট থেকে একটি প্রমাণ প্রদানকারীকে লিঙ্কমুক্ত করুন৷
আপনি একটি অ্যাকাউন্ট থেকে একটি প্রমাণ প্রদানকারীকে লিঙ্কমুক্ত করতে পারেন, যাতে ব্যবহারকারী আর সেই প্রদানকারীর সাথে সাইন ইন করতে না পারে৷
একটি ব্যবহারকারীর অ্যাকাউন্ট থেকে একটি প্রমাণ প্রদানকারীকে আনলিঙ্ক করতে, unlink
পদ্ধতিতে প্রদানকারীর আইডি পাস করুন৷ আপনি providerData
প্রপার্টি থেকে একজন ব্যবহারকারীর সাথে লিঙ্ক করা প্রমাণ প্রদানকারীর প্রোভাইডার আইডি পেতে পারেন।
সুইফট
Auth.auth().currentUser?.unlink(fromProvider: providerID!) { user, error in // ... }
উদ্দেশ্য-C
[[FIRAuth auth].currentUser unlinkFromProvider:providerID completion:^(FIRUser *_Nullable user, NSError *_Nullable error) { // ... }];