即使禁用经过身份验证的用户,Firebase 数据库调用也能正常工作

Firebase database call working even when Authenticated user is disabled

我在我的项目中使用 Firebase Firestore 和 Firebase 身份验证。

我正在测试如果我进入 firebase 控制台并手动单击“禁用帐户”会发生什么情况。

我希望如果帐户被暂停,经过身份验证的用户(在这种情况下为 test@mail.com)将在调用 Firestore 数据库时立即收到错误消息(例如 getDocs(q)setDoc()).这个假设背后的原因是我假设 Firestore 在执行 CRUD 之前尝试对每个调用进行身份验证。

但是,测试出来后,这里是测试和结果

  1. 登录用户(test@mail.com)
  2. 执行数据库读取或写入以确保一切正常
  3. 转到 firebase 控制台并禁用帐户 (test@mail.com)。
  4. 尝试进行另一个数据库读取或写入。这里的结果是我仍然能够读写,这不是我所期望的。

这是我的问题

  1. 这是正常行为吗?
  2. 我可以编写 Firebase 安全规则来解决这个问题吗?
  3. 如果我每次执行 firestore 调用时都必须检查用户是否登录,那就不太清楚了。但如果那是我必须做的,我该怎么做。我认为 getAuth()onAuthStateChanged 不太适合这种情况。原因是 getAuth() 似乎只在第一次调用时检查数据库。任何子序列调用它只检查应用程序内存,根本不执行任何网络请求(通过查看控制台网络选项卡验证)。这有点奇怪。并且 onAuthStateChanged 不监听 firebase 状态变化,它只监听我的应用程序是否让用户登录或注销。

关于我正在努力实现的目标的背景知识


更新:

我的应用程序似乎需要大约 1-2 小时才能自动识别该帐户已被禁用。它花费的时间比我预期的要长得多。我仍然想知道是否有更好的解决方案而不是等待。

Firebase 身份验证结合使用 long-lived 刷新令牌和 short-lived ID 令牌。后一种代币自铸造之日起一小时内有效,铸造后不可作废。

因此,您的客户最多可能需要一个小时才能获得新令牌,并检测到其帐户已被禁用。您可以通过调用 getIDToken(true) 强制客户端随时更新其 ID 令牌。这将确保客户端拥有更新的 ID 令牌,但不会使旧的 ID 令牌失效(因为不可能使不记名令牌失效)。

您要做的是在禁用用户帐户时将 UID 或 ID 令牌写入您的数据库,然后在您的安全规则中进行检查。

另请参阅 detecting token revocation 上的 Firebase 文档。