Node.js后端+Firebase认证:首次请求判断用户登录状态方案
解决方案:服务器端首次请求判断Firebase认证状态并渲染EJS模板
咱们完全不用依赖AJAX就能实现首次请求就渲染对应链接,核心思路是让客户端在请求时带上Firebase的认证令牌,服务器端用Firebase Admin SDK验证令牌有效性,拿到用户状态后直接传给EJS模板。下面是具体落地步骤:
1. 配置Firebase Admin SDK
先在你的Node.js项目里安装并初始化Firebase Admin,这是服务器端验证令牌的核心工具:
npm install firebase-admin
创建单独的初始化文件(比如firebase-admin.js):
const admin = require('firebase-admin'); const serviceAccount = require('./path-to-your-service-account-key.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), databaseURL: 'https://your-project-id.firebaseio.com' // 替换成你的项目实际URL }); module.exports = admin;
2. 客户端存储并自动携带认证令牌
用户通过Firebase登录成功后,把ID令牌存在Cookie里——这样浏览器每次发请求都会自动带上这个Cookie,不用手动处理请求头:
firebase.auth().currentUser.getIdToken(true) .then(idToken => { // 设置Cookie有效期和Firebase令牌一致(默认1小时),同时开启安全属性 document.cookie = `firebase-token=${idToken}; max-age=3600; path=/; secure; SameSite=Strict`; }) .catch(error => { console.error('获取认证令牌失败:', error); });
用户登出时记得清除Cookie:
firebase.auth().signOut().then(() => { document.cookie = 'firebase-token=; max-age=0; path=/'; });
3. 写中间件验证令牌并传递登录状态
创建一个Express中间件,每次请求时从Cookie里取令牌、验证有效性,然后把登录状态挂载到模板变量里:
const admin = require('./firebase-admin'); const cookieParser = require('cookie-parser'); // 先安装cookie-parser:npm install cookie-parser async function checkAuth(req, res, next) { const idToken = req.cookies['firebase-token']; let isAuthenticated = false; if (idToken) { try { // 验证令牌合法性,自动检查过期时间 await admin.auth().verifyIdToken(idToken); isAuthenticated = true; } catch (error) { // 令牌无效时清除Cookie,避免后续请求重复携带无效令牌 res.clearCookie('firebase-token'); console.error('令牌验证失败:', error); } } // 把登录状态传给EJS模板,所有路由都能直接用 res.locals.isAuthenticated = isAuthenticated; next(); }
然后把中间件应用到所有路由:
const express = require('express'); const app = express(); app.use(cookieParser()); app.use(checkAuth); // 配置EJS模板引擎 app.set('view engine', 'ejs');
4. EJS模板中根据状态渲染对应链接
在你的模板文件(比如header.ejs)里,直接用isAuthenticated变量判断渲染内容:
<nav class="header-nav"> <% if (isAuthenticated) { %> <a href="/logout" class="nav-link">登出</a> <% } else { %> <a href="/login" class="nav-link">登录</a> <% } %> </nav>
5. 服务器端处理登出路由
登出时只需要清除Cookie并重定向即可:
app.get('/logout', (req, res) => { res.clearCookie('firebase-token'); res.redirect('/'); });
补充说明
- 也可以用请求头携带令牌:让客户端把令牌放在
Authorization: Bearer <token>头里,服务器端从req.headers.authorization取出验证,原理和Cookie一致,只是Cookie更适合浏览器自动携带的场景。 - Firebase令牌默认1小时过期,客户端的Firebase Auth SDK会自动刷新令牌,记得在刷新后更新Cookie,避免用户莫名登出。
这样用户首次访问页面时,服务器就能同步判断登录状态,直接渲染对应的链接,完全不需要异步AJAX请求~
内容的提问来源于stack exchange,提问作者Rafael Marchesini Macario
相关产品推荐
相关产品推荐

