android - Flutter 应用程序中的 Firebase token 过期后如何更新并存储?

标签 android firebase flutter firebase-authentication

我在第一次启动应用程序时使用谷歌创建了身份验证,并且我有自己的 _authenticatedUser 存储用户 token 以供进一步请求。

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() 函数来检查用户是否存在,但是当 token 过期时,我会得到 token 过期的错误用户。

  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 身份验证 session 长期存在。
  2. Firebase ID token 的有效期很短,只能持续一个小时。

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

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

我的决定是使用更新 token 方法,对于您的情况,它可能看起来像:

  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 中,并在可能出现问题的任何页面上使用它们。

关于android - Flutter 应用程序中的 Firebase token 过期后如何更新并存储?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54279497/

相关文章:

ios - 如何最好地Firebase查询来观察Bool属性的变化

dart - 基于hold的圆形进度按钮(flutter)

java - Android:在适配器上打开对话框

android - 在测试应用程序中使用 Dagger 和 Robolectric

java - 从 firebase android 检索图像的简单方法

javascript - 使用firebase登录后页面反复刷新

flutter - 如何解决Build失败并出现异常?

带有 if 语句的 Flutter Firestore FutureBuilder 过滤器

java - Android 中单顶模式的 Intent 附加功能

android - 在手机上构建游戏。原生还是引擎?