Laravel集成Firebase Auth:每次API调用校验用户存在性是否成本过高?
账号删除后仍能通过有效Token访问API的解决方案
我有一个为Android和iOS平台的Flutter应用提供服务的Laravel后端,使用Firebase进行身份验证,Token有效期约1小时。当前遇到的问题是:用户可在应用端和网页端删除账号。若用户在网页端删除账号时,应用仍处于登录状态,由于Token仍有效,应用仍能与后端通信。
我的中间件代码如下:
public function handle(Request $request, Closure $next): mixed { $token = $request->bearerToken(); if (!$token) { return response()->json(['error_message' => 'Unauthorized'], 401); } try { $verifiedToken = $this->firebaseAuth->verifyIdToken($token); $uid = $verifiedToken->claims()->get('sub'); $claims = $verifiedToken->claims()->all(); $lastSignInProvider = $claims['firebase']['sign_in_provider'] ?? null; $request->attributes->set('firebase_uid', $uid); $request->attributes->set('firebase_claims', $claims); $request->attributes->set('last_sign_in_provider', $lastSignInProvider); Log::info('Firebase Auth Middleware', ['user' => $uid, 'claims' => $claims]); $request->setUserResolver(function () use ($uid) { return $uid; }); } catch (Throwable $e) { Log::warning('FirebaseAuthMiddleware: Failed to verify token', ['error' => $e->getMessage()]); return response()->json(['error_message' => 'Unauthorized'], 401); } return $next($request); }
这意味着即使用户账号已被删除,API调用仍会被视为有效。我考虑在每次调用时执行$this->firebaseAuth->getUser($uid);,若Firebase返回用户不存在则告知用户账号已删除,但这样做感觉违背直觉——每次API调用都校验用户存在性的成本肯定很高吧?
我需要实现的是:当用户账号被删除后,在应用的下一次API调用时做出响应,登出用户并清理数据中的相关远程ID,请问有什么解决方案?
解决方案
1. 缓存用户状态,降低Firebase调用频率
每次API调用都调用Firebase的getUser确实会增加请求开销,但可以通过本地缓存优化:
- 用Redis或Laravel内置缓存存储用户存在状态,缓存有效期设为略短于Token有效期(比如55分钟)
- 中间件优先检查缓存:若缓存标记用户已删除,直接返回账号删除响应;若缓存有效则跳过Firebase调用;缓存不存在时再调用
getUser并更新缓存 - 用户删除账号时,主动清除该用户的缓存并标记为已删除
2. 删除账号时主动通知客户端
- 在账号删除接口触发事件,通过Firebase Cloud Messaging向该用户的所有活跃设备发送推送通知
- 客户端收到推送后立即执行登出,清理本地Token和用户数据,无需等待下一次API调用
3. 结合本地数据库维护用户状态
- 在Laravel数据库中新增
firebase_uid和is_deleted字段,关联Firebase用户ID与本地状态 - 用户删除账号时,同步将
is_deleted设为true - 中间件验证Token后,先查询本地数据库的
is_deleted状态:若为true则返回账号删除响应,完全避免额外的Firebase调用
4. 利用Firebase的Refresh Token撤销机制
- 删除账号时调用Firebase的
revokeRefreshTokens($uid)方法,禁止用户获取新的ID Token - 结合缓存策略,标记用户已删除,覆盖旧Token剩余的有效期,确保Token过期后无法续期
响应处理规范
无论采用哪种方案,后端检测到账号已删除时,应返回明确的错误码(如410 Gone)和自定义消息(例如"error_message": "Account has been deleted"),客户端收到后:
- 清除本地存储的Token及用户数据
- 自动跳转到登录页面
内容的提问来源于stack exchange,提问作者Christoffer
相关产品推荐
相关产品推荐

