在 Firebase 管理中验证无密码电子邮件注册

2024-05-01

我试图让我的应用程序的用户通过电子邮件+链接登录,无需密码。客户端(用 React Native 编写)使用 Javascript SDK 请求登录链接,如下所示,基于这个答案 https://stackoverflow.com/questions/61564203/how-to-setup-sendsigninlinktoemail-from-firebase-in-react-native:

  var actionCodeSettings = {
    // URL you want to redirect back to. The domain (www.example.com) for this
    // URL must be in the authorized domains list in the Firebase Console.
    url: `${BASE_URL}/verifyEmail?email=${email}`,
    // This must be true.
    handleCodeInApp: true,
    iOS: {
      bundleId: BUNDLE_ID
    },
    android: {
      packageName: BUNDLE_ID,
      installApp: true,
      minimumVersion: '12'
    },
    dynamicLinkDomain: 'myapp.page.link'
  };
  await firebase.auth().sendSignInLinkToEmail(email, actionCodeSettings)
}

然后用户打开电子邮件并点击登录链接。理想情况下,它会深层链接回应用程序,但如果这种情况没有发生(例如,他们在不同的设备上进行操作),我仍然需要它来验证他们在我的服务器(即 NodeJS)上的电子邮件地址。我的/verifyEmail处理程序应该这样做。根据这个答案 https://stackoverflow.com/a/63224156/14995204,Firebase 管理 SDK 无法再验证操作代码。它建议使用Firebase 管理 REST API https://firebase.google.com/docs/reference/rest/auth#section-confirm-email-verification,它表示要有效地执行以下操作:

curl 'https://identitytoolkit.googleapis.com/v1/accounts:update?key=AIzaSyCrFbTvuObVGlmGv9MK2sZ9MyS-VCkN--8' \
-H 'Content-Type: application/json' --data-binary '{"oobCode":"9LRoycB4fFrycmyLreYnjcAzxsGnwIpd9ub5tkpX_EQAAAF2-d9GoQ"}'

但我越来越INVALID_OOB_CODE因此。为了进行测试,我将电子邮件链接中的 OOB 代码直接复制到 cURL 命令中,而无需单击它。

我究竟做错了什么?查看 Javascript 客户端 SDK 的源代码,似乎 applyActionCode 以相同的方式调用我在这里调用的相同端点。我想也许这个方法只适用于验证电子邮件/密码注册,但如果是这样,我如何在没有密码的情况下注册某人?

我能想到的唯一解决方法是/verifyEmail对 oobCode 进行哈希处理,将哈希值截断为用户友好的验证码,将验证链接存储在服务器端,并要求用户在应用程序中输入该代码以检索要使用的验证链接EmailAuthProvider.credentialWithLink。如果时间过长则拒绝。这是不可取的。


我最终采用了帖子最后一段中提到的解决方法。它有效,但一个缺点是用户必须复制代码。它是经过哈希处理并截断为 6 位十六进制字符串的 oobCode SHA256。由于我的过期时间为 5 分钟,攻击者必须16^6 / (5 * 60) = ~55924每秒猜测破解它。对于我的应用来说已经足够好了;这不是一个高风险的情况。

Firebase 确实需要让这变得更容易。我应该能够在我的后端调用他们的 API 来检查电子邮件验证码的有效性。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Firebase 管理中验证无密码电子邮件注册 的相关文章

随机推荐