Возможное решение для этого - использовать функции 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']}');
}
}
Обратите внимание, что это мой собственный код, которым я делюсь, и мне потребуется адаптация для ваших собственных целей.