web-dev-qa-db-fra.com

Persister utilisateur Auth Flutter Firebase

J'utilise Firebase Auth avec la connexion Google dans Flutter. Je peux me connecter cependant quand je ferme l'application (la tuer), je dois m'inscrire à nouveau. Existe-t-il un moyen de conserver l'authentification de l'utilisateur jusqu'à ce qu'il soit spécifiquement déconnecté par l'utilisateur? Voici mon cours d'authentification

import 'package:firebase_auth/firebase_auth.Dart';
import 'package:google_sign_in/google_sign_in.Dart';

class Auth {
  FirebaseAuth _firebaseAuth;
  FirebaseUser _user;

  Auth() {
    this._firebaseAuth = FirebaseAuth.instance;
  }

  Future<bool> isLoggedIn() async {
    this._user = await _firebaseAuth.currentUser();
    if (this._user == null) {
      return false;
    }
    return true;
  }

  Future<bool> authenticateWithGoogle() async {
    final googleSignIn = GoogleSignIn();
    final GoogleSignInAccount googleUser = await googleSignIn.signIn();
    final GoogleSignInAuthentication googleAuth =
    await googleUser.authentication;
    this._user = await _firebaseAuth.signInWithGoogle(
      accessToken: googleAuth.accessToken,
      idToken: googleAuth.idToken,
    );
    if (this._user == null) {
      return false;
    }
    return true;
    // do something with signed-in user
  }
}

Voici ma page de démarrage où le contrôle d'authentification est appelé.

import 'package:flutter/material.Dart';
import 'auth.Dart';
import 'login_screen.Dart';
import 'chat_screen.Dart';

class Splash extends StatefulWidget {

  @override
  _Splash createState() => _Splash();
}

class _Splash extends State<Splash> {

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: CircularProgressIndicator(
          value: null,
        ),
      ),
    );
  }

  @override
  void initState() {
    super.initState();
    _handleStartScreen();
  }

  Future<void> _handleStartScreen() async {
    Auth _auth = Auth();
    if (await _auth.isLoggedIn()) {
      Navigator.of(context).pushReplacementNamed("/chat");
    }
    Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => LoginScreen(auth: _auth,)));
  }
}
9
Ayush Singh

Je crois que votre problème est le routage. Dans mes applications, j'utilise FirebaseAuth et cela fonctionne exactement comme vous le dites, et je ne persiste aucun jeton de connexion. Cependant, je ne sais pas pourquoi votre approche d'utilisation d'un getUser ne fonctionne pas.

Essayez d'ajuster votre code pour utiliser onAuthStateChanged.

Fondamentalement, sur votre MaterialApp, créez un StreamBuilder en écoutant _auth.onAuthStateChanged et choisissez votre page en fonction de l'état d'authentification.

Je vais copier et coller des parties de mon application pour que vous puissiez avoir une idée:

[...]

final FirebaseAuth _auth = FirebaseAuth.instance;

Future<void> main() async {
  FirebaseApp.configure(
    name: '...',
    options:
      Platform.isIOS
        ? const FirebaseOptions(...)
        : const FirebaseOptions(...),
    );

  [...]  

  runApp(new MaterialApp(
    title: '...',
    home: await getLandingPage(),
    theme: ThemeData(...),
  ));
}

Future<Widget> getLandingPage() async {
  return StreamBuilder<FirebaseUser>(
    stream: _auth.onAuthStateChanged,
    builder: (BuildContext context, snapshot) {
      if (snapshot.hasData && (!snapshot.data.isAnonymous)) {
        return HomePage();
      }

      return AccountLoginPage();
    },
  );
}
9
Feu

Désolé, c'était mon erreur. Vous avez oublié de mettre l'écran de connexion Push ailleurs.

  Future<void> _handleStartScreen() async {
    Auth _auth = Auth();
    if (await _auth.isLoggedIn()) {
      Navigator.of(context).pushReplacementNamed("/chat");
    }
    else {
        Navigator.pushReplacement(context, MaterialPageRoute(builder: (BuildContext context) => LoginScreen(auth: _auth,)));
    }
  }
0
Ayush Singh

Vous pouvez utiliser shared_preferences pour maintenir votre session en vie même lorsque vous tuez l'application. Voici la documentation https://pub.dartlang.org/packages/shared_preferences .

J'ai également entendu dire qu'il est possible d'utiliser sqlite pour conserver la session.

0
dmarquina