繁体   English   中英

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

[英]How to update Firebase token in Flutter application after it expires and store it?

我已经在第一次启动应用程序时使用谷歌创建了身份验证,并且我有自己的_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';
  }

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

  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的返回重定向用户。

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

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

  1. Firebase 身份验证会话是长期存在的。
  2. Firebase ID 令牌是短暂的,持续一个小时。

所以,有很多不同的方法可以解决这个问题。 我们可以检查状态和撤销令牌,我们可以使用 Provider 或 Inherited 小部件改变状态,我们可以使用 BLoC 模式来保持它的新鲜。

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

我的决定是使用更新令牌方法,对于您的情况,它可能如下所示:

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

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

我遇到了同样的问题并通过以下方式修复了它:

Future refreshFirebaseUser() async {
  if (auth.currentUser != null) {
    final user = auth.currentUser;
    final idTokenResult = await user!.getIdTokenResult(true);
    return idTokenResult;
  }
}

只需在登录/注册期间理想地调用该函数

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM