Firebase auth 邮件验证是没用的,因为用户即使不点击确认链接也可以访问应用

Posted

技术标签:

【中文标题】Firebase auth 邮件验证是没用的,因为用户即使不点击确认链接也可以访问应用【英文标题】:Firebase auth email verification is useless because the user can access the app even if he doesn't click the confirmation link 【发布时间】:2021-11-01 03:14:16 【问题描述】:

我正在为我的颤振应用程序上的电子邮件验证而苦苦挣扎。当我尝试实现该功能时,即使用户没有验证他的帐户,他也可以毫无问题地使用他的帐户。我该怎么做才能使用户在未单击确认链接时无法访问该应用程序,从而使人们无法使用他们无权访问的电子邮件?这是代码

//On this file, I store all the login and sign in functionalities:
class AuthService 
  final FirebaseAuth _auth = FirebaseAuth.instance;
  final googleSignIn = GoogleSignIn();

  GoogleSignInAccount? _user;

  // create user object based on firebase user

  Users? _userFromFirebaseUser(User? user) 
    return user != null ? Users(uid: user.uid) : null;
  

  // auth change user stream
  Stream<Users?> get user 
    return _auth.authStateChanges().map(_userFromFirebaseUser);
  
  //register with email & psswrd
  Future registerWithEmailAndPassword(String email, String password) async 
    try 
      UserCredential result = await _auth.createUserWithEmailAndPassword(
          email: email, password: password);

      User? user = result.user;

      return _userFromFirebaseUser(user);
     catch (e) 
      print(e.toString());
      return null;
    
  

  //sign out
  Future signOut() async 
    try 
      return await _auth.signOut();
     catch (e) 
      print(e.toString());
      return null;
    
  

这是 main.dart 文件:

void main() async 
  WidgetsFlutterBinding.ensureInitialized();

  await Firebase.initializeApp();
  runApp(MyApp());


class MyApp extends StatelessWidget 
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) 
    return StreamProvider<Users?>.value(
      initialData: null,
      value: AuthService().user,
      child: MaterialApp(
        home: Wrapper(),
      ),
    );
  

包装文件引导至认证页面或主页:

class Wrapper extends StatelessWidget 
  const Wrapper(Key? key) : super(key: key);

  @override
  Widget build(BuildContext context) 
    final user = Provider.of<Users?>(context);

    //return either home or authenticate
    if (user == null) 
      return Authenticate();
     else 
      return Home();
    
  

【问题讨论】:

【参考方案1】:

电子邮件验证与帐户创建本身无关,而不是验证用户不是垃圾邮件用户。您可以检查用户的电子邮件是否已像 FirebaseAuth.instance.currentUser.emailVerified 这样验证,这将返回 bool,然后您可以相应地规划您的应用流程。

【讨论】:

问题是即使该邮箱的假用户无法访问该账户,该账户仍然存在。所以当真正的用户尝试注册时,他将无法注册,因为firebase已经注册了这个账号 我明白你的意思,在这里查看***.com/questions/64468970/…,接受的答案最有可能是你要找的。​​span>

以上是关于Firebase auth 邮件验证是没用的,因为用户即使不点击确认链接也可以访问应用的主要内容,如果未能解决你的问题,请参考以下文章

Firebase Auth 为同一电子邮件创建重复用户

如何检查用户是否允许或禁止Facebook身份验证 - Firebase中的电子邮件

如何在 Firebase 中收到电子邮件验证通知?

Firebase Auth - createUserWithEmailAndPassword() - 在验证电子邮件之前阻止登录

Firebase Auth - 更新用户的电子邮件后,Firebase Auth 会注销用户

firebase.auth().onAuthStateChanged 不工作