Har*_*wal 5 android firebase firebase-authentication flutter
我已经在第一次启动应用程序时使用谷歌创建了身份验证,并且我有自己的_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';
}
Run Code Online (Sandbox Code Playgroud)
然后我调用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;
}
}
Run Code Online (Sandbox Code Playgroud)
请有人解释如何解决这个问题?
我根据getCurrentUsermain.dart 文件中的返回重定向用户。
今天我在使用 graphQl 的应用程序中遇到了同样的问题。答案可以在此处的文档中找到:https://firebase.google.com/docs/auth/admin/manage-sessions
我们可以看到(从文档复制粘贴):
因此,有很多不同的方法来解决这个问题。我们可以检查状态并撤销令牌,我们可以使用 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);
});
});
}
}
Run Code Online (Sandbox Code Playgroud)
就是这样。您可以将所有这些身份验证方法放置到 Singleton 中,并在可能出现问题的任何页面上使用它们。
Uma*_*Uma -1
我遇到了同样的问题,我所做的是:
在我的主要方法中,我检查当前用户是否为空,即如果没有用户登录,那么我将用户重定向到他们有机会登录或注册的登陆页面。如果用户不为空,那么我从数据库中存储用户令牌的位置获取用户令牌,并获取当前用户令牌,如果它们不同或者存储在数据库中的令牌为空(即,从来没有第一个)然后我用当前的令牌更新令牌。
在我的登录中,我也这样做。成功登录后,我检查为该用户存储的令牌是否不同,如果不同,我会更新它。
在我的注册中,我只需获取设备的令牌并将其与用户信息一起存储。我希望这有帮助。我也知道这是一个老问题,但我遇到了这个问题,并认为我会为任何正在寻找的人分享一个可能的解决方案。
| 归档时间: |
|
| 查看次数: |
5763 次 |
| 最近记录: |