我正在使用Firebase(最新版本)开发iOS应用程序,当使用电子邮件和密码对用户进行身份验证时,我在安全规则中遇到auth.provider
表达式时遇到问题。我希望auth.provider
表达式返回password
,但它看起来像是返回anonymous
。
在Firebase控制台中,我启用了电子邮件/密码和Google作为提供商,并设置了以下安全规则:
{
"rules": {
"users": {
"$uid": {
// the user is allowed to read
".read": "auth.uid === $uid",
// the non-anonymous user is allowed to write
".write": "auth.uid === $uid && auth.provider !== 'anonymous'"
// more here, omitted for brevity
}
}
}
}
在我的应用中,当使用电子邮件和密码作为用户XYZ登录时,我无法在/ users / XYZ节点下设置值。我得到了#34;许可被拒绝"错误。用户使用Google凭据登录的情况并非如此,它可以按预期运行。
看起来罪魁祸首是条件auth.provider !== 'anonymous'
。对于电子邮件/密码登录,我希望提供商等于password
;相反,它似乎设置为anonymous
。 Firebase文档列出了"密码"作为auth.provider的可能值:https://firebase.google.com/docs/reference/security/database/#auth
当一个人启用新的"匿名身份验证时,这个问题会产生更大的影响。功能(见https://firebase.google.com/docs/auth/ios/anonymous-auth)。据我了解,在安全规则中使用auth.provider
可以区分匿名"匿名"用户和密码"用户。
我是在看一个错误还是在我的推理中某个地方犯了一个初学者的错误?
供参考,以下是我使用的SDK版本(摘自CocoaPods输出):
Using Firebase (3.2.1)
Using FirebaseAuth (3.0.2)
Using FirebaseDatabase (3.0.1)
答案 0 :(得分:2)
Firebase团队确认他们身边有一个错误,正在努力解决问题。与此同时,下面的链接中有一个解决方法:
https://groups.google.com/d/topic/firebase-talk/C-ljg-CCKl0/discussion
解决方法包括使用以下安全规则检测用户使用电子邮件地址进行身份验证:
auth.token.firebase.identities.email !== null
答案 1 :(得分:0)
不是很有帮助,但我想说我使用Javascript客户端API有同样的问题。我已向Firebase小组发送了支持问题。如果我收到任何更新,我会在这里发布。