【问题标题】:Firebase Authentication is not persisted on Flutter WebFirebase 身份验证未在 Flutter Web 上保留
【发布时间】:2019-12-26 07:25:03
【问题描述】:

我在我的 Flutter Web 应用上使用 Firebase 身份验证,但在刷新期间会话未保持。

这是我正在使用的包。

https://pub.dev/packages/firebase

这就是我使用 Firebase 进行身份验证的方式

  static Future<User> handleSignInEmail(String email, String password) async {
    await init();

    final UserCredential userCredential =
        await auth().signInWithEmailAndPassword(email.trim(), password);

    assert(userCredential.user != null);
    assert(await userCredential.user.getIdToken() != null);

    final User currentUser = await userCredential.user;
    assert(userCredential.user.uid == currentUser.uid);

    print('signInEmail succeeded: $userCredential.user');

    return userCredential.user;
  }

如果我刷新页面并调用如下方法,返回的用户为null:

  static Future<User> getFirebaseUser() async {
    await init();
    return await auth().currentUser;
  }

使用 Flutter Mobile 的类似实现按预期工作。我在 Flutter Web 实现中缺少什么?

【问题讨论】:

  • 嘿@dazza5000,我也有同样的问题。你找到解决办法了吗?
  • @wottpal - 下面的解决方案有效

标签: firebase-authentication flutter-web


【解决方案1】:

https://stackoverflow.com/a/58158636的扩展名

在新的库版本中,onAuthStateChanged getter 不可用。而不是使用authStateChanges()

User firebaseUser = await FirebaseAuth.instance.currentUser;
  if (firebaseUser == null) {
    firebaseUser = await FirebaseAuth.instance.authStateChanges().first;
  }

https://pub.dev/documentation/firebase_auth/latest/firebase_auth/FirebaseAuth/authStateChanges.html

【讨论】:

    【解决方案2】:

    Firebase Dart Package

    导入此 pub 并检查使用身份验证的操作系统

    import 'package:firebase/firebase.dart' as firebase;
    import 'package:firebase_auth/firebase_auth.dart';
    
    if(Platform.isIOS || Platform.isAndroid) {
        FirebaseAuth.instance.createUserWithEmailAndPassword(email: email, password: password).then(() {
            //do something
        });
    } else {
        firebase.auth().createUserWithEmailAndPassword(email, password).then(() {
            //do something
        });
    }
    

    【讨论】:

    • 这解决了我的问题,谢谢。不要将 firebase_auth 包用于 WEB ! ? 改用普通的 firebase 包!
    【解决方案3】:

    登录会自动发生,并由 Firebase 处理,但以异步方式进行。更多细节可以在官方文档中找到:

    https://firebase.google.com/docs/auth/web/auth-state-persistence

    诀窍很简单。您需要等待第一次状态更改。

      static Future<User> getFirebaseUser() async {
        await init();
        //return await auth().currentUser;
        return await auth().onAuthStateChanged.first;
      }
    

    如果没有登录用户,则返回nullhttps://firebase.google.com/docs/reference/js/firebase.auth.Auth.html#onauthstatechanged

    我的firebase 版本:

    firebase: 5.0.4 #https://pub.dartlang.org/packages/firebase
    

    我编写了这个适用于移动设备和网络的实现:

      static Future<FirebaseUser> getFirebaseUser() async {
        FirebaseUser firebaseUser = await FirebaseAuth.instance.currentUser();
        if (firebaseUser == null) {
          firebaseUser = await FirebaseAuth.instance.onAuthStateChanged.first;
        }
        return firebaseUser;
      }
    

    【讨论】:

    • 谢谢!可以使用package:firebase_auth/firebase_auth.dartfirebase_auth: 0.15.5+2 确认此操作
    • 对我而言,仅在同一实例中保持持久性。当我关闭浏览器窗口并重新启动时,应用程序会话不会持续存在。
    • @RushikeshTalokar 你解决了吗?我有同样的问题,“当我关闭浏览器窗口然后重新启动它时,会话不会持续存在”
    • FirebaseAuth 在页面刷新后仍会丢失其身份验证会话。我正在使用 firebase_auth:^3.0.1。这个问题有一张公开的票:github.com/FirebaseExtended/flutterfire/issues/3356
    • 我也有同样的问题:/ ...任何解决方法?
    猜你喜欢
    • 2020-10-19
    • 2021-08-29
    • 2021-07-08
    • 2020-11-27
    • 2021-01-17
    • 2019-01-05
    • 2020-11-27
    • 2022-01-11
    • 2019-02-07
    相关资源
    最近更新 更多