如何在 Firebase 中防止同一用户使用多个帐户? [英] How to prevent multiple account for same user in Firebase?

查看:23
本文介绍了如何在 Firebase 中防止同一用户使用多个帐户?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们正在使用 Flutter 开发应用程序并探索 Firebase 进行身份验证,我们计划向最终用户提供以下身份验证机制.

We are developing an app using Flutter and exploring Firebase for Authentication, We have plan to provide below authentication mechanism to the end-user.

  1. 通过一次性密码登录
  2. 社交登录(Facebook/Google)

但是有一个问题,在下面的场景中.

But there is a problem, in the below scenario.

  1. 用户通过 OTP 登录(创建一个新帐户),假设 U1(用户 ID)和 M1(移动)

  1. User login by OTP (A new account get created), Lets assume U1 (user Id) and M1 (Mobile)

U1 ---->M1

现在同一用户尝试通过 FaceBook 登录(我们不会通过社交登录获取移动设备),只有电子邮件会在那里,现在将为同一用户创建一个新帐户.

Now on another day same user tries to login by FaceBook (we will not get mobile from social sign in) , Only Email will be there , Now a new account will get created for that same user.

U2 ----->E1

U2 -----> E1

我如何防止在第 2 步 (U2) 中创建的帐户是同一用户?

How do i prevent account created at step 2 (U2), as its same user ?

尝试探索,在 OTP 验证后通过电话号码更新用户个人资料,以防社交登录,但如果该号码的帐户已存在,则似乎无法添加电话号码.

Tried to explore , update user profile by phone number after OTP verification, in case of social signin, but looks like one can't add phone number in case account with that number is already exist.

如果已经存在具有给定电话号码的帐户,则抛出 FirebaseAuthUserCollisionException

FirebaseAuthUserCollisionException thrown if there already exists an account with the given phone number

https://firebase.google.com/docs/reference/android/com/google/firebase/auth/FirebaseUser#updatePhoneNumber(com.google.firebase.auth.PhoneAuthCredential)

有人可以帮忙吗?有人在使用 Firebase 身份验证时遇到过类似问题吗?

Can some one pls help? Anyone faced similar problem using Firebase Authentication?

推荐答案

我能够解决这个问题.

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>

这篇关于如何在 Firebase 中防止同一用户使用多个帐户?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆