我在
"firebase": "^10.13.0"
和 next.js 14.2
中使用 typescript
进行用户身份验证。
我无法更新用户密码,因为即使在重新身份验证后,我仍然不断收到
auth/requires-recent-login
错误。
我认为重新验证后,用户在上次登录再次“太久以前”之前至少有一分钟的时间来更新密码。
我现在在成功重新验证后直接调用 updatePassword 函数,但即使这样也不起作用。
这是我的工作流程:
updateUserPassword
:
function updateUserPassword(password: string): void {
const auth = getAuth();
const user = auth.currentUser;
if (user) {
updatePassword(user, password)
.then(() => {
console.log("Password updated!");
})
.catch((error: Error) => {
console.log("Error updateUserPassword: " + error.message);
if (error.message.includes("auth/requires-recent-login")) {
console.log("reauthUser");
reauthUser(password);
}
});
} else {
console.log("User is not authenticated");
}
}
reauthUser
:
const reauthUser = async (password: string): Promise<void> => {
const auth = getAuth();
if (auth.currentUser) {
const providerId = auth.currentUser.providerData[0]?.providerId;
console.log("providerId: ", providerId);
if (providerId === "google.com") {
await reauthWithGoogle();
updatePassword(auth.currentUser, password)
.then(() => {
console.log("Password updated!");
})
.catch((error: Error) => {
console.log(
"Error updateUserPassword in reauthUser: " + error.message,
);
});
} else {
alert("Unsupported authentication provider.");
}
} else {
router.push(ROUTES.signin);
}
};
reauthWithGoogle
const reauthWithGoogle = async (): Promise<void> => {
const auth = getAuth();
googleProvider.setCustomParameters({ prompt: "select_account" });
if (auth.currentUser) {
reauthenticateWithPopup(auth.currentUser, googleProvider)
.then(async (result) => {
console.log("reauthenticateWithPopup");
})
.catch((error) => {
alert("Error reauthenticateWithPopup: " + error.message);
});
} else {
router.push(ROUTES.signin);
}
};
当涉及到 Firebase 身份验证 时,有一些操作可以被视为敏感。例如,更改(更新)用户密码“确实”是一项安全敏感操作,需要用户最近登录。所以每次需要执行此类操作时,都应该重新验证用户身份。 有两种解决方案可以帮助您解决此问题,您可以通过要求凭据而不注销来重新验证用户,也可以注销用户并让用户再次进行身份验证。