正如标题所示,我想提供一些功能,允许用户使用Firebase简单登录更新用于登录我的应用的电子邮件。无法想出一个优雅的方式来做到这一点。如果相关,应用程序使用AngularFire。
是否存在或是否需要使用$removeUser()
和$createUser()
方法创建新帐户并删除旧帐户?
答案 0 :(得分:4)
Firebase 2.1.x更新
Firebase SDK现在提供changeEmail method。
var ref = new Firebase('https://<instance>.firebaseio.com');
ref.changeEmail({
oldEmail: 'kato@domain.com',
newEmail: 'kato2@kato.com' ,
password: '******'
}, function(err) {
console.log(err ? 'failed to change email: ' + err : 'changed email successfully!');
});
Firebase 1.x的历史答案
在简单登录中,这相当于更改用户的ID。所以没有办法在飞行中这样做。只需创建新帐户,按照您的建议删除旧帐户。
如果您是Firebase中的用户个人资料,则还需要移动这些用户个人资料。这是蛮力,安全的方法来迁移帐户,包括用户个人资料。当然,你可以通过一些客观化和未来来改善这一点:
var ref = new Firebase('URL/user_profiles');
var auth = new FirebaseSimpleLogin(ref);
// assume user has logged in, or we obtained their old UID by
// looking up email address in our profiles
var oldUid = 'simplelogin:123';
moveUser( auth, ref, oldUid, '123@abc.com', '456@def.com', 'xxx' );
function moveUser( auth, usersRef, oldUid, oldId, newId, pass ) {
// execute activities in order; first we copy old paths to new
createLogin(function(user) {
copyProfile(user.uid, function() {
// and once they safely exist, then we can delete the old ones
removeOldProfile();
removeOldLogin();
});
});
function copyProfile(newId, next) {
ref.child(oldUid).once('value', function(snap) {
if( snap.val() !== null ) {
ref.child(newId, snap.val(), function(err) {
logError(err);
if( !err ) { next(); }
});
}
});
}
function removeOldProfile() {
ref.child(oldId).remove(logError);
}
function createLogin(next) {
auth.createUser(newId, pass, function(err, user) {
logError(err);
if( !err ) { next(user); }
});
}
function removeOldLogin() {
auth.removeUser(oldId, pass, logError);
}
}
function logError(err) {
if( err ) { console.error(err); }
}