如何解决Firebase-注册-如果不存在新名称
我需要在Firebase上注册新用户的帮助,我希望如果该名称已被使用,它将返回一条Toast消息,要求选择其他名称。
我该怎么办?
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 举报,一经查实,本站将立刻删除。