微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Firebase-注册-如果不存在新名称

如何解决Firebase-注册-如果不存在新名称

我需要在Firebase上注册新用户的帮助,我希望如果该名称已被使用,它将返回一条Toast消息,要求选择其他名称

我该怎么办?

Its my Database

private fun signUp(view: View,name: String,mail: String,pass: String) {
    signUp.visibility = View.GONE
    auth.createuserWithEmailAndPassword(mail,pass)
        .addOnCompleteListener {
            if (it.isSuccessful) {
                userData.session = findViewById<CheckBox>(R.id.remember).isChecked
                val user = auth.currentUser
                database.getReference("User Index").child(user!!.uid).setValue(name)
                myRef.child(user.uid).child("Followers").setValue(0)
                myRef.child(user.uid).child("Following").setValue(0)
                myRef.child(user.uid).child("Email").setValue(mail)
                myRef.child(user.uid).child("Name").setValue(name)
                myRef.child(user.uid).child("Bio").setValue("Ma Bio personnel")
                userData.name = name
                userData.email = mail
                userData.uid = user.uid
                userData.image = ConstantConfig().image
                myRef.child(user.uid).child("Photo").setValue(ConstantConfig().image)
                startActivity(Intent(this,PhotoAccountActivity::class.java))
                finish()

解决方法

我知道您想知道是否已经使用了用户名,但是我建议您使用该用户名,因为您知道已经使用了用户名,因为您知道用户名是数据库中的有效条目,因此,黑客只需要密码,而无需密码和用户名。因此,从安全角度出发,这不是一个好主意。

无论如何,如果您想知道我将探测数据库的信息,请尝试在用户名数据库中获取用户名,如果该用户名返回true,则该用户名已存在,您将需要使用其他用户名进行注册。

,

尝试使用此参考代码,并使用您的参考代码进行修改:

ref = FIRDatabase.database().reference()

ref.child("rooms/room1").observeSingleEvent(of: .value,with: { (snapshot) in
    if snapshot.exists(){
        print("true rooms exist")
    }else{
        print("false room doesn't exist")
    }
})
,

要求唯一的名称可能会出现问题(两个人肯定可以具有相同的名称;您要让其中一个人撒谎吗?),所以让我们假设您的意思是用户句柄(例如Twitter句柄),而不是人名。

由于句柄是唯一的,一个简单的答案就是通过唯一的句柄简单地键入数据:

/users/<user handle>/ {uid: "<auth uid here>"}

现在保证它是唯一的。您的安全规则将显示以下内容:

"users": {
   "$handle": {
      // I can only write to my own user record
      ".write": "data.child('uid') == auth.uid || !data.exists() && newData.hasChild('uid')","uid": {
         // I can only write my own uid
         ".validate": "!data.exists() && newData.val() == auth.uid"
      }
   }
}

如果您想变得更复杂,可以在auth令牌上set a claim,并使用它来验证谁拥有给定的句柄:

"users": {
   "$handle": {
      ".write": "auth.token.handle == $handle && (data.hasChild('uid') || newData.hasChild('uid'))","uid": {
         // I can only write my own uid
         ".validate": "newData.val() == auth.uid"
      }
   }
}

如果您使用实名,则它们不适合用作密钥(它们可能包含.之类的非法字符),因此您需要对其进行清理以删除特殊的disallowed characters

请注意,如果要保留以uid为键的记录,也可以使用索引来执行此操作。像这样:

/usernames/<sanitized user name>/<uid>

您可以按照以下步骤检查现有名称:

firebase.database().ref("/usernames/<sanatized name>").once('value')
    .then(snap => console.log("username " + (snap.exists()? "exists" : "does not exist")));

您将使用验证和如下所示的索引:

"users": {
   "$userId": {
      "name": {
         // I can only have a name in my profile if I've already claimed it
         ".validate": "root.child('usernames/' + sanitizeUserName(data.val())).val() == auth.uid"
      }
   }
}

"usernames": {
    "$name": {
       // I can't overwrite an existing claim on this name
       // I can only set it to my own id
       ".write": "!data.exists() && newData.val() == auth.uid"
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。