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

Firebase Auth修改密码遇user-token-expired错误的原因与解决方法

问题描述

我通过TextFormField获取用户新密码,调用Firebase Auth的updatePassword方法修改密码时,遇到以下错误:

FirebaseAuthException ([firebase_auth/user-token-expired] 用户的凭证已不再有效,用户必须重新登录。)

相关代码如下:

TextFormField(
  controller: _passwordController,
  obscureText: true,
  decoration: InputDecoration(
    border: OutlineInputBorder(
      borderRadius: BorderRadius.circular(20),
    ),
  ),
),
// ...
FirebaseAuth.instance.currentUser!.updatePassword(_passwordController.text).then((value) {
        }).catchError((e) {
          ModernAlert(
            context,
            "Hata",
            "Bir hata meydana geldi. Lütfen daha sonra tekrar deneyin.",
            "Tamam",
            () {},
          );
        });

错误成因

Firebase Auth的updatePassword属于敏感操作,要求用户的会话凭证处于活跃状态(即近期完成过登录,令牌未过期)。如果用户登录后长时间未操作,或设备上的Auth令牌已过期,调用该方法会触发user-token-expired错误——这是Firebase的安全机制,防止过期令牌被滥用,确保操作是用户本人发起。

解决方法

1. 先重新验证用户身份

在调用updatePassword前,必须让用户再次验证当前身份(比如输入旧密码),通过reauthenticateWithCredential更新会话令牌:

// 新增一个TextFormField用于接收用户当前密码
final oldPasswordController = TextEditingController();

// 完整修改密码逻辑
final user = FirebaseAuth.instance.currentUser;
if (user != null) {
  try {
    // 生成身份验证凭证
    final credential = EmailAuthProvider.credential(
      email: user.email!,
      password: oldPasswordController.text,
    );
    // 重新验证用户
    await user.reauthenticateWithCredential(credential);
    // 验证成功后修改密码
    await user.updatePassword(_passwordController.text);
    // 这里添加密码修改成功后的逻辑(比如弹窗提示)
  } on FirebaseAuthException catch (e) {
    switch(e.code) {
      case 'wrong-password':
        // 处理旧密码输入错误的情况
        break;
      case 'user-token-expired':
        // 处理令牌过期,引导用户重新登录
        break;
      default:
        // 其他错误处理
        break;
    }
  }
}

2. 优化错误提示

把通用错误提示改成针对性内容,让用户清楚问题原因:

catchError((e) {
  String title = "Hata";
  String message = "Bir hata meydana geldi. Lütfen daha sonra tekrar deneyin.";
  
  if (e is FirebaseAuthException) {
    if (e.code == 'user-token-expired') {
      message = "Oturumunuz süresi doldu. Lütfen tekrar giriş yapın.";
    } else if (e.code == 'wrong-password') {
      message = "Mevcut şifreniz yanlış.";
    }
  }
  
  ModernAlert(
    context,
    title,
    message,
    "Tamam",
    () {},
  );
});

3. 提前检查令牌状态(可选)

可以主动检查令牌是否过期,提前引导用户重新登录:

final user = FirebaseAuth.instance.currentUser;
if (user != null) {
  final tokenResult = await user.getIdTokenResult();
  if (tokenResult.expirationTime.isBefore(DateTime.now())) {
    // 令牌已过期,触发重新登录流程
  }
}

内容的提问来源于stack exchange,提问作者Emir Bolat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 21:54:16