离线时无法在颤振应用程序中使用signInWithEmailAndPassword

Posted

技术标签:

【中文标题】离线时无法在颤振应用程序中使用signInWithEmailAndPassword【英文标题】:Can't use signInWithEmailAndPassword in flutter app when offline 【发布时间】:2019-02-17 18:14:27 【问题描述】:

我正在尝试在也使用 Cloud Firestore 的 Flutter 应用中使用 Firebase 身份验证。我遇到的问题是离线时该怎么办。

我记录了用户名和密码,并尝试使用以下代码登录:

    _user = await _auth.signInWithEmailAndPassword(email: account, password: myPassword).catchError((error) 
  print(error);
);

await _user.getIdToken().catchError((error) 
  // The error source may be that they are not currently connected to the internet
  print(error);
);
final FirebaseUser currentUser = await _auth.currentUser();

问题是我离线时 signInWithEmailAndPassword 失败。我需要 FirebaseUser 对象来访问 Cloud Firestore。我已阅读有关身份验证状态持久性的信息,但这似乎不适用于 Flutter。

我知道这必须有效,而且我太新了,无法理解如何在离线设置中将 Firebase Auth 与 Cloud Firestore 结合使用。我错过了什么?

【问题讨论】:

【参考方案1】:

解决方案是测试用户是否已通过身份验证。 Firebase 文档说:

如果您的应用使用 Firebase 身份验证,Firebase 实时数据库客户端会在应用重新启动时保留用户的身份验证令牌。如果 auth 令牌在您的应用离线时过期,客户端会暂停写入操作,直到您的应用重新对用户进行身份验证,否则写入操作可能会因安全规则而失败。

所以我只检查第一个。代码如下:

// If user is already logged in, currentUser will return the authenticated user
// Otherwise, _user will be null.
_user = await _auth.currentUser();
if(_user == null) 
  _user = await _auth.signInWithEmailAndPassword(email: account, password: myPassword).catchError((error) 
    print(error);
  );

【讨论】:

【参考方案2】:

Firebase 身份验证在离线时可能无法工作。绝对需要能够连接到 Firebase 后端服务,以验证用户的帐户并更新用于在线访问其他 Firebase 服务的用户 ID 令牌。否则,系统就不会真正安全。

【讨论】:

【参考方案3】:

如何在不连接到身份验证服务器的情况下对用户进行身份验证? 您需要一个活动连接来对用户进行身份验证。 您可以将 Firebase Cloud Firestore / Realtime 数据库数据存储在手机中(磁盘持久性),但不能存储身份验证,因为这是为了防止本地存储的滥用访问。

因此,解决此问题的一种方法是仅在用户的设备为 connected to the network 和/或 connected to Firebase 时显示登录对话框。

【讨论】:

我知道我们无法在没有连接的情况下进行身份验证。那么,我们如何访问本地保存的 Cloud Firestore (CF) 数据,而无需先以某种方式进行身份验证。我们可以在离线设置中访问 CF 数据的唯一方法是如果我们允许在没有身份验证的情况下打开 R/W 访问。这没有意义。因此,必须有某种方式来持久化身份验证,以便我们可以访问 CF 数据。这就是我要问的问题。 我刚刚从 Firebase 文档中复制了这个:如果您的应用使用 Firebase 身份验证,Firebase 实时数据库客户端会在应用重新启动时保留用户的身份验证令牌。如果 auth 令牌在您的应用离线时过期,客户端会暂停写入操作,直到您的应用重新对用户进行身份验证,否则写入操作可能会因安全规则而失败。

以上是关于离线时无法在颤振应用程序中使用signInWithEmailAndPassword的主要内容,如果未能解决你的问题,请参考以下文章

即使在离线时如何缓存网页以在我的 android 应用程序中使用

离线时在设备上测试 iOS 应用

Firebase 离线支持:在用户离线时上传帖子,当用户在 iOS Swift 应用程序中在线时同步

AWS AppSync 如何在我离线时判断是不是存在未完成的突变?

当接收器离线时,socket.io 发出不工作

当接收器离线时,socket.io 发出不工作