我有一个注册表单,允许用户输入他们的凭据(电子邮件、密码等),这应该创建一个 Firebase Auth 帐户,以及 MongoDB 中其他详细信息的记录。 我所需的流程是用户输入详细信息,单击注册按钮,执行以下序列:
POST
请求以将详细信息保存在 MongoDB 中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).
错误?
请尝试以下操作
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
,可能还有其他原因导致错误,但请尝试让我知道。