Firebase Functions中间件:结合Firebase Auth处理前端请求问题
解决Firebase函数中间件根据Auth登录状态重定向的问题
我完全懂你的困扰——当用户直接从前端发起请求时,没法像后端接口那样手动加Auth头或者依赖手动处理__session Cookie,对吧?其实Firebase已经帮我们做好了大部分自动处理的工作,下面是具体的实现方案:
核心思路
Firebase Auth在用户登录后,会自动在浏览器中设置一个__session Cookie(如果你用Firebase Hosting托管前端的话),这个Cookie里包含了用户的ID Token。我们的HTTP函数可以直接从请求中提取这个Cookie,然后用Firebase Admin SDK验证Token的有效性,从而判断用户是否已登录,再决定重定向到静态SSR还是动态版本。
步骤1:初始化Firebase Admin SDK
首先在你的函数项目里确保已安装依赖并初始化Admin:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp();
步骤2:编写中间件函数逻辑
下面是完整的函数代码,包含Cookie提取、Token验证和重定向逻辑:
exports.requestRouter = functions.https.onRequest(async (req, res) => { // 从请求中提取__session Cookie const sessionCookie = req.cookies.__session; let isAuthenticated = false; if (sessionCookie) { try { // 验证ID Token,设置过期时间容错(比如5分钟) const decodedToken = await admin.auth().verifyIdToken(sessionCookie, true); isAuthenticated = true; // 这里可以获取用户信息,比如decodedToken.uid、decodedToken.email等 functions.logger.info(`用户 ${decodedToken.uid} 已登录`); } catch (error) { // Token无效或已过期,视为未登录 functions.logger.error('Token验证失败:', error); isAuthenticated = false; } } // 根据登录状态决定重定向目标 if (isAuthenticated) { // 已登录:重定向到动态版本(比如你的动态SSR或客户端渲染页面) res.redirect('https://your-domain.com/dynamic'); } else { // 未登录:重定向到静态SSR版本 res.redirect('https://your-domain.com/static-ssr'); } });
步骤3:配置Firebase Hosting路由
要让所有前端请求都经过这个中间件函数,需要在firebase.json里设置路由规则:
{ "hosting": { "rewrites": [ { "source": "**", "function": "requestRouter" } ] } }
额外说明
- 如果你的前端不是托管在Firebase Hosting上,那需要让前端在用户登录后,手动将ID Token存入Cookie(比如命名为
__session),或者通过Authorization: Bearer <id-token>的请求头传递,然后在函数里对应提取验证即可。 - 验证Token时的第二个参数
true是启用过期时间的宽松验证,避免因为网络延迟导致的Token刚过期就验证失败,你可以根据需求调整。 - 记得在函数部署前,确保已正确配置Firebase项目的权限,Admin SDK默认初始化后就具备验证Token的权限。
这样一来,用户直接发起的前端请求就会自动经过这个中间件,根据登录状态被路由到对应的版本啦!
内容的提问来源于stack exchange,提问作者jirungaray
相关产品推荐
相关产品推荐

