首页 > 解决方案 > Flutter Web/Firebase - 在浏览器中按回绕过验证过程

问题描述

当我的用户注册时,我将他们引导到一个页面,通知他们在继续之前需要验证他们的电子邮件:

在此处输入图像描述

这是我的验证屏幕代码:

  class VerifyScreen extends StatefulWidget {
  @override
  _VerifyScreenState createState() => _VerifyScreenState();
}

class _VerifyScreenState extends State<VerifyScreen> {
  final auth = FirebaseAuth.instance;
  User user;

  Timer timer;

  @override
  void initState() {
    user = auth.currentUser;
    user.sendEmailVerification();

    timer = Timer.periodic(
      Duration(seconds: 5),
      (timer) {
        checkEmailVerified();
      },
    );
    super.initState();
  }

  @override
  void dispose() {
    timer.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Container(
          height: MediaQuery.of(context).size.height * 0.8,
          width: MediaQuery.of(context).size.width * 0.8,
          child: Text(
              "An email has been sent to ${user.email} please verify before proceeding"),
        ),
      ),
    );
  }

  Future<void> checkEmailVerified() async {
    user = auth.currentUser;
    await user.reload();

    if (user.emailVerified) {
      Navigator.of(context).pushReplacement(
        MaterialPageRoute(
          builder: (context) => OurHomePage(),
        ),
      );
      timer.cancel();
    }
  }
}

问题陈述:当我在我的 chrome 浏览器上按下后退箭头时:

在此处输入图像描述

我返回到我的主页,用户登录了我不想要的用户。我希望我的用户在能够继续之前验证他们的电子邮件。这是我在不验证电子邮件的情况下按下返回按钮后主页上的抽屉:

在此处输入图像描述

我使用提供者在我的应用程序周围传递我的用户对象。这是我的 main.dart:

  void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(
    MultiProvider(
      providers: [
        Provider(
          create: (_) => FirebaseAuthService(),
        ),
        StreamProvider<OurUser>(
            create: (context) =>
                context.read<FirebaseAuthService>().onAuthStateChanged),
      ],
      child: MaterialApp(theme: OurTheme().buildTheme(), home: OurHomePage()),
    ),
  );
}

然后我用户 Consumer 在我的主页上使用该提供程序:

class OurHomePage extends StatefulWidget {
  @override
  _OurHomePageState createState() => _OurHomePageState();
}

class _OurHomePageState extends State<OurHomePage> {
  @override
  Widget build(BuildContext context) {
    return Consumer<OurUser>(
      builder: (_, user, __) {
        return ChangeNotifierProvider<SignInViewModel>(
          create: (_) => SignInViewModel(context.read),
          builder: (_, child) {
            return Scaffold(appBar: AppBar(title: Text("My Homepage")));
          },
        );
      },
    );
  }
}

谁能帮我解决我面临的问题?提前致谢。

标签: firebaseflutterdartwebfirebase-authentication

解决方案


在主页上检查用户是否登录以及何时登录,检查他是否已验证电子邮件。如果他有,让他进来,否则给他一些信息。


推荐阅读