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,)));
}
}
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();
},
);
}
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,)));
}
}
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.