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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:46:51