You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 04:46:33