gpt4 book ai didi

ios - 检查唯一用户名时 Firebase 权限被拒绝

转载 作者:行者123 更新时间:2023-11-28 15:52:02 25 4
gpt4 key购买 nike

我想检查用户名是否已被使用。当当前用户没有“用户名”的 child 时调用此函数:

func createUsername()
{
let userID = FIRAuth.auth()?.currentUser?.uid
FIRDatabase.database().reference().updateChildValues([
"users/\(userID!)/username": username.text!,
"usernames/\(username.text!)": userID!
], withCompletionBlock: { (error, reference) in
if (error != nil) {
print("disallowed")
// Write was disallowed because username exists
}
})
}

结合此规则:

{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid",
"username": {
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString()"
}
}
},
"usernames": {
"$username": {
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString() && newData.val() == root.child('users/' + auth.uid + '/username').val()"
}
}
}
}

我的答案来自:https://groups.google.com/forum/#!topic/firebase-talk/dA1Lkykd-tk我收到此错误消息:

[Firebase/Database][I-RDB03812] updateChildValues: at / failed: permission_denied

我不确定为什么这行不通。我也试过这个答案:Firebase android : make username unique但这对我不起作用。规则有问题,但我不知道是什么。

更新,规则变化不大,还是一样的错误:

{
"rules": {
"users": {
"$uid": {
".read": "$uid === auth.uid",
".write": "$uid === auth.uid",
"username": {
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString()"
}
}
},
"usernames": {
"$username": {
".read": true,
".write": "!data.exists() && newData.exists()",
".validate": "newData.isString() && newData.val() == newData.parent().parent().child('users/' + auth.uid + '/username').val()"
}
}
}
}

我也更改了 parent() 的东西,但它也不起作用。我改成4个 parent ,0个 parent 。同样的错误。

最佳答案

更新:问题来自这个验证规则:

".validate": "newData.isString() && newData.val() == root.child('users/' + auth.uid + '/username').val()"

您正在将新数据与当前 根进行比较。由于用户刚刚创建,/users/$uid 还不存在。

您要做的是将新数据与 用户节点进行比较。要到达此节点,您应该在比较时从 newData 导航到 new 根:

".validate": "newData.isString() && 
newData.val() == newData.parent().parent().child('users/' + auth.uid + '/username').val()"

我将在下面留下我之前的回复,因为它可能对学习如何解决此类问题很有用。

我只是将您的规则粘贴到我的一个项目中,对它们进行了一些简化,然后毫无问题地使用了您的代码。我不确定你为什么遇到问题。

代码:

    FIRAuth.auth()?.signInAnonymously(completion: { (user, error) in
let username = "puf"
let userID = FIRAuth.auth()?.currentUser?.uid
self.ref.child("42188459").updateChildValues([
"users/\(userID!)/username": username,
"usernames/\(username)": userID!
], withCompletionBlock: { (error, reference) in
if (error != nil) {
print("disallowed")
// Write was disallowed because username exists
}
})
})

规则片段:

  "users": {
"$uid": {
".write": "$uid === auth.uid",
"username": {
".write": "!data.exists() && newData.exists()",
}
}
},
"usernames": {
"$username": {
".write": "!data.exists() && newData.exists()",
}
}

生成的 JSON:

{
"usernames" : {
"puf" : "DBP4Pw3uiwQfUaDJw1XBR8oFBUK2"
},
"users" : {
"DBP4Pw3uiwQfUaDJw1XBR8oFBUK2" : {
"username" : "puf"
}
}
}

关于ios - 检查唯一用户名时 Firebase 权限被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42188459/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com