我有一个简单的 Web 应用程序,带有 Firebase 实时数据库和 Firebase 身份验证。 我的数据库规则如下所示:
{
"rules": {
"users": {
"$uid": {
".write": "$uid === auth.uid",
".read": "$uid === auth.uid"
}
}
}
}
因此只有经过身份验证的用户才能读取/写入自己的用户记录。 但是,当我允许匿名身份验证时,匿名用户无法写入自己的个人资料记录,即使他们有 UID 并且正在写入正确的记录。我收到 Firebase“权限被拒绝”错误。
对于经过电子邮件+密码验证的用户来说,这一切都可以正常工作。需要明确的是,使用电子邮件+密码提供商登录可以正常工作,但匿名登录(使用匿名提供商)不允许写入访问权限。
我正在
onAuthStateChanged()
回调中测试这一点,所以我知道用户是有效的:
onAuthStateChanged(auth, async (user) => {
try {
// ignore token refresh events
if (user && currentUID === user.uid)
return
if (user) {
currentUID = user.uid
// Create user record and update last login
const db = getDatabase()
const userRef = ref(db, 'users/' + user.uid)
console.log(JSON.stringify(user))
if (true) { // <<<<<<<<<<< THIS IS WHERE I GET "permission denied"
update(userRef, {
email: user.email || '-none-',
uid: user.uid,
lastLogin: serverTimestamp()
})
.catch(err => handleError(err))
}
on_sign_in(user)
} else {
currentUID = null
// User is signed out
on_sign_out()
}
} catch (error) {
handleError(error, error.message)
}
})
我尝试重现该问题,但 SDK 和代码似乎按我的预期工作。我在这里发布了我的最小非重现,希望它能帮助您找到非工作代码和我的工作示例之间的区别。
我的代码:
onAuthStateChanged(auth, (user) => {
if (user) {
console.log("User signed in", user);
const dbRef = ref(db, "77153837");
const userRef = child(dbRef, user.uid);
set(userRef, false).then(() => {
console.log("Wrote to db");
});
}
})
signInAnonymously(auth);
我使用的规则:
{
"rules": {
"77153837": {
"$uid": {
".write": "$uid === auth.uid"
}
}
}
}
其中
77153837
是您在此处发布的问题的 ID。除此之外,它对问题没有任何意义。
您可以在此处查看完整代码并运行它:https://stackblitz.com/edit/firebase-v9-rtdb-anonymous-writes