簡體   English   中英

Firebase身份驗證-將用戶從SQL遷移到Firebase

[英]Firebase Authentication - Migrate users from SQL to Firebase

我正在與Firebase一起將我的網站重寫為JavaScript。 到目前為止,我喜歡Firebase,但是現在我需要將所有舊用戶遷移到Firebase系統。

所有用戶都具有自定義的額外設置,我不希望刪除服務器所在的位置(€103,p / m)。 所以我需要全部復制。 據我所知,它需要一個接一個地完成( createUserWithEmailAndPassword )。 在服務器上,創建一個JSON對象,並在新站點上執行以下操作:

$.get("/alljsonfromalink", function (rdata) {
      var $jData = jQuery.parseJSON(rdata);
      var i = 0;
      for (var user in $jData) {
      whenYouFeelLikIt(user, $jData);
      }
    });


function whenYouFeelLikIt(i, $jData) {
            setTimeout(function() {
                firebase.auth().signInWithEmailAndPassword($jData[i].email, RandomPassword)
                    .then(function(){
                        console.log("Succes Login");
                        //if exist i set extra settings
                        setusersettings($jData[i], $jData[i].email);
                    })
                    .catch(function(error) {                      
                    var errorCode = error.code;
                    console.log(errorCode);
                    if(errorCode == "auth/user-not-found") {                            
                            firebase.auth().createUserWithEmailAndPassword($jData[i].email, RandomPassword).then(function () {
                                console.log("Created: " + $jData[i].email);
                            });
                        }
                });

                },2000 * (i));
            }

它可以工作,但是即使有2秒的超時,在插入20或30次之后我還是得到了:

firebase.js:73 Uncaught Error: We have blocked all requests from this device due to unusual activity. Try again later.

任何人都知道如何解決此問題?

-更新-

JamieB建議使用.fetchProvidersForEmail()所以現在我使用

firebase.auth().fetchProvidersForEmail($jData[i].email)
                    .then(function(succes){
                        console.log(succes.length);
                        if(succes.length == 0) {
                            // the createUserWithEmailAndPassword() with timeout
                            create(i, $jData);
                        }                          
                    })

FIREBASE REFERENCE指示createUserWithEmailAndPassword(email, password)返回firebase.Promise其中包含非null firebase.User 因此,它返回了一個承諾。 這些可以放入數組,該數組可以傳遞給.all Promise方法。 您可以使用以下功能將用戶名和photoURL添加到將存儲它們的Auth子系統。

可以將任何其他用戶屬性存儲在users節點下,其中每個子ID是用戶的UID。 底部的腳本顯示了一個使用Promise.all的示例。

  function registerPasswordUser(email,displayName,password,photoURL){
    var user = null;
    //NULLIFY EMPTY ARGUMENTS
    for (var i = 0; i < arguments.length; i++) {
      arguments[i] = arguments[i] ? arguments[i] : null;
    }
    auth.createUserWithEmailAndPassword(email, password)
    .then(function () {
      user = auth.currentUser;
      user.sendEmailVerification();
    })
    .then(function () {
      user.updateProfile({
        displayName: displayName,
        photoURL: photoURL
      });
    })
    .catch(function(error) {
      console.log(error.message);
    });
    console.log('Validation link was sent to ' + email + '.');
  }

... Promise.all的示例:...

function loadMeetings(city,state) {

    return ref.child('states').child(state).child(city).once('value').then(function(snapshot) {
    var reads = [];
    snapshot.forEach(function(childSnapshot) {
        var id = childSnapshot.key();
        var promise = ref.child('meetings').child(id).once('value').then(function(snap) {
            return snap.val();
        }, function(error) {
            // The Promise was rejected.
            console.error(error);
        });
        reads.push(promise);
    });
    return Promise.all(reads);
    }, function(error) {
        // The Promise was rejected.
        console.error(error);
    }).then(function(values) {
        //for each snapshot do something
    });
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM