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

如何创建带验证码的Firebase动态链接实现Flutter应用内密码重置

Flutter + Firebase 应用内自定义密码重置功能实现指南

你当前自定义随机验证码的方案属于过度设计,Firebase本身已经提供了安全的用户识别机制,无需额外自行生成校验码。Firebase在发送密码重置邮件时会自动生成和用户重置请求唯一绑定的oobCode(操作授权码),自带过期、防篡改校验逻辑,你只需要通过actionCodeSettings配置跳转逻辑即可,具体实现步骤如下:

1. 配置密码重置邮件的跳转参数

你确实需要使用actionCodeSettings参数,该参数用于告知Firebase生成可跳转回应用的动态链接,无需提前自行调用动态链接生成方法,Firebase会自动完成动态链接拼接和参数追加。
修改你的_handleLookupRequest方法如下:

void _handleLookupRequest() async {
  // 输入校验逻辑保持不变
  LoadingIndicatorDialog dialog = LoadingIndicatorDialog();
  dialog.setContext(context);
  dialog.show(context);

  // 新增跳转配置
  ActionCodeSettings actionCodeSettings = ActionCodeSettings(
    // 填写你动态链接对应的重置密码路径,Firebase会自动追加oobCode、邮箱等参数
    url: "https://myapp.page.link/reset-password",
    handleCodeInApp: true,
    // 安卓配置和你之前动态链接的参数保持一致
    androidPackageName: "com.myapp.client.my_app_frontend",
    androidMinimumVersion: "1",
    // 如果有iOS端,补充对应的iOS包配置即可
    // iOSBundleId: "com.myapp.client.myAppFrontend",
  );

  final FirebaseAuth auth = FirebaseAuth.instance;
  await auth.sendPasswordResetEmail(
      email: email,
      actionCodeSettings: actionCodeSettings
  ).then((user) {
    dialog.dismiss();
    Navigator.of(context).pop();
  }).catchError((error) {
    dialog.dismiss();
    String errorType = Errorparser().parseFirebaseAuthErrorType(error);
    NotificationDialog().show(
        context,
        errorType,
        Errorparser().parseFirebaseAuthErrorMessage(error)
    );
  });
}

2. 配置Firebase控制台授权域名

登录Firebase控制台,进入Authentication > 设置 > 授权域名,将你的动态链接域名myapp.page.link添加到授权列表中,否则Firebase会拒绝生成对应的重置链接。

3. 应用内监听动态链接跳转

在应用的入口页面(比如主页、登录页)添加动态链接监听逻辑,收到密码重置链接后跳转至你的自定义密码重置页面:

@override
void initState() {
  super.initState();
  // 监听应用在前台时的动态链接跳转
  FirebaseDynamicLinks.instance.onLink.listen((dynamicLinkData) {
    final Uri deepLink = dynamicLinkData.link;
    // 判断是否为密码重置链接
    if (deepLink.path == '/reset-password') {
      // 取出Firebase自动追加的授权码
      final String? oobCode = deepLink.queryParameters['oobCode'];
      if (oobCode != null) {
        // 跳转至自定义重置页面,将oobCode作为参数传递
        Navigator.push(context, MaterialPageRoute(
          builder: (context) => CustomResetPasswordPage(oobCode: oobCode)
        ));
      }
    }
  }).onError((error) {
    // 自定义动态链接解析错误处理逻辑
  });

  // 监听应用在后台时被动态链接唤起的场景
  FirebaseDynamicLinks.instance.getInitialLink().then((dynamicLinkData) {
    if (dynamicLinkData != null) {
      final Uri deepLink = dynamicLinkData.link;
      if (deepLink.path == '/reset-password') {
        final String? oobCode = deepLink.queryParameters['oobCode'];
        if (oobCode != null) {
          Navigator.push(context, MaterialPageRoute(
            builder: (context) => CustomResetPasswordPage(oobCode: oobCode)
          ));
        }
      }
    }
  });
}

4. 自定义重置页面实现密码更新

在你的自定义密码重置页面,用户输入新密码后调用Firebase的密码重置接口完成操作:

void _submitNewPassword(String oobCode, String newPassword) async {
  try {
    final auth = FirebaseAuth.instance;
    // 先校验oobCode是否合法、未过期
    await auth.verifyPasswordResetCode(oobCode);
    // 校验通过后提交新密码完成重置
    await auth.confirmPasswordReset(
      code: oobCode,
      newPassword: newPassword
    );
    // 重置成功后跳转至登录页即可
    Navigator.pushReplacementNamed(context, '/login');
  } catch (e) {
    // 处理错误,比如oobCode过期、无效,新密码不符合强度要求等
    String errorMsg = Errorparser().parseFirebaseAuthErrorMessage(e);
    NotificationDialog().show(context, '重置失败', errorMsg);
  }
}

补充说明

如果你需要自定义密码重置邮件的内容,可以在Firebase控制台Authentication > 模板中修改密码重置邮件的模板,支持使用系统占位符替换链接、用户名等信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 23:06:07