Firebase规则如何获取request.auth.uid?WorkManager任务提前登出能否执行成功?
任务执行结果结论
不能成功完成。
Firebase SDK的FirebaseAuth实例状态是全局共享的,不受线程影响,不管是主线程还是WorkManager的工作线程,发起Firestore请求时都会读取当前最新的Auth状态作为request.auth字段的取值。
如果任务入队后、实际执行写入前用户已经登出,此时FirebaseAuth的当前登录用户为空,Firestore请求携带的request.auth.uid为null,会直接被基于用户ID校验的安全规则拦截,返回权限拒绝,写入失败。
正确处理方案
- 入队前置校验
往WorkManager队列添加任务前,先检查FirebaseAuth.getInstance().getCurrentUser()是否为空,无登录用户时直接不触发入队逻辑,同步告知用户操作失败。 - 执行前置校验
在自定义Worker的doWork()方法最开头,先校验当前登录用户状态,若用户已登出直接返回Result.failure(),无需发起后续Firestore请求。 - 任务与用户身份绑定(适配需持久化重试的场景)
创建WorkRequest时将当前登录用户的uid作为参数传入Worker,任务执行时额外校验当前登录用户的uid与传入的参数是否一致:若一致则正常执行写入;若不一致(如登出后切换了其他账号)直接标记任务失败,避免写入到错误的用户账号下。
同时可以给每个用户的任务添加专属标签,用户登出时调用WorkManager.cancelAllWorkByTag()直接取消该用户的所有未执行任务,避免资源浪费。 - 权限异常捕获
执行Firestore写入操作时主动捕获FirebaseFirestoreException,若异常错误码为PERMISSION_DENIED直接返回任务失败,无需触发重试逻辑。
内容的提问来源于stack exchange,提问作者Sourav Kannantha B
相关产品推荐
相关产品推荐

