Firebase身份验证 - 将用户从SQL迁移到Firebase
问题描述:
我正在重写我的网站,将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);
}
})
答
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
});
}
也许你可以尝试使用https://firebase.google.com/docs/reference/js/firebase.auth .Auth#fetchProvidersForEmail而不是以检查用户是否存在的方式登录? 我无法测试这个,但看着API,看起来像一种方式来确定一个用户是否存在没有自动化。 – JamieB
谢谢,它有点帮助。现在我可以创建更多的用户,但是仍然在X插入后我被阻止。 – user1664803
您是否需要预先创建所有用户?你不能在他们第一次访问你的网站时在Firebase中创建它们吗?或者:你可以尝试从'createUserWithEmailAndPassword()'开始,它可能有不同/更高的速率限制。 –