【问题标题】:Changing email for iOS Firebase user authenticated with email link更改通过电子邮件链接进行身份验证的 iOS Firebase 用户的电子邮件
【发布时间】:2019-02-28 03:45:51
【问题描述】:

所以我有一个使用 Firebase 的 iOS 应用程序,最初以匿名方式登录用户,然后允许他们稍后添加一个电子邮件地址,该地址通过以下调用链接到 Firebase 用户:

Auth.auth().currentUser?.linkAndRetrieveData(with: credential)

这一切都很好,但我现在遇到了无法更新该用户的电子邮件的问题。我认为这可以通过简单地向新电子邮件发送另一个电子邮件链接,然后使用新凭据调用 linkAndRetrieveData 来实现。

然而,这给了我一个 FIRAuthErrorCodeProviderAlreadyLinked 错误,因为用户已经有一个电子邮件地址。我原以为它会覆盖现有的电子邮件。然后我尝试/考虑了解决方案:

  1. 取消链接电子邮件提供商,然后使用新凭据重新链接。首先,这似乎是不可能的,因为电子邮件链接身份验证用户的“providerId”是“Firebase”,当我将其输入 unlink 时,它会失败。其次,这很容易出现错误,因为您可以成功取消链接第一封电子邮件,然后让新电子邮件的链接失败。

  2. 使用提供的“updateEmail”方法 - 这不起作用,因为它假定电子邮件/密码身份验证,而我正在使用电子邮件链接身份验证。即使这确实有效,也意味着有一封未经验证的电子邮件。

所以我想知道如何做到这一点,或者实际上是否有可能根本不支持。我不敢相信这不会得到支持,因为这似乎是一个非常常见的问题,并且基本上使电子邮件链接身份验证无法启动。

【问题讨论】:

    标签: ios firebase firebase-authentication


    【解决方案1】:

    updateEmail() 是为登录用户更改电子邮件的方法,无论用户是如何创建或验证的。你是对的,新的电子邮件地址将变得未经验证。然后可以触发 sendEmailVerification() 方法向用户发送验证电子邮件,以便他们验证电子邮件地址。

    【讨论】:

    • 请注意,这种方法也有一些几乎令人望而却步的不良状态 - 例如,用户在更改电子邮件时输入了拼写错误,然后丢失了手机,并且尽管之前已经验证了电子邮件,但无法恢复数据。您是 Google Firestore 团队的一员吗?您能否确认这是唯一的方法,并且这里没有办法减轻潜在的数据丢失(除了更改 auth 方法)?
    • 我们看到的问题是,当我们最初匿名验证用户,然后使用电子邮件链接验证时,调用 linkAndRetrieveData 有效,但 Auth.auth().currentUser!.isEmailVerified 为 false .如果我们使用“sendSignInLink”发送电子邮件(即第一次,当匿名用户没有附加电子邮件时),这个问题就可以了,因为直到 ilnk 之后才会为匿名用户设置电子邮件 - 即,我们知道即使它说不是,它也得到了验证。但在 updateEmail 案例中,我们不知道该电子邮件是否已被验证。
    • 那么您能否确认对于最初的匿名用户,正确的流程是:1.) Auth.auth().sendSignInLink - 第一次使用想要去匿名 2.) Auth.auth() .isSignIn(withEmailLink: link) - 检查是否登录 3.) Auth.auth().currentUser?.linkAndRetrieveData - 链接凭据 4.) Auth.auth().currentUser?.updateEmail - 如果用户想更改电子邮件 5 .) Auth.auth().currentUser?.sendEmailVerification - 验证更改的电子邮件 6.) Auth.auth().currentUser?.linkAndRetrieveData - 再次调用这个?如果这是正确的,并且调用没有出错,为什么 isEmailVerified 为假?
    • 据我所知,大多数用例都可以实现,尽管可能都使用客户端 SDK。如果用户有一个未经验证的电子邮件地址,他们可以恢复他们的密码。如果电子邮件地址不正确,他们可以使用其他提供商登录并进行修复。如果这对您的用例不起作用,您可以通过 Admin SDK 修复他们的电子邮件地址。如果您发现未涵盖的用例,我建议您使用filing a bug report or feature request
    【解决方案2】:

    providerID for an email link user should be "emailLink"(Android 链接,因为我无法快速找到 iOS 版本,并且值仍然来自服务器)。

    但请注意,链接帐户将始终具有"firebase" 的顶级提供者,然后在provider arrayUserInfo 元素中具有链接帐户的实际值。

    【讨论】:

    • 感谢弗兰克这么快的回复。我认为您会在这里提倡取消链接作为正确的方法-即使它确实可能会造成用户可能最终没有电子邮件的不良状态?可能发生这种情况的一种常见情况是,如果新电子邮件已经链接到现有帐户,实际上在这种情况下,似乎是在链接调用时引发的“提供者已链接”错误(如果相反,它优先通知我知道该电子邮件正被另一个用户使用并出现初始错误,然后我可以在取消链接之前停止并处理此案例)。
    • 我从来没有处理过这个场景,所以对什么是最好的没有意见。但是取消链接应该是可能的,因为我希望数组中有一个具有正确 providerId 的条目。
    • 所以我努力解决这个问题,结果发现这不起作用——当我传入“emailLink”时,取消链接仍然失败。值得注意的是,当我遍历 UserInfo 数组时,只有一个对象,并且它具有提供程序 ID“密码”——这也是使用无密码身份验证链接的。并且“密码”在传递到 unlink 调用时也不起作用。所以我尝试了“emailLink”、“password”、“Firebase”和“firebase”,但它们都以“用户未链接到给定提供商的帐户”而失败。
    • 请注意,我还直接尝试了两个相关变量:来自firebase.google.com/docs/reference/swift/firebaseauth/api/… 的 EmailAuthProviderID ("password") 还有来自 firebase.google.com/docs/reference/swift/firebaseauth/api/… 的 EmailLinkAuthSignInMethod ("emailLink") 不出所料地不起作用,因为这不是提供者 ID。
    • 嗨弗兰克 - 如果您同意这是正确的方法,您是否有机会就这个问题回复 cmets,特别是在上面的赞成答案中? updateEmail 是 Google 认可的方法吗?如果是,您能解释一下如何处理动态链接吗?我们现在已经投入了几个月的时间来使用 Firestore 来实现我们的应用程序,并且被困在这个问题上。
    猜你喜欢
    • 2019-05-20
    • 2018-12-22
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2018-04-01
    • 2020-11-22
    相关资源
    最近更新 更多