2016-09-07 8 views
0

私のWebサイトをFirebaseと組み合わせてJavaScriptに書き直しています。これまでのところ、私は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. 

誰でもこの問題を回避する方法がありますか? JamieBは.fetchProvidersForEmailを(使用することが提案

--Update--

)だから今、私は

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

すべてのユーザーを事前に作成する必要はありますか?あなたのWebサイトに最初にアクセスしたときにFirebaseで作成することはできませんか?あるいは、異なる/より高いレート制限を持つかもしれない 'createUserWithEmailAndPassword()'で始めることができます。 –

答えて

1

FIREBASE REFERENCEを使用するには、createUserWithEmailAndPassword(email, password)戻っfirebase.Promiseが非ヌルfirebase.Userを含むことを示しています。それで、それは約束を返します。これらは、.all Promiseメソッドに渡すことができる配列にプッシュすることができます。以下の関数を使用して、ユーザ名と写真URLをAuthサブシステムに追加して保存することができます。

追加のユーザープロパティは、各子IDがユーザーのUIDであるusersノードの下に格納できます。下部のスクリプトは、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 
    }); 
}