首页 > 解决方案 > Facebook 主要电子邮件更改后,Firebase 不会更新 Facebook 用户的电子邮件

问题描述

我有一个启用 Facebook 登录的测试 Firebase 应用程序。我创建了一个测试 FB 帐户(调用它abc@xyz.com),通过 FB 登录登录到 Firebase,请求 FB 配置文件数据,例如idemail通过GraphRequest使用accessToken返回的,一切似乎都是正确的。

然后我向 FB 帐户添加了另一封电子邮件(调用它def@uvw.com),将主电子邮件从 更改abc@xyz.comdef@uvw.com,并abc@xyz.com从帐户中删除。所以从技术上讲,abc@xyz.com现在已发布并且与 FB 帐户无关。

现在,当我使用def@uvw.comFirebase 登录 Firebase 时,我可以正确识别出它与之前登录的用户相同(因为 FB 凭据相同)。但是,当我在 Firebase 控制台中看到用户列表时,用户的电子邮件仍然显示abc@xyz.com.

所以我创建了一个新的 FB 帐户abc@xyz.com并尝试使用它登录我的 Firebase 应用程序。但由于我在 Firebase 身份验证设置中选择了“每个电子邮件地址一个帐户”选项,我收到以下错误:

Error Domain=FIRAuthErrorDomain Code=17012 "An account already exists with
the same email address but different sign-in credentials. Sign in using a 
provider associated with this email address." UserInfo=
{error_name=ERROR_ACCOUNT_EXISTS_WITH_DIFFERENT_CREDENTIAL, 
FIRAuthErrorUserInfoEmailKey=abc@xyz.com, NSLocalizedDescription=An 
account already exists with the same email address but different sign-in  
credentials. Sign in using a provider associated with this email address.}

这意味着即使我已经从 FB 帐户发布了该电子邮件,并使用该已发布的电子邮件创建了一个新用户,我也无法再次登录我的应用程序(只要我选择了“一个帐户每个Firebase 身份验证设置中的电子邮件地址”选项)

所以我很好奇:在 FB 帐户上的主要电子邮件发生更改后,Firebase 是否有原因不更新第一个帐户上的电子邮件?它是一个错误吗?因为GraphRequest响应返回了新电子邮件,所以如果没有其他用户已经注册了新电子邮件,Firebase 应该能够在技术上更新它。

标签: firebasefirebase-authenticationfacebook-login

解决方案


我想 Firebase 不知道电子邮件已更改并且无法跟踪它,因为 Firebase 无权访问用户的帐户详细信息,只有您的应用可以执行此操作。

您需要自行管理电子邮件更改方案。这是我在 iOS 上执行此操作的方法:

1) 每次用户打开应用程序时,我都会执行 Graph API 请求来获取新用户的数据。此请求返回的电子邮件会与该用户在 Firebase 中存储的电子邮件进行比较。

2)一旦我检测到电子邮件不同 - 我正在更新存储在 Firebase 中的电子邮件以与 Facebook 的电子邮件同步。在 iOS SDK 中是:

Auth.auth().currentUser?.updateEmail(to: newEmail) { error in
    // if there was no error - the firebase now has the latest email
}

推荐阅读