背景:在我的iOS游戏中,我想允许用户无需登录即可玩游戏(在Firebase中匿名进行身份验证以保存用户数据),还可以让他们选择使用Facebook登录以解锁其他游戏玩法。
我试图修改this post,用匿名登录替换Twitter登录:
"users": {
"$userid": {
// Require the user to be logged in, and make sure their current credentials
// match at least one of the credentials listed below, unless we're creating
// a new account from scratch.
".write": "auth != null &&
(data.val() === null ||
(auth.provider === 'facebook' && auth.uid === data.child('facebook/id').val() ||
(auth.provider === 'anonymous' && auth.uid === data.child('anonymous/id').val()))"
}
}
我很困惑转换将如何与这些规则一起使用。特别要说:
用户匿名进行身份验证,并且能够创建一个规范用户记录,其匿名uid存储在users/"$userid"/anonymous/id
下。这是允许的,因为用户已通过身份验证并且首次设置了用户对象(auth != null && data.val() === null
)。
允许对users/"$userid"/
进行任何后续写入,因为经过身份验证的用户的匿名ID存储在用户树中(auth != null && (auth.provider === 'anonymous' && auth.uid === data.child('anonymous/id').val())
)。
用户登录facebook。现在authData
包含尚未写入users/"$userid"/facebook/id
的facebook uid。写入该位置失败,因为安全规则不允许。
因此,在facebook身份验证完成之前,匿名用户无法访问facebook uid。此时,写入users/"$userid"/facebook/id
已经太晚了,因为经过身份验证的用户现在是Facebook用户,并且没有权限在那里写作。
我错过了什么吗?关于如何纠正这种情况的任何想法?