在Firebase中,每次调用都去检查一个用户是否存在,这样做成本高吗?

移动开发 2026-07-10

我有一个Laravel后端,用来支撑我的Flutter应用,在Android和 iOS上。身份验证我使用Firebase,令牌大约有效一个小时。

现在的问题是,必须能够在应用内和网页端同时删除账户。因此如果你在网页端删除账户时,仍然在应用内登录,应用仍然可以与后端通信,因为令牌仍然有效。

因此我的中间件做了这样的事:

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);
    }

这意味着如果用户被删除,请求仍然有效。我本来可以在每次调用时都这样做,然后在Firebase表示用户已被删除时返回相应结果:
$this->firebaseAuth->getUser($uid);

但这么做看起来不太直觉。每次API调用都去检查用户是不是已被删除,成本是不是太高了?

问题在于,我需要在应用中,在下一次API调用时检测到用户已被删除,然后将其登出,并从数据中清除一些远程ID。对此你们有什么想法吗?

解决方案

正如文档所建议的那样,令牌验证所做的唯一事情就是解析JWT,确保它是正确的,并把其中的数据交给你。解析一小段数据在现实中不会造成问题,在任何平台的这类中间件中都非常常见。第一步可能有点慢,但之后应该完全基于内存数据进行处理。

如果你仍然担心这个问题(也许你应该做一些基准测试以更清楚地了解),你可以缓存验证结果,在未来遇到同一个ID令牌时重复使用。它将是一个简单的内存哈希表查找,可以把原始令牌数据作为键,你当然需要确保对条目进行适当的过期处理。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章