我试图让我的应用程序的用户通过电子邮件+链接登录,无需密码。客户端(用 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
。如果时间过长则拒绝。这是不可取的。