Firebase 与 next js 身份验证流程出现问题:未经验证的电子邮件触发“auth/email-already-in-use”错误

问题描述 投票:0回答:1

我在 Next.js 应用程序中使用 Firebase 身份验证实现用户注册时遇到了一个令人费解的问题。具体来说,当尝试使用未经验证的电子邮件地址注册新用户时,代码会错误地进入 catch 块并触发“auth/email-already-in-use”错误,而不是执行发送电子邮件验证的预期流程。

背景:

我正在使用 Next.js 进行 Web 应用程序开发。 Firebase 身份验证已集成到我的 Next.js 应用程序中来处理用户注册。 注册过程涉及使用电子邮件和密码创建新用户。 成功注册后,应向用户发送一封电子邮件验证。 问题:

当尝试使用未经验证的电子邮件地址注册新用户时,代码会错误地进入 catch 块并触发“auth/email-already-in-use”错误。 此行为是意外的,因为电子邮件尚未使用;它只需要验证。 预期行为:

使用未经验证的电子邮件地址注册新用户时,代码应发送电子邮件验证,而不会触发“auth/email-already-in-use”错误。 所做的尝试:

我已验证 Firebase 项目设置是否已正确配置为允许未经验证的用户。 我已查看 Firebase 身份验证文档,并确保代码遵循处理电子邮件验证的最佳实践。

    const handleRegistration = async (registerData: FormData) => {
  setIsLoading(true);
  try {
    const app = initializeApp(fireconfig);

    const auth = getAuth(app);

    if (registerData.password.length < 8) {
      setPasswordErrorMessage("Password must have at least 8 characters. ");
      return;
    }

    if (passwordErrorMessage !== "") {
      setPasswordErrorMessage("");
    }

    const userCredential: any = await createUserWithEmailAndPassword(
      auth,
      registerData.email,
      registerData.password
    );
    if (!userCredential.user.emailVerified) {
      // Send email verification
      await sendEmailVerification(userCredential.user);
      toast({
        title: "Email Verification Sent. Please verify your email.",
        status: "success",
        position: "top",
        duration: null,
        isClosable: true,
      });

      const userDocRef = doc(db, "users", userCredential.user.uid);

      // Check if the user already exists in the 'users' collection
      const userDocSnapshot = await getDoc(userDocRef);

      if (!userDocSnapshot.exists()) {
        const userData = {
          firstName: registerData.firstName,
          lastName: registerData.lastName,
          email: registerData.email,
        };

        await setDoc(userDocRef, userData);
        router.push("/login");
        return;
      }
    }
  } catch (error: any) {
    if (error.code === "auth/email-already-in-use") {
      setErrorMessage("That username is taken. Try another");
    }
  } finally {
    setIsLoading(false);
  }
};
javascript firebase next.js firebase-authentication email-verification
1个回答
0
投票

听起来该电子邮件地址已通过 Firebase 身份验证注册。

使用已注册的电子邮件地址调用

createUserWithEmailAndPassword
会引发您收到的
auth/email-already-in-use
错误。这是预期的行为,因为
createUserWithEmailAndPassword
只能用于初始注册用户。之后,您应该使用
signInWithEmailAndPassword
来登录。

© www.soinside.com 2019 - 2024. All rights reserved.