Firebase Authentication修改密码失败:CREDENTIAL_TOO_OLD_LOGIN_AGAIN报错
修改密码触发CREDENTIAL_TOO_OLD_LOGIN_AGAIN错误的解决方案
错误原因
CREDENTIAL_TOO_OLD_LOGIN_AGAIN是Firebase Auth的安全限制:当用户登录会话持续时间过长,当前的用户凭证已失效,直接调用updatePassword会被拒绝,必须先重新验证用户身份。
当前问题代码
const handleChangePassword = async (values) => { setLoadingOnSubmit(true); const { passwordBaru } = values; const user = auth.currentUser; const newPassword = passwordBaru; try { await updatePassword(user, newPassword); const foundUser = Object.values(data).find((user) => user.uid === currentUser.uid); if (foundUser) { const id = Object.keys(data).find((key) => data[key] === foundUser); try { await axios.patch(`${apiDev}/data-pengguna/${id}.json`, { password: newPassword, }); message.success("Password berhasil di ganti"); navigate('/profile') } catch (error) { message.error("Gagal mengganti password"); } } } catch (error) { message.error("Tidak dapat mengganti password"); } finally { setLoadingOnSubmit(false); } };
修改后的解决方案代码
需要先通过用户当前密码重新验证身份,再执行密码修改操作:
import { reauthenticateWithCredential, EmailAuthProvider } from "firebase/auth"; const handleChangePassword = async (values) => { setLoadingOnSubmit(true); // 从表单获取旧密码和新密码字段 const { passwordLama, passwordBaru } = values; const user = auth.currentUser; try { // 生成身份验证凭证 const credential = EmailAuthProvider.credential( user.email, passwordLama ); // 重新验证用户身份 await reauthenticateWithCredential(user, credential); // 修改Firebase Auth中的密码 await updatePassword(user, passwordBaru); // 更新数据库中的密码记录 const foundUser = Object.values(data).find((item) => item.uid === currentUser.uid); if (foundUser) { const id = Object.keys(data).find((key) => data[key] === foundUser); await axios.patch(`${apiDev}/data-pengguna/${id}.json`, { password: passwordBaru, }); message.success("密码修改成功"); navigate('/profile'); } } catch (error) { // 针对性处理错误提示 if (error.code === 'auth/credential-too-old-login-again') { message.error("登录状态已过期,请输入当前密码重新验证"); } else { message.error("密码修改失败"); } } finally { setLoadingOnSubmit(false); } };
额外注意事项
- 前端表单需新增旧密码输入字段,让用户提供当前密码用于重新验证
- 重新验证是Firebase的强制安全机制,避免长时间登录的账户被恶意篡改
内容的提问来源于stack exchange,提问作者Aya
相关产品推荐
相关产品推荐

