web-dev-qa-db-ja.com

永続的なユーザーAuth Flutter Firebase

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,)));
  }
}
9
Ayush Singh

あなたの問題はルーティングです。私のアプリではFirebaseAuthを使用しています。これは、あなたが望んだとおりに機能し、ログイントークンは保持しません。ただし、getUserを使用するアプローチが機能しない理由はわかりません。

onAuthStateChangedを使用するようにコードを調整してください。

基本的に、MaterialAppStreamBuilderを作成し、_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();
    },
  );
}
9
Feu

すみません、それは私の間違いでした。プッシュログイン画面を他の場所に置くのを忘れました。

  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

shared_preferencesを使用すると、アプリを終了した場合でもセッションを維持できます。これがドキュメント https://pub.dartlang.org/packages/shared_preferences です。

また、sqliteを使用してセッションを永続化することが可能だと聞いたことがあります。

0
dmarquina