如何在firebase简单登录中更改与用户关联的电子邮件?

时间:2014-02-01 16:10:35

标签: firebase angularfire firebase-security

正如标题所示,我想提供一些功能,允许用户使用Firebase简单登录更新用于登录我的应用的电子邮件。无法想出一个优雅的方式来做到这一点。如果相关,应用程序使用AngularFire。

是否存在或是否需要使用$removeUser()$createUser()方法创建新帐户并删除旧帐户?

1 个答案:

答案 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); }
}