You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:22:38