怎么做 ? 一旦我们使用谷歌火力基地登录颤振应用程序,那么当我们再次打开应用程序时,我们不必再次登录

  • 本文关键字:我们 应用程序 登录 不必 谷歌 firebase flutter
  • 更新时间 :
  • 英文 :


一旦我们使用Google Firebase登录颤振应用程序,那么当我们再次打开应用程序时,我们就不必再次登录 我的登录代码

Future<FirebaseUser> _handleSignIn() async {
try {
final GoogleSignInAccount googleUser = await _googleSignIn.signIn();
final GoogleSignInAuthentication googleAuth = await googleUser.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
final FirebaseUser user =(await _auth.signInWithCredential(credential)).user;
print("signed in " + user.displayName);
Navigator.of(context).push(MaterialPageRoute(builder: (_) {
return HomePage();
}));
// print("signed in " + user.displayName);
return user;
} catch (error) {
print(error);
}
}

一个可能的解决方案是在登录用户时使用 Firebase 函数生成令牌,然后使用 SharedPreferences 保存该令牌。下次用户打开应用时,您可以检索令牌,并使用它来自动通过 Firebase 进行身份验证。下面的 Firebase 函数将为您已登录的用户生成一个令牌:

exports.generateTokenCall = functions.https.onCall((data, context) => {
var token;
token = admin.auth().createCustomToken(context.auth.uid)
.then((customToken) => {
return {
token: customToken
};
})
.catch((error) => {
console.log("Error creating custom token:", error);
return { error };
});
return token;
});

以下是我用于登录和自动登录的 Flutter 方法的示例:

final FirebaseAuth _auth = FirebaseAuth.instance;
CloudFunctions _cloudFunctions = CloudFunctions(region: 'europe-west1');
Firestore _instance = Firestore.instance;
FirebaseUser firebaseUser;
SharedPreferences _sharedPreferences;
User user;
Future<FirebaseUser> login(String email, String password) async {
return await _auth.signInWithEmailAndPassword(
email: email,
password: password
).then((user) async {
_sharedPreferences = await SharedPreferences.getInstance();
_sharedPreferences.setString('uid', user.uid);
_sharedPreferences.setString('lastLoginDateTime', DateTime.now().toString());
firebaseUser = user;
loadUser(user.uid);
return user;
}).catchError((error) {
print('failed signInWithEmailAndPassword');
print(error.toString());
return false;
});
}
void attemptAutoLogin() async {
_sharedPreferences = await SharedPreferences.getInstance();
String token = _sharedPreferences.get('token');
String uid = _sharedPreferences.get('uid');
if(token != null && uid != null){
await generateAndSaveTokenCall();
_auth.signInWithCustomToken(token: _sharedPreferences.get('token')).then((fbUser){
if(fbUser is FirebaseUser && fbUser.uid != null){
firebaseUser = fbUser;
_sharedPreferences.setString('lastLoginDateTime', DateTime.now().toString());
_instance.collection('users').document(firebaseUser.uid).get().then((snapshot) async {
loadUser(firebaseUser.uid);
});
tokenUpdateTimer();
setLoading(false);
}
}).catchError((error){
setLoading(false);
});
} else {
setLoading(false);
}
}
Future generateAndSaveTokenCall() async {
Map response = await _cloudFunctions.call(functionName: 'generateTokenCall').timeout(Duration(seconds: 30));
print('generateAndSaveTokenCall');
print(response);
if(response['error'] == null && response['token'] != null){
_sharedPreferences = await SharedPreferences.getInstance();
_sharedPreferences.setString('token', response['token']);
_sharedPreferences.setString('lastLoginDateTime', DateTime.now().toString());
}else{
print('Error fetching token: ${response['error']}');
}
}

请注意,这是我自己分享的代码,需要根据您自己的目的进行调整。

相关内容

最新更新