【问题标题】:How do Firestore writes done offline handle authentication state?Firestore 离线写入完成如何处理身份验证状态?
【发布时间】:2022-01-04 17:47:42
【问题描述】:
Firestore.firestore().document("someCol/someDoc").updateData([
    "someField": FieldValue.delete()
]) { (error) in
    // returns nothing in the scenario described below
}
  • 客户端已登录 Firebase 身份验证。
  • Firestore 安全规则需要身份验证才能执行写入。
  • 客户端离线并执行写操作。

如果客户端在 Auth 重新联机之前退出 Auth,写入将不会执行,正如我所期望的那样。我认为这是因为当客户端离线时,身份验证凭据没有与写入操作一起排队。这可以确认吗?但是,我希望这个写操作的完成处理程序返回一个错误,但它什么也不返回。为什么它什么都不返回,这是它应该表现的方式吗?

【问题讨论】:

    标签: firebase google-cloud-platform google-cloud-firestore


    【解决方案1】:

    在正常情况下,身份验证 SDK 会在连接恢复后尝试刷新身份验证凭据,然后再尝试将写入提交到 Firestore。

    如果您在离线时明确将用户注销,则在您注销用户时不会发生刷新,因此您的写入确实会失败。


    我不确定为什么您的完成处理程序没有出现错误,但是如果不查看所有三个组件的确切流程,就很难确定任何事情:Firestore 写入、用户身份验证状态和在线/离线。在像 jsbin/stackblitz 这样的网站中复制可能是最简单的以最小形式分享它的方法。

    【讨论】:

    • 流程和我描述的完全一样。您可以使用这些 Firestore 安全规则获取任何 Firebase 项目并立即执行写入,然后退出,您将看到此行为(除非它特定于 Swift SDK)。同样有趣的是,如果您从不脱机——如果您进行写入并在下一行代码中注销——写入是在服务器上进行的(如预期的那样),但不会调用完成处理程序。我正在尝试确定这是特定于 Swift SDK 的错误还是框架的预期行为。你能确认你的这种行为吗?
    • “你能确认一下你的这种行为吗?”如果您提供一个MCVE,我可以轻松复制/粘贴以重现该行为,我会试一试。没有这个,我能做的最好的就是描述预期的系统行为,就像我在答案的前半部分所做的那样。
    猜你喜欢
    • 2020-11-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2018-08-15
    • 2016-11-15
    • 2020-06-11
    • 1970-01-01
    相关资源
    最近更新 更多