且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何在 Firebase 中防止同一用户使用多个帐户?

更新时间:2023-02-16 14:33:15

我能够解决这个问题.

1. Login Social account (Account_2)
2. Try to link Mobile No
    If(Success)
       Account (Step1) updated with Mobile No
    Else
       Login with Mobile No (Account_1)
       Link Social account (Account_2) created in step1 with Account_1

示例java脚本代码:

Sample java script code:

    <script>
  var firebaseConfig = {
    apiKey: "XXXX",
    authDomain: "XXXXXX",
    databaseURL: "XXXXXX",
    projectId: "XXXXXX",
    storageBucket: "XXXXXXXXX",
    messagingSenderId: "XXXXXXX",
    appId: "XXXXXXXX",
    measurementId: "XXXXXXXXXXXX"
  };

  firebase.initializeApp(firebaseConfig);
  firebase.analytics();


var provider = new firebase.auth.FacebookAuthProvider;

var phoneAuthProvider = new firebase.auth.PhoneAuthProvider;

firebase.auth().useDeviceLanguage();

provider.setCustomParameters({
  'display': 'popup'
});

var globalCred ;


firebase.auth().signInWithPopup(provider).then(function(result) {

  var token = result.credential.accessToken;

  globalCred = result.credential;

  console.log("GLOBAL :" + globalCred);

  var user = result.user;

  var prevUser = firebase.auth().currentUser; //Logged in via FB
  
  console.log(prevUser);

  
  if (!user.phoneNumber) {
      // Ask user for phone number.
      var phoneNumber = window.prompt('Provide your phone number');
      // You also need to provide a button element signInButtonElement
      // which the user would click to complete sign-in.
      // Get recaptcha token. Let's use invisible recaptcha and hook to the button.
      var appVerifier = new firebase.auth.RecaptchaVerifier(
          signInButtonElement, {size: 'invisible'});
      // This will wait for the button to be clicked the reCAPTCHA resolved.
      return result.user.linkWithPhoneNumber(phoneNumber, appVerifier)
        .then(function(confirmationResult) {
          // Ask user to provide the SMS code.
          var code = window.prompt('Provide your SMS code');
          // Complete sign-in.
          return confirmationResult.confirm(code);
        })
    }

}).catch(function(error) {

  var errorCode = error.code;
  var errorMessage = error.message;

  var email = error.email;

  var credential = error.credential;

  if(errorCode == 'auth/credential-already-in-use'){
      // Merge accounts      
      console.log("Trying Linking");  

      var prevUser = firebase.auth().currentUser;

      prevUser.delete().then(function() {
        console.log("FB user deleted");
      }).catch(function(error) {
        // An error happened.
        console.log("Error in FB user deletion");
      });

      firebase.auth().signInWithCredential(credential).then(function(result) {
        console.log("Sign In Success using Phone", result);
        var currentUser = result.user;

          firebase.auth().currentUser.linkWithCredential(globalCred);

          });

      }).catch(function(error) {
        // If there are errors we want to undo the data merge/deletion
        console.log("Sign In Error", error);
        //repo.set(prevUser, prevUserData);
      });


  }

}); 

</script>