根据文档,给出了除电话身份验证之外的所有提供程序的值。我想在我的数据库中验证用户是否同时使用电话身份验证和 Facebook 进行身份验证。按auth.provider === 'facebook'
编写规则是有效的,但auth.provider === 'phone'
不起作用。从逻辑上讲,如果第一个有效,那么第二个应该不起作用,但是如果我说我总是使用电话凭据登录并在第一次使用电话凭据链接Facebook凭据怎么办?简而言之:
- 电话身份验证的值是否为
auth.provider
?如果是,那是什么? - 有没有办法检查用户在我的数据库中是否同时拥有Facebook和电话作为提供商?我不在乎用户是否使用其中任何一个登录。我唯一想要的是用户应该将他的Facebook凭据链接到手机。
- 假设
auth.provider
仅提供用于登录的提供商的值,那么当我从不使用 Facebook 登录用户而仅将其与电话凭据链接时,为什么auth.provider === 'facebook'
正常工作?
更新:
- 通过一些试验和错误,似乎如果电话身份验证是唯一使用的方法,那么
auth.provider
实际上是anonymous
,而不是phone
。 - 此外,根据博杰尔的回答,
auth.token.firebase.identities["phone"] !=null
原来是true
.需要注意的一点是,这没有记录在文档中。引用文档:
firebase.identity:与此用户帐号关联的所有身份的字典。字典的键可以是以下任何键:电子邮件、google.com、facebook.com、github.com twitter.com。
这里也没有提到电话。页面更新的最后一天是2017 年 5 月 17 日。考虑到 Firebase SDK for Javascript (v4.0.0(,包括对电话身份验证的支持,人们只能想象文档中的粗制滥造程度(请参阅发行说明(。
对于数据库/存储规则,auth.provider
将仅显示用于对用户进行身份验证和生成令牌的提供程序(而不是用于链接的提供程序(。这可以是phone
或facebook
.不能两者兼而有之。一次只能使用一个进行身份验证。Firebase 不支持多重身份验证。
也就是说,如果要检查用户是否链接了两个提供程序,正确的方法是检查: https://firebase.google.com/docs/reference/security/database/#authtoken 具体来说,auth.token.firebase.identities
您可以检查是否存在以下内容:auth.token.firebase.identities["facebook.com"]
auth.token.firebase.identities["phone"]
通过利用一些未记录的功能(阅读问题以了解原因(,可以编写以下规则来完成任务:
$uid === auth.uid && auth.token.firebase.identities['phone']!=null && auth.token.firebase.identities['facebook.com']!=null
更新:根据更新的文档,此解决方案可以完美运行。