坚持用户Auth Flutter Firebase

时间:2019-01-31 21:01:57

标签: firebase flutter firebase-authentication

我正在将Firebase Auth与Google登录Flutter一起使用。我可以登录,但是当我关闭该应用程序(杀死它)时,我必须再次重新注册。那么,有没有一种方法可以坚持用户身份验证,直到用户明确注销为止? 这是我的认证课程

POST: https://vision.googleapis.com/v1/images:annotate?key=<MY_KEY>

BODY:

{
  "requests": [
    {
      "image": {
        "content": "...base64-encoded-image-content..."
      },
      "features": [
        {
          "type": "TEXT_DETECTION"
        }
      ]
    }
  ]
}

这是我的起始页,其中会调用auth检查。

import 'package:firebase_auth/firebase_auth.dart';
import 'package:google_sign_in/google_sign_in.dart';

class Auth {
  FirebaseAuth _firebaseAuth;
  FirebaseUser _user;

  Auth() {
    this._firebaseAuth = FirebaseAuth.instance;
  }

  Future<bool> isLoggedIn() async {
    this._user = await _firebaseAuth.currentUser();
    if (this._user == null) {
      return false;
    }
    return true;
  }

  Future<bool> authenticateWithGoogle() async {
    final googleSignIn = GoogleSignIn();
    final GoogleSignInAccount googleUser = await googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;
    this._user = await _firebaseAuth.signInWithGoogle(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    if (this._user == null) {
      return false;
    }
    return true;
    // do something with signed-in user
  }
}

6 个答案:

答案 0 :(得分:4)

我相信您的问题是路由。在我的应用程序中,我使用FirebaseAuth,它的工作原理与您所说的一样,并且我不保留任何登录令牌。但是,我不知道为什么您使用getUser的方法行不通。

尝试调整您的代码以使用onAuthStateChanged

基本上,在您的MaterialApp,创建一个StreamBuilder_auth.onAuthStateChanged并根据验证情况选择你的页面。

See this link,有一个很好的例子。

答案 1 :(得分:1)

添加此代码。应该可以。

FirebaseAuth auth = FirebaseAuth.instance;

auth.setPersistence(Persistence.SESSION);

答案 2 :(得分:1)

void main() {
FirebaseAuth.instance.authStateChanges().listen((User user) {
  if (user == null) {
          runApp(MyApp(auth : false);
        } else {
          runApp(MyApp(auth : false);
       }
    });
}

class MyApp extends StatefulWidget {
  final bool auth;
  MyApp({this.auth});
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  return MaterialApp(
  ......
  ......
  home: widget.auth ? MainScreen() : AuthScreen();
);

答案 3 :(得分:0)

即使您终止了该应用程序,也可以使用shared_preferences来保持会话状态。 这是文档https://pub.dartlang.org/packages/shared_preferences

我还听说可以使用sqlite来保持会话状态。

答案 4 :(得分:0)

对不起,这是我的错误。忘记将推送登录屏幕放在其他位置。

  Future<void> _handleStartScreen() async {
    Auth _auth = Auth();
    if (await _auth.isLoggedIn()) {
      Navigator.of(context).pushReplacementNamed("/chat");
    }
    else {
        Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => LoginScreen(auth: _auth,)));
    }
  }

答案 5 :(得分:0)

你可以使用我的代码,你可以使用 userChanges() 而不是 authStateChanges()

通知有关任何用户更新的更改。

这是 [authStateChanges] 和 [idTokenChanges] 的超集。它提供有关所有用户更改的事件,例如何时链接、取消链接以及何时对用户配置文件进行更新。此 Stream 的目的是监听用户状态(登录、退出、不同用户和令牌刷新)的实时更新,而无需手动调用 [reload],然后再对您的应用程序进行更改。

final Stream<User?> firebaseUserChanges = firebaseAuth.userChanges();