我是在首次启动应用程序时通过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
的返回来重定向用户。
答案 0 :(得分:0)
我遇到了同样的问题,我所做的是这样:
在我的主要方法中,我检查当前用户是否为空,即是否没有用户登录,然后将用户重定向到他们有机会登录或注册的登录页面。如果用户不为空,那么我将从存储在数据库中的用户令牌中获取用户令牌,并获取当前用户令牌,如果它们不同或者数据库中存储的用户令牌为空(即,从来没有首先),然后用当前令牌更新令牌。
在我的登录名中,我也这样做。成功登录后,我检查为该用户存储的令牌是否不同,如果是,则更新它。
在注册时,我仅获取设备的令牌并将其与用户信息一起存储。我希望这有帮助。我也知道这是一个老问题,但是我遇到了这个问题,并认为我会为正在寻找的任何人共享一个可能的解决方案。
答案 1 :(得分:0)
今天,我在使用graphQl的应用程序中遇到了同样的问题。在https://firebase.google.com/docs/auth/admin/manage-sessions
的文档中找到了答案我们可以看到(从文档中复制粘贴):
因此,有很多不同的方法可以解决此问题。我们可以检查状态并撤消令牌,可以使用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中,并在可能出现问题的任何页面上使用它们。