FlutterのGoogleサインインでFirebase Authを使用しています。サインインすることはできますが、アプリを閉じると(kill it)、もう一度サインアップする必要があります。それで、ユーザーが特にログアウトするまでユーザー認証を維持する方法はありますか?これが私の認証クラスです
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
}
}
これが認証チェックが呼び出される私のスタートページです。
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,)));
}
}
あなたの問題はルーティングです。私のアプリではFirebaseAuth
を使用しています。これは、あなたが望んだとおりに機能し、ログイントークンは保持しません。ただし、getUserを使用するアプローチが機能しない理由はわかりません。
onAuthStateChanged
を使用するようにコードを調整してください。
基本的に、MaterialApp
でStreamBuilder
を作成し、_auth.onAuthStateChanged
をクリックし、認証ステータスに応じてページを選択します。
アプリの一部をコピーして貼り付けて、アイデアがわかるようにします。
[...]
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();
},
);
}
すみません、それは私の間違いでした。プッシュログイン画面を他の場所に置くのを忘れました。
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,)));
}
}
shared_preferences
を使用すると、アプリを終了した場合でもセッションを維持できます。これがドキュメント https://pub.dartlang.org/packages/shared_preferences です。
また、sqliteを使用してセッションを永続化することが可能だと聞いたことがあります。