过期后如何在Flutter应用程序中更新Firebase令牌并将其存储?

时间:2019-01-20 18:18:25

标签: android firebase flutter firebase-authentication

我是在首次启动应用程序时通过google创建身份验证的,并且我有自己的_authenticatedUser,用于存储用户令牌以用于进一步的请求。

final FirebaseAuth firebaseAuth = FirebaseAuth.instance;
  final GoogleSignIn googleSignIn = GoogleSignIn();

  Future<String> signInGoogle() async {
    GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
    GoogleSignInAuthentication gsa = await googleSignInAccount.authentication;

    FirebaseUser user = await firebaseAuth.signInWithGoogle(
        idToken: gsa.idToken, accessToken: gsa.accessToken);
    var token = await user.getIdToken();
    _authenticatedUser = User(id: user.uid, email: user.email, token: token, photo: user.photoUrl);
    SharedPreferences prefs = await SharedPreferences.getInstance();
    prefs.setString('loggedin', 'Google');
    prefs.setString('token', token);
    prefs.setString('userEmail', user.email);
    prefs.setString('userId', user.uid);
    prefs.setString('userImage', user.photoUrl);
    return 'okay';
  }

然后我在getCurrentUser()中调用initState()函数来检查用户是否在那里,但是当令牌过期时,我会得到错误的用户令牌。

  Future<FirebaseUser> getCurrentUser() async {
    FirebaseUser user = await FirebaseAuth.instance.currentUser();

    if (user != null) {
      print('signed in');
      SharedPreferences prefs = await SharedPreferences.getInstance();
      String token = prefs.getString('token');
      String uid = prefs.getString('userId');
      String email = prefs.getString('userEmail');
      String photo = prefs.getString('photo');
      _authenticatedUser = User(email: email, id: uid, token: token, photo: photo);
      return user;
    } else {
      print('user is null');
      return null;
    }
  }

请有人说明如何解决此问题?

我根据main.dart文件中getCurrentUser的返回来重定向用户。

2 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,我所做的是这样:

在我的主要方法中,我检查当前用户是否为空,即是否没有用户登录,然后将用户重定向到他们有机会登录或注册的登录页面。如果用户不为空,那么我将从存储在数据库中的用户令牌中获取用户令牌,并获取当前用户令牌,如果它们不同或者数据库中存储的用户令牌为空(即,从来没有首先),然后用当前令牌更新令牌。

在我的登录名中,我也这样做。成功登录后,我检查为该用户存储的令牌是否不同,如果是,则更新它。

在注册时,我仅获取设备的令牌并将其与用户信息一起存储。我希望这有帮助。我也知道这是一个老问题,但是我遇到了这个问题,并认为我会为正在寻找的任何人共享一个可能的解决方案。

答案 1 :(得分:0)

今天,我在使用graphQl的应用程序中遇到了同样的问题。在https://firebase.google.com/docs/auth/admin/manage-sessions

的文档中找到了答案

我们可以看到(从文档中复制粘贴):

  1. Firebase身份验证会话很长一段时间。
  2. Firebase ID令牌寿命很短,持续了一个小时。

因此,有很多不同的方法可以解决此问题。我们可以检查状态并撤消令牌,可以使用Provider或Inherited Widget来改变状态,可以使用BLoC模式来保持状态新鲜。

但是,无论如何,我们都会遇到一个问题-如果用户关闭应用程序并在2-3天后打开它怎么办?当然,用户必须自动进行身份验证,并且他什么也不会注意到。

我的决定是使用更新令牌方法,对于您而言,它看起来像:

  void updateToken() {
    if (firebaseAuth.currentUser() != null) {
      firebaseAuth.currentUser().then((val) {
        val.getIdToken().then((onValue) {
          // here you can mutate state to BLoC or Provider 
          // or Inherited widget
          // for example - authBloc.passFirebaseToken.add(onValue.token);
        });
      });
    }
  }

就是这样。您可以将所有这些身份验证方法放在Singleton中,并在可能出现问题的任何页面上使用它们。