我在 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);
}
};
听起来该电子邮件地址已通过 Firebase 身份验证注册。
使用已注册的电子邮件地址调用
createUserWithEmailAndPassword
会引发您收到的 auth/email-already-in-use
错误。这是预期的行为,因为 createUserWithEmailAndPassword
只能用于初始注册用户。之后,您应该使用 signInWithEmailAndPassword
来登录。