我在第一次启动应用程序时使用谷歌创建了身份验证,并且我有自己的 _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
我们可以看到(从文档中复制粘贴):
- Firebase 身份验证 session 长期存在。
- 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/