我正在使用 Flutter 开发一个应用程序,允许用户编辑其登录凭据,但有关 FirebaseAuth 的文档非常有限,而且我发现电话和电子邮件之间存在差异。
我很好奇(但找不到)的是如何从同时具有电子邮件和电话的帐户中删除电子邮件 - 以便我只能使用电话登录?
所以我做了一些实验,我分享结果希望能帮助别人(因为如果我有这些信息,它会节省我很多时间和挫败感)。
尤其是编辑电子邮件的行为方式相当出乎意料。
我实验了3种场景:手机登录、Google登录和无密码登录。 FirebaseAuth User 对象有两个与访问权限相关的字段:
providerData
和 userInfo
。
[{
email: null
isEmailVerified: true
phoneNumber: "+1 123-456-7890"
providerId: "phone"
uid: "+1 123-456-7890"
...
}]
用户信息:
email: null
isEmailVerified: false
phoneNumber: "+1 123-456-7890"
providerId: null
uid: "uid1"
...
对于用户对象
user
调用 user.unlink("phone")
对于用户对象
user
调用 user.linkWithCredential(credential)
提供商数据:
[{
email: "[email protected]"
isEmailVerified: true
phoneNumber: null
providerId: "google.com"
uid: "71593587134053905"
...
}]
用户信息:
email: "[email protected]"
isEmailVerified: true
phoneNumber: null
providerId: null
uid: "uidmail1"
...
对于用户对象
user
调用 user.unlink("google.com")
发送验证电子邮件并应用操作代码。
→ 发送验证电子邮件后,FirebaseAuth 用户没有任何变化
→ 更改为
[email protected]
后:
→ 我仍然可以使用
[email protected]
[email protected]
登录,那么 即使 userInfo 包含 [email protected]
,providerData 也只包含
[email protected]
[email protected]
登录时,它才会添加到providerData,然后它包含两个项目:
[{
email: "[email protected]"
isEmailVerified: true
phoneNumber: null
providerId: "google.com"
uid: "71593587134053905"
},{
email: "[email protected]"
isEmailVerified: true
phoneNumber: null
providerId: "google.com"
uid: "90839670913908504"
...
}]
→ 因此,如果另一个带有电话的帐户仅链接到电子邮件“[email protected]”,则 FirebaseAuth 有两个用户与该电子邮件连接。但是,当使用“[email protected]”登录时,我仍然以旧帐户登录(现在用户信息电子邮件“[email protected]”)
→ 擦除providerData,userInfo 保持与之前相同 → 现在“[电子邮件受保护]”不再以任何方式与旧帐户相关联,登录后会打开新帐户
取消链接会擦除providerData,userInfo保持与以前相同,因此我可以再次使用电子邮件登录