постоянный вход пользователя во Flutter с использованием Firebase Authentication и Rest Api - PullRequest
0 голосов
/ 29 апреля 2020

Я использую аутентификацию электронной почты / пароля Firebase для своего приложения и храню токен с использованием общих настроек. я хочу обновить sh токен до истечения срока его действия, чтобы пользователь постоянно входил в систему после того, как он ввел свои учетные данные. это мой код

class Auth with ChangeNotifier{
  String _token;
  DateTime _expiryDate;
  String _userId;
  Timer _authTimer;

  bool get isAuth{
    return token!=null;

  }
  String get token{
    if(_expiryDate!=null&&_expiryDate.isAfter(DateTime.now())&& _token!=null){
      return _token; 
    }
    return null;
  }

  String get userId {
    return _userId;
  }


  Future<void> _authenticate(String email, String password, String urlSegment ) async {

    final url='https://identitytoolkit.googleapis.com/v1/$urlSegment? key';
    try{
      final response= await http.post(url, body: json.encode({
        'email': email,
        'password': password,
        'returnSecureToken': true,
      },
      ),
      );
      final responseData= json.decode(response.body);
      if(responseData['error']!=null){
        throw HttpException(responseData['error']['message']);
      }
      _token= responseData['idToken'];
      _userId=responseData['localId'];
      _expiryDate=DateTime.now().add(Duration
      (seconds: int.parse(
        responseData['expiresIn'])
        )
         );
         _autoLogout();
         notifyListeners();
         final prefs=await SharedPreferences.getInstance();
         final userData= json.encode({
           'token': _token,
           'userId': _userId,
           'expiryDate': _expiryDate.toIso8601String(),
         });
         prefs.setString('userData', userData);
    } catch (error){
      throw(error);
    }



  }


  Future<void> signup(String email, String password) async{
   return _authenticate(email, password, 'accounts:signUp');

  }

  Future<void> login(String email,String password) async{
  return _authenticate(email, password, 'accounts:signInWithPassword');
}
  Future<bool> tryAutoLogin() async{
    final prefs= await SharedPreferences.getInstance();
    if(!prefs.containsKey('userData')){
      return false;
    }
    final extractedUserData= json.decode(prefs.getString('userData')) as Map<String, Object>;
    final expiryDate= DateTime.parse(extractedUserData['expiryDate']);

    if(expiryDate.isBefore(DateTime.now()))
    {
      return false;
    }
    _token=extractedUserData['token'];
    _userId=extractedUserData['userId'];
    _expiryDate=expiryDate;
    notifyListeners();
    _autoLogout();
    return true;
  }

  Future<void>  logout() async{
    _token=null;
    _userId=null;
    _expiryDate=null;
    if(_authTimer!=null){
      _authTimer.cancel();
      _authTimer=null;
    }
    notifyListeners();
    final prefs= await SharedPreferences.getInstance();
    prefs.remove('userData');
  }

  void _autoLogout(){
    if(_authTimer!=null){
      _authTimer.cancel();
    }
    final timeToExpiry= _expiryDate.difference(DateTime.now()).inSeconds;
    _authTimer= Timer(Duration(seconds: timeToExpiry), logout);
  }
}

Я хочу использовать этот метод, поскольку я использую токены во всем коде для аутентификации. пожалуйста, предложите любые способы реализации refre sh Token Inorder, чтобы сохранить использование в системе даже после часа.

...