dimanche 7 novembre 2021

flutter web) How to set firebase auth Persistence

I'm using flutter web and firebase. If I refresh after sign in from this web, will be sign out and go to the login page.

And if sign in again with the same account, I won't be able to sign in properly.(I don't think the sign out process is done properly.)

I use sdk 2.7, firebase_core: ^0.5.0, firebase_auth: ^0.18.0

This is the code about authentication.

enum FirebaseAuthStatus { signout, progress, signin }

class FirebaseAuthState extends ChangeNotifier {
  FirebaseAuthStatus _firebaseAuthStatus = FirebaseAuthStatus.progress;

  FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
  User _firebaseUser;
  GoogleSignIn _googleSignIn = GoogleSignIn();
  FirebaseAuth _auth = FirebaseAuth.instance;

  void watchAuthChange() {
    _firebaseAuth.authStateChanges().listen((firebaseUser) {
      if (firebaseUser == null && _firebaseUser == null) {
        changeFirebaseAuthStatus();

        return;
      } else if (firebaseUser != _firebaseUser) {
        _firebaseUser = firebaseUser;
        changeFirebaseAuthStatus();
      }
    });
  }

  void changeFirebaseAuthStatus([FirebaseAuthStatus firebaseAuthStatus]) {
    if (firebaseAuthStatus != null) {
      _firebaseAuthStatus = firebaseAuthStatus;
    } else {
      if (_firebaseUser != null) {
        _firebaseAuthStatus = FirebaseAuthStatus.signin;
      } else {
        _firebaseAuthStatus = FirebaseAuthStatus.signout;
      }
    }
    notifyListeners();
  }

main.dart

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  FirebaseAuthState _firebaseAuthState = FirebaseAuthState();

  Widget _currentWidget;

  @override
  Widget build(BuildContext context) {
    _firebaseAuthState.watchAuthChange();
    return
    .
    .
    .
                switch (firebaseAuthState.firebaseAuthStatus) {
                  case FirebaseAuthStatus.signout:
                    _clearUserModel(context);
                    _currentWidget = AuthScreen();
                    break;

                  case FirebaseAuthStatus.signin:
                    _initUserModel(firebaseAuthState, context);
                    _currentWidget = HomeScreen();
                    break;

                  default:
                    _currentWidget = CustomLoading();
                    break;
                }

Web - index.html

<!--firebase-->
<script src = "https://www.gstatic.com/firebasejs/8.6.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-auth.js"></script>
<script src="https://www.gstatic.com/firebasejs/7.22.1/firebase-firestore.js"></script>
<script src="https://www.gstatic.com/firebasejs/8.6.1/firebase-storage.js"></script>

<script>
  // TODO: Add SDKs for Firebase products that you want to use
  // https://firebase.google.com/docs/web/setup#available-libraries

  // Your web app's Firebase configuration
  // For Firebase JS SDK v7.20.0 and later, measurementId is optional
  var firebaseConfig = {
    apiKey: "AIzaSyBFgw6wbpSEhJEl7z8sumjWg5hUkY7sBK8",
    authDomain: "omd-community-ee697.firebaseapp.com",
    projectId: "omd-community-ee697",
    storageBucket: "omd-community-ee697.appspot.com",
    messagingSenderId: "707179646659",
    appId: "1:707179646659:web:74e7e0e6ed34affa851c76",
    measurementId: "G-4KVWCWCWWZ"
  };

  // Initialize Firebase
  firebase.initializeApp(firebaseConfig);
  firebase.getAnalytics(app);
  //firebase auth 유지 (자동로그인 태스트)
  firebase.auth().setPersistence(firebase.auth.Auth.Persistence.LOCAL);

</script>

Can I get help on how to maintain firebase authentication?

Thank you.




Aucun commentaire:

Enregistrer un commentaire