как сделать ? как только мы войдем в приложение флаттера с помощью Google Fire Base, нам не нужно будет входить снова, когда мы снова откроем приложение - PullRequest
0 голосов
/ 22 января 2020

после того, как мы войдем в приложение флаттера, используя 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);
  }
}

1 Ответ

0 голосов
/ 23 января 2020

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

Обратите внимание, что это мой собственный код, которым я делюсь, и мне потребуется адаптация для ваших собственных целей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...