2016-09-07 74 views
0

我正在重寫我的網站,將JavaScript與Firebase結合使用。到目前爲止,我喜歡Firebase,但現在我需要將所有舊用戶遷移到Firebase系統。Firebase身份驗證 - 將用戶從SQL遷移到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. 

任何人都有一個想法如何解決這個問題?

--Update--

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); 
         }       
        }) 
+2

也許你可以嘗試使用https://firebase.google.com/docs/reference/js/firebase.auth .Auth#fetchProvidersForEmail而不是以檢查用戶是否存在的方式登錄? 我無法測試這個,但看着API,看起來像一種方式來確定一個用戶是否存在沒有自動化。 – JamieB

+0

謝謝,它有點幫助。現在我可以創建更多的用戶,但是仍然在X插入後我被阻止。 – user1664803

+0

您是否需要預先創建所有用戶?你不能在他們第一次訪問你的網站時在Firebase中創建它們嗎?或者:你可以嘗試從'createUserWithEmailAndPassword()'開始,它可能有不同/更高的速率限制。 –

回答

1

FIREBASE REFERENCE表明createUserWithEmailAndPassword(email, password)回報firebase.Promise含非空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 
    }); 
}