在Firebase中,每次调用都去检查一个用户是否存在,这样做成本高吗?
我有一个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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。