如何防止Firebase中出现重复的用户属性?

 深圳陶笛_512 发布于 2022-12-28 13:42

FirebaseSimpleLogin用来创建用户并处理身份验证.

当我尝试通过该$createUser()方法创建一个简单登录的新用户时,如果已经使用了电子邮件地址,firebase将不会创建用户.但是,$set()在创建它们之后,我还使用将创建的用户保存到我的firebase中,并将其user.uid用作密钥.当尝试写入数据库时​​,即使用户名不是唯一的,firebase也会保存记录,因为简单登录只需要电子邮件和密码.那么,当用户名不被用作用户对象的密钥时,如何验证用户名是否唯一?

我正在创建这样的新用户:

$scope.createUser = function() {
  $scope.auth.$createUser('trinker@gmail.com', 'password').then(function(user, err) {
    if (!err) {
      ref.child('users/' + user.uid).set({
        email: user.email,
        username: user.username
      });
      console.log("success!");
    }else{
      console.log(err.message);
    }
  });
}

我的用户对象如下所示:

{
  "users" : {
    "simplelogin:28" : {
      "email" : "trinker@gmail.com",
      "username" : "jtrinker"
    },
    "simplelogin:30" : {
      "email" : "test@gmail.com",
      "username" : "jtrinker"
    }
  }
}

}

我需要使用uid作为每个用户的密钥,但我仍然需要用户名是唯一的.

如果一个对象中的属性对于另一个对象内的属性不是唯一的,我怎么能阻止firebase保存记录?

1 个回答
  • 首先,如果用户已经拥有username,它是独一无二的,这不会消失,我建议你放弃使用简单的登录uid.正如你在这里发现的那样,这只会产生试图在两者之间来回翻转的问题.使用firebase-passport-login等工具调查创建自己的令牌,然后存储记录.username

    但是,既然那不是你的问题,让我们解决一下,当我们在这里时,你可能想要继续进入我已经多次通过的双重身份的棘手荆棘.

    要使用户名唯一,请存储用户名索引.

    /users/$userid/username/$username
    /usernames/$username/$userid
    

    要确保它们是唯一的,请在usernames/path中的用户ID上添加如下安全规则,这样可确保每个用户只能分配一个用户,并且该值是用户的id:

    ".write": "newData.val() === auth.uid && !data.exists()"
    

    现在通过将以下内容添加到users/record中的用户名来强制它们匹配:

    "users": {
       "$userid": {
          "username": {
             ".validate": "root.child('usernames/'+newData.val()).val() === $userid"
          }
       }
    }
    

    这将确保ID是唯一的.请注意阅读权限.您可能希望完全避免这些,因为您不希望任何人查找私人电子邮件或用户名.像我所证明的那样支持保存这些将是理想的.

    这里的想法是你尝试分配用户名和电子邮件,如果它们失败,那么它们已经存在并且属于另一个用户.否则,您将它们插入用户记录,现在让用户通过uid和电子邮件编入索引.

    为了符合SO协议,这里是来自该要点的代码,可以通过链接更好地阅读:

    var fb = new Firebase(URL);
    
    function escapeEmail(email) {
       return email.replace('.', ',');
    }
    
    function claimEmail(userId, email, next) {
       fb.child('email_lookup').child(escapeEmail(email)).set(userId, function(err) {
          if( err ) { throw new Error('email already taken'); }
          next();
       });
    }
    
    function claimUsername(userId, username, next) {
       fb.child('username_lookup').child(username).set(userId, function(err) {
          if( err ) { throw new Error('username already taken'); }
          next();
       });   
    }
    
    function createUser(userId, data) {
       claimEmail(userId, data.email, claimUsername.bind(null, userId, data.username, function() {
          fb.child('users').child(userId).set(data);
       );   
    }
    

    规则:

    {
      "rules": {
         "users": {
            "$user": {
               "username": {
                   ".validate": "root.child('username_lookup/'+newData.val()).val() === auth.uid"
               },
               "email": {
                   ".validate": "root.child('email_lookup').child(newData.val().replace('.', ',')).val() === auth.uid"
               }
            }
         },
    
         "email_lookup": {
            "$email": {
               // not readable, cannot get a list of emails!
               // can only write if this email is not already in the db
               ".write": "!data.exists()",
               // can only write my own uid into this index
               ".validate": "newData.val() === auth.uid"
            }
         },
         "username_lookup": {
            "$username": {
               // not readable, cannot get a list of usernames!
               // can only write if this username is not already in the db
               ".write": "!data.exists()",
    
               // can only write my own uid into this index
               ".validate": "newData.val() === auth.uid"
            }
         },
      }
    }
    

    2022-12-28 13:45 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有