如何使用 Flutter 成功登录和退出 Firebase?

Posted

技术标签:

【中文标题】如何使用 Flutter 成功登录和退出 Firebase?【英文标题】:How to successfully log in and out of Firebase using Flutter? 【发布时间】:2018-06-17 02:05:49 【问题描述】:

我有一段时间遇到了一个问题,我认为我的范围已缩小到没有完全登录和退出 Firebase;这导致用户并不总是能够访问数据库节点。我有一个主屏幕,可以通过读取应用程序的setState(()); 来读取我的应用程序是否有空的Firebase.instance.currentuser...

 Future <Null> logout() async 

    await FirebaseAuth.instance.signOut();

    setState(()
      FirebaseAuth.instance.currentUser;
    );
  

如果 currentUser == null 相同的页面,即我的 main.dart 页面,则使用不同的构建设置。在我的登录页面上,我正在像这样登录用户......

Future<Null> _google() async 
try 
  await _googleSignIn.disconnect();
  GoogleSignInAccount googleUser = await _googleSignIn.signIn();
  GoogleSignInAuthentication googleAuth = await googleUser.authentication;
  await FirebaseAuth.instance.signInWithGoogle(
      idToken: googleAuth.idToken, accessToken: googleAuth.accessToken);

  Navigator.pushNamed(context, '/menu');
 catch (error) 
  print(error);

       Future<Null> _loginButton() async 

await FirebaseAuth.instance.signOut();
await _googleSignIn.disconnect();

_email = _emailController.text.toString().replaceAll(" ", "");
  _password = _passController.text.toString().replaceAll(" ", "");
  //_username = _nameController.text.toString().replaceAll(" ", "");
  if (_email != null && _password != null) 
    try 
      await FirebaseAuth.instance.signInWithEmailAndPassword(
          email: _email, password: _password);
      final userid = FirebaseAuth.instance.currentUser.uid;

     catch (error) 
      print(error.toString());
    
   else 

  

所有流程都按预期工作,运行 FirebaseAuth.instance.currentuser.uid 返回预期的用户 ID,但它好像数据库只读取原始用户。

安全规则...


  "rules": 
    "$user_id": 
      ".write": true,
      ".read": true
    
  ,

【问题讨论】:

能否请您检查代码缩进并澄清情况?我想我明白了你的意思,但将用户帐户标识为 或 可能有助于更清楚。特别是我不确定“运行 FirebaseAuth.instance.currentuser.uid 会返回预期的用户 ID,但它好像数据库只读取原始用户”是什么意思。 @FabioVeronese 我已经检查并编辑了我的代码缩进。最后一行的意思是 FirebaseAuth.instance.currentUser.uid 返回 的 uid,但我的数据库规则仍然表现得好像 已通过身份验证。我也添加了安全规则。 是什么让你认为你扮演的是 ?如果与安全规则有关,建议您查看我提供的答案 【参考方案1】:

看来您的安全规则存在缺陷。目前,您允许任何用户编辑和读取表 $user_id。

如果您的意思是限制登录用户的访问,其 id 与特定表匹配,我建议如下:

"users": 
  "$uid": 
    ".read": "auth != null && auth.uid == $uid",
    ".write": "auth != null && auth.uid == $uid",
      
   

或类似的,您强制用户身份验证 (auth!=null) 以及每个用户都可以访问和编辑以自己的 uid (auth.uid == $uid) 命名的 users 条目的事实

【讨论】:

以上是关于如何使用 Flutter 成功登录和退出 Firebase?的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中使用firebase登录谷歌时检查用户是新用户还是现有用户?

我是 Flutter Web 的新手,如何使用 Firebase 电话身份验证对用户进行身份验证,有没有办法让用户保持登录状态?

如何通过使用flutter bloc从fire存储中使用依赖注入来处理错误`The getter was called on null`

退出应用时Flutter保存应用的状态(登录首页后应用从登录页面启动)

退出 Flutter 应用程序不会返回登录页面

在 iOS 上退出 Google 登录无法在 Flutter Firebase 中运行