Apple প্ল্যাটফর্মে একটি অ্যাকাউন্টে একাধিক প্রমাণীকরণ প্রদানকারীকে লিঙ্ক করুন

আপনি ব্যবহারকারীদের একাধিক প্রমাণীকরণ প্রদানকারী ব্যবহার করে আপনার অ্যাপে সাইন ইন করার অনুমতি দিতে পারেন, একটি বিদ্যমান ব্যবহারকারী অ্যাকাউন্টের সাথে প্রমাণীকরণ প্রদানকারীর শংসাপত্র লিঙ্ক করে। ব্যবহারকারীরা সাইন ইন করার জন্য যে প্রমাণীকরণ প্রদানকারী ব্যবহার করুক না কেন, একই Firebase ব্যবহারকারী আইডি দ্বারা শনাক্ত করা যাবে। উদাহরণস্বরূপ, পাসওয়ার্ড দিয়ে সাইন ইন করা একজন ব্যবহারকারী ভবিষ্যতে একটি Google অ্যাকাউন্ট লিঙ্ক করতে পারেন এবং যেকোনো পদ্ধতিতে সাইন ইন করতে পারেন। অথবা, একজন বেনামী ব্যবহারকারী একটি Facebook অ্যাকাউন্ট লিঙ্ক করতে পারেন এবং পরে, আপনার অ্যাপ ব্যবহার চালিয়ে যেতে Facebook-এ সাইন ইন করতে পারেন।

শুরু করার আগে

আপনার অ্যাপে দুই বা ততোধিক প্রমাণীকরণ প্রদানকারীর (সম্ভবত বেনামী প্রমাণীকরণ সহ) জন্য সমর্থন যোগ করুন।

একটি বিদ্যমান ব্যবহারকারী অ্যাকাউন্টের সাথে auth প্রদানকারীর শংসাপত্র লিঙ্ক করতে:

  1. যেকোনো প্রমাণীকরণ প্রদানকারী বা পদ্ধতি ব্যবহার করে ব্যবহারকারীকে সাইন ইন করুন।
  2. নতুন প্রমাণীকরণ প্রদানকারীর জন্য FIRAuth.signInWith পদ্ধতিগুলির মধ্যে একটিতে কল করা পর্যন্ত সাইন-ইন প্রবাহ সম্পূর্ণ করুন, কিন্তু অন্তর্ভুক্ত নয়। উদাহরণস্বরূপ, ব্যবহারকারীর Google ID টোকেন, Facebook অ্যাক্সেস টোকেন, অথবা ইমেল এবং পাসওয়ার্ড পান।
  3. নতুন প্রমাণীকরণ প্রদানকারীর জন্য একটি FIRAuthCredential পান:

    গুগল সাইন-ইন
    সুইফট
    guard
      let authentication = user?.authentication,
      let idToken = authentication.idToken
    else {
      return
    }
    
    let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                   accessToken: authentication.accessToken)
    অবজেক্টিভ-সি
    FIRAuthCredential *credential =
    [FIRGoogleAuthProvider credentialWithIDToken:result.user.idToken.tokenString
                                     accessToken:result.user.accessToken.tokenString];
    ফেসবুক লগইন
    সুইফট
    let credential = FacebookAuthProvider
      .credential(withAccessToken: AccessToken.current!.tokenString)
    অবজেক্টিভ-সি
    FIRAuthCredential *credential = [FIRFacebookAuthProvider
        credentialWithAccessToken:[FBSDKAccessToken currentAccessToken].tokenString];
    ইমেল-পাসওয়ার্ড সাইন-ইন
    সুইফট
    let credential = EmailAuthProvider.credential(withEmail: email, password: password)
    অবজেক্টিভ-সি
    FIRAuthCredential *credential =
        [FIREmailAuthProvider credentialWithEmail:email
                                                 password:password];
  4. সাইন-ইন করা ব্যবহারকারীর linkWithCredential:completion: পদ্ধতিতে FIRAuthCredential অবজেক্টটি পাস করুন:

    সুইফট
        user.link(with: credential) { authResult, error in
      // ...
    }
    }
    অবজেক্টিভ-সি
        [[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
                // ...
            }

    অবজেক্টিভ-সি

    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 ডেটা অ্যাক্সেস করতে পারবেন।

একটি একক Firebase ব্যবহারকারী অ্যাকাউন্টের সাথে একাধিক প্রমাণীকরণ প্রদানকারী লিঙ্ক করা থাকতে পারে (উদাহরণস্বরূপ, ইমেল/পাসওয়ার্ড, গুগল, ফেসবুক), যা ব্যবহারকারীকে বিভিন্ন পদ্ধতির মাধ্যমে একই Firebase অ্যাকাউন্টে সাইন ইন করতে দেয়।

যদি আপনি কোনও ব্যবহারকারীর অ্যাকাউন্ট থেকে কোনও প্রমাণীকরণ প্রদানকারীকে লিঙ্কমুক্ত করেন, তাহলে তারা আর সেই প্রদানকারীর সাথে সাইন ইন করতে পারবেন না।

ব্যবহারকারীর অ্যাকাউন্ট থেকে একটি প্রমাণীকরণ প্রদানকারীকে আনলিঙ্ক করতে, প্রদানকারীর আইডিটি unlink পদ্ধতিতে পাস করুন। আপনি providerData সম্পত্তি থেকে ব্যবহারকারীর সাথে লিঙ্ক করা প্রমাণীকরণ প্রদানকারীদের প্রোভাইডার আইডি পেতে পারেন।

সুইফট

Auth.auth().currentUser?.unlink(fromProvider: providerID!) { user, error in
  // ...
}

অবজেক্টিভ-সি

[[FIRAuth auth].currentUser unlinkFromProvider:providerID
                                    completion:^(FIRUser *_Nullable user, NSError *_Nullable error) {
  // ...
}];

সমস্যা সমাধান

একাধিক অ্যাকাউন্ট লিঙ্ক করার সময় যদি আপনি ত্রুটির সম্মুখীন হন, তাহলে যাচাইকৃত ইমেল ঠিকানাগুলিতে ডকুমেন্টেশন দেখুন।