无法使用电子邮件/密码注册(Firebase NodeJS SDK)

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

我有一个注册表单,允许用户输入他们的凭据(电子邮件、密码等),这应该创建一个 Firebase Auth 帐户,以及 MongoDB 中其他详细信息的记录。 我所需的流程是用户输入详细信息,单击注册按钮,执行以下序列:

  1. 首先发出
    POST
    请求以将详细信息保存在 MongoDB 中
  2. createUserWithEmailAndPassword
    方法由
    getAuth()
    提供。在实际创建帐户之前,我还使用从 Firebase Functions 中的
    beforeUserCreated
    导入的
    beforeUserSignedIn
    firebase-functions/v2/identity
    方法来修改所创建帐户的声明。

我最近不断收到错误,并且错误日志对我没有多大帮助。即使

signInWithGoogle
在浏览器中也会出现同样的错误:

错误:

FirebaseError: Firebase: Error (auth/error-code:-47).
    at Tn (assert.ts:136:55)
    at vn (assert.ts:65:9)
    at Mn (index.ts:210:9)
    at async Rn (index.ts:231:9)
    at async ai (email_and_password.ts:283:9)

这是用户身份验证的代码:

EmailSignUp 函数处理电子邮件/密码帐户的表单提交:

function emailSignUp(event) {
        setSignUpClicked(true);
        event.preventDefault();
        if (password !== confirmPassword) {
            console.log("Passwords do not match!");
            setSignUpClicked(false);
            return;
        }

        // let files = document.querySelector('input[type="file"]').files;
        let formData = new FormData(document.getElementById("emailSignUp"));

        fetch(`${process.env.REACT_APP_DEPLOYED_API_URL}/auth/user/register`, {
            method: "POST",
            body: formData,
        })
            .then((response) => response.json())
            .then((data) => {
                if (data.status === "error") {
                    setStatus("failure");
                    setSignUpClicked(false);
                    throw new Error("Invalid form input. Please check again.");
                } else {
                    // fix auth-function deadline error by maybe creating firebase user first.
                    createUserWithEmailAndPassword(auth, email, password)
                        .then((userCredential) => {
                            // Signed Up
                            setStatus("success");
                            setSignUpClicked(false);
                            setShowMyModal(true);
                        })
                        .catch((error) => {
                            const errorCode = error.code;
                            const errorMessage = error.message;
                            setStatus("failure");
                            setSignUpClicked(false);
                            console.log(error);
                        });
                    console.log("Success:", data);
                }
            })
            .catch((error) => {
                setStatus("failure");
                setSignUpClicked(false);
                console.error("Error:", error);
            });

        /* 
            
             */
    }

index.js(Firebase 函数)

export const beforecreated = beforeUserCreated(async (event) => {
    try {
        const email = event.data.email;
        const checkUser = await User.findOne({ email: event.data.email });

        //when sign in with google is clicked
        if (event.additionalUserInfo.providerId === "google.com") {
            const checkOrg = await Organization.findOne({ email });
            if (checkUser) {
                return {
                    displayName: checkUser.name,
                    customClaims: {
                        role: "user",
                        userId: checkUser._id,
                    },
                };
            } else if (checkOrg) {
                return {
                    displayName: checkUser.name,
                    customClaims: {
                        role: "org",
                        orgId: checkUser._id,
                    },
                };
            } else {
                //google sign in and user not in db
                //create user in db
                const name = event.data.displayName;
                const email = event.data.email;
                const photoURL = event.data.photoURL;

                const response = await fetch(photoURL);
                const buffer = await response.arrayBuffer();
                console.log("BUFFER: ", buffer);
                const storagePath = `user/${email}/profile.jpeg`;
                const storageRef = ref(storage, storagePath);
                const metadata = {
                    contentType: "image/jpeg",
                };
                const snapshot = await uploadBytesResumable(
                    storageRef,
                    buffer,
                    metadata
                );
                if (snapshot.state === "success") {
                    const user = await User.create({
                        name,
                        email,
                        photoPathFirestore: storagePath,
                    });
                    console.log("Successfully created new user in DB!");
                    return {
                        displayName: user.name,
                        customClaims: {
                            role: "user",
                            userId: user._id,
                        },
                    };
                } else {
                    throw new Error("Error occurred while creating User");
                }
            }
        } else {
            //email/password sign in
            if (checkUser) {
                return {
                    customClaims: {
                        role: "user",
                    },
                };
            }
            return {
                customClaims: {
                    role: "org",
                },
            };
        }
    } catch (err) {
        throw new Error(err);
    }
});

export const beforesignin = beforeUserSignedIn(async (event) => {
    try {
        const email = event.data.email;
        const checkUser = await User.findOne({ email });

        if (checkUser) {
            return {
                displayName: checkUser.name,
                customClaims: {
                    role: "user",
                    userId: checkUser._id,
                },
            };
        } else {
            const checkOrg = await Organization.findOne({ email });
            return {
                displayName: checkOrg.name,
                customClaims: {
                    role: "org",
                    orgId: checkOrg._id,
                },
            };
        }
    } catch (err) {
        console.log(err);
        throw new Error(err);
    }
});

api/user/register
在数据库中创建用户

router.post("/register", async (req, res) => {
    try {
        const { name, email, phone } = req.body;

        //email variable, update record in DB
        if (!name || !email) {
            throw new Error(
                "Following fields are mandatory: name, email, password, photo"
            );
        } else {
            if (!req.files[0]) {
                throw new Error(
                    "Following fields are mandatory: name, email, password, photo"
                );
            }
            const file = req.files[0];
            const filename = file.originalname;
            const extension = filename.split(".").pop();
            if (
                extension !== "png" &&
                extension !== "jpg" &&
                extension !== "jpeg"
            ) {
                response_400(
                    res,
                    "Invalid file format. Only .jpg, .png, .jpeg files are allowed"
                );
            } else {
                // Resize image and get extension
                Jimp.read(file.buffer)
                    .then((image) => {
                        // Convert the image to JPEG with quality 100 (you can adjust the quality as needed)
                        return image
                            .quality(100)
                            .getBufferAsync(Jimp.MIME_JPEG);
                    })
                    .then(async (jpegBuffer) => {
                        console.log("Image converted successfully!");
                        // Now you have the converted buffer (jpegBuffer) that you can use

                        const pathToFile = `user/${email}/profile.jpeg`;
                        const storageRef = ref(storage, pathToFile);

                        const metadata = {
                            contentType: "image/jpeg",
                        };

                        const snapshot = await uploadBytesResumable(
                            storageRef,
                            jpegBuffer,
                            metadata
                        );
                        if (snapshot.state === "success") {
                            const user = await User.create({
                                name,
                                email,
                                photoPathFirestore: pathToFile,
                                phone,
                            });
                            console.log("Successfully created new user in DB!");
                            response_200(
                                res,
                                "Successfully created new user in DB"
                            );
                        } else {
                            response_500(
                                res,
                                "Error occurred while uploading user file"
                            );
                        }
                    })
                    .catch((err) => {
                        console.error("Error converting image:", err);
                        response_500(res, "Error converting image");
                    });
            }
        }
    } catch (err) {
        console.log(err);
        res.send(err);
    }
});

如何消除

FirebaseError: Firebase: Error (auth/error-code:-47).
错误?

reactjs firebase firebase-authentication google-cloud-functions
1个回答
0
投票

请尝试以下操作

function emailSignUp(event) {
    setSignUpClicked(true);
    event.preventDefault();
    if (password !== confirmPassword) {
        console.log("Passwords do not match!");
        setSignUpClicked(false);
        return;
    }

    createUserWithEmailAndPassword(auth, email, password)
        .then((userCredential) => {
            // here signed Up then rest of the code flow
            setStatus("success");
            setSignUpClicked(false);
            setShowMyModal(true);

            let formData = new FormData(document.getElementById("emailSignUp"));

            fetch(`${process.env.REACT_APP_DEPLOYED_API_URL}/auth/user/register`, {
                method: "POST",
                body: formData,
            })
                .then((response) => response.json())
                .then((data) => {
                    if (data.status === "error") {
                        setStatus("failure");
                        throw new Error("Invalid form input. Please check again.");
                    } else {
                        console.log("Success:", data);
                    }
                })
                .catch((error) => {
                    setStatus("failure");
                    console.error("Error:", error);
                });
        })
        .catch((error) => {
            const errorCode = error.code;
            const errorMessage = error.message;
            setStatus("failure");
            setSignUpClicked(false);
            console.log(error);
        });
}

这里我移动了所有代码,包括

fetch
中的
createUserWithEmailAndPassword
,可能还有其他原因导致错误,但请尝试让我知道。

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