即使禁用经过身份验证的用户,Firebase 数据库调用也能正常工作
Firebase database call working even when Authenticated user is disabled
-
firebase
-
firebase-security
-
firebase-authentication
-
firebase-realtime-database
-
google-cloud-firestore
我在我的项目中使用 Firebase Firestore 和 Firebase 身份验证。
我正在测试如果我进入 firebase 控制台并手动单击“禁用帐户”会发生什么情况。
我希望如果帐户被暂停,经过身份验证的用户(在这种情况下为 test@mail.com)将在调用 Firestore 数据库时立即收到错误消息(例如 getDocs(q)
或 setDoc()
).这个假设背后的原因是我假设 Firestore 在执行 CRUD 之前尝试对每个调用进行身份验证。
但是,测试出来后,这里是测试和结果
- 登录用户(test@mail.com)
- 执行数据库读取或写入以确保一切正常
- 转到 firebase 控制台并禁用帐户 (test@mail.com)。
- 尝试进行另一个数据库读取或写入。这里的结果是我仍然能够读写,这不是我所期望的。
这是我的问题
- 这是正常行为吗?
- 我可以编写 Firebase 安全规则来解决这个问题吗?
- 如果我每次执行 firestore 调用时都必须检查用户是否登录,那就不太清楚了。但如果那是我必须做的,我该怎么做。我认为
getAuth()
和 onAuthStateChanged
不太适合这种情况。原因是 getAuth()
似乎只在第一次调用时检查数据库。任何子序列调用它只检查应用程序内存,根本不执行任何网络请求(通过查看控制台网络选项卡验证)。这有点奇怪。并且 onAuthStateChanged
不监听 firebase 状态变化,它只监听我的应用程序是否让用户登录或注销。
关于我正在努力实现的目标的背景知识
- 我希望能够通过更改数据库中的某些内容来将用户锁定在我的应用程序之外。理想情况下不必每隔几秒 PING 一次。
更新:
我的应用程序似乎需要大约 1-2 小时才能自动识别该帐户已被禁用。它花费的时间比我预期的要长得多。我仍然想知道是否有更好的解决方案而不是等待。
Firebase 身份验证结合使用 long-lived 刷新令牌和 short-lived ID 令牌。后一种代币自铸造之日起一小时内有效,铸造后不可作废。
因此,您的客户最多可能需要一个小时才能获得新令牌,并检测到其帐户已被禁用。您可以通过调用 getIDToken(true)
强制客户端随时更新其 ID 令牌。这将确保客户端拥有更新的 ID 令牌,但不会使旧的 ID 令牌失效(因为不可能使不记名令牌失效)。
您要做的是在禁用用户帐户时将 UID 或 ID 令牌写入您的数据库,然后在您的安全规则中进行检查。
另请参阅 detecting token revocation 上的 Firebase 文档。
firebase
firebase-security
firebase-authentication
firebase-realtime-database
google-cloud-firestore
我在我的项目中使用 Firebase Firestore 和 Firebase 身份验证。
我正在测试如果我进入 firebase 控制台并手动单击“禁用帐户”会发生什么情况。
我希望如果帐户被暂停,经过身份验证的用户(在这种情况下为 test@mail.com)将在调用 Firestore 数据库时立即收到错误消息(例如 getDocs(q)
或 setDoc()
).这个假设背后的原因是我假设 Firestore 在执行 CRUD 之前尝试对每个调用进行身份验证。
但是,测试出来后,这里是测试和结果
- 登录用户(test@mail.com)
- 执行数据库读取或写入以确保一切正常
- 转到 firebase 控制台并禁用帐户 (test@mail.com)。
- 尝试进行另一个数据库读取或写入。这里的结果是我仍然能够读写,这不是我所期望的。
这是我的问题
- 这是正常行为吗?
- 我可以编写 Firebase 安全规则来解决这个问题吗?
- 如果我每次执行 firestore 调用时都必须检查用户是否登录,那就不太清楚了。但如果那是我必须做的,我该怎么做。我认为
getAuth()
和onAuthStateChanged
不太适合这种情况。原因是getAuth()
似乎只在第一次调用时检查数据库。任何子序列调用它只检查应用程序内存,根本不执行任何网络请求(通过查看控制台网络选项卡验证)。这有点奇怪。并且onAuthStateChanged
不监听 firebase 状态变化,它只监听我的应用程序是否让用户登录或注销。
关于我正在努力实现的目标的背景知识
- 我希望能够通过更改数据库中的某些内容来将用户锁定在我的应用程序之外。理想情况下不必每隔几秒 PING 一次。
更新:
我的应用程序似乎需要大约 1-2 小时才能自动识别该帐户已被禁用。它花费的时间比我预期的要长得多。我仍然想知道是否有更好的解决方案而不是等待。
Firebase 身份验证结合使用 long-lived 刷新令牌和 short-lived ID 令牌。后一种代币自铸造之日起一小时内有效,铸造后不可作废。
因此,您的客户最多可能需要一个小时才能获得新令牌,并检测到其帐户已被禁用。您可以通过调用 getIDToken(true)
强制客户端随时更新其 ID 令牌。这将确保客户端拥有更新的 ID 令牌,但不会使旧的 ID 令牌失效(因为不可能使不记名令牌失效)。
您要做的是在禁用用户帐户时将 UID 或 ID 令牌写入您的数据库,然后在您的安全规则中进行检查。
另请参阅 detecting token revocation 上的 Firebase 文档。