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

FirebaseUI-Web:Node.js(Express.js)后端如何识别请求API的登录用户?

我之前搭建SPA的时候正好用了FirebaseUI + Express后端的组合,这个问题核心就是通过Firebase ID Token完成前后端的身份校验,给你一步步拆解并附上代码示例:

一、前端:获取Firebase ID Token并在请求中携带

FirebaseUI登录成功后,你可以通过Firebase Auth SDK获取用户的ID Token,然后在调用Express API时,把这个token放到HTTP请求的Authorization头里(格式是Bearer <token>)。

示例代码:

// 监听登录状态变化,获取并存储ID Token
firebase.auth().onAuthStateChanged((user) => {
  if (user) {
    // 获取ID Token(默认有效期1小时,过期前可自动刷新)
    user.getIdToken().then((idToken) => {
      localStorage.setItem('firebaseIdToken', idToken);
    });
  } else {
    localStorage.removeItem('firebaseIdToken');
  }
});

// 调用后端API时携带Token
async function fetchProtectedData() {
  const idToken = localStorage.getItem('firebaseIdToken');
  const response = await fetch('/api/user/profile', {
    method: 'GET',
    headers: {
      'Authorization': `Bearer ${idToken}`
    }
  });
  const data = await response.json();
  console.log('用户信息:', data);
}
二、后端:安装并初始化Firebase Admin SDK

首先需要安装firebase-admin包,然后用你的Firebase项目的服务账号密钥初始化SDK(密钥可以从Firebase控制台「设置」>「服务账号」页面下载)。

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

module.exports = admin;
三、编写Express中间件验证Token

写一个中间件函数,负责从请求头提取Token并验证,验证通过后将用户信息附加到req对象上,供后续路由使用。

const admin = require('./firebase-admin');

async function verifyFirebaseToken(req, res, next) {
  try {
    // 从Authorization头提取Token
    const authHeader = req.headers.authorization;
    if (!authHeader || !authHeader.startsWith('Bearer ')) {
      return res.status(401).json({ message: '未提供有效身份凭证' });
    }
    const idToken = authHeader.split(' ')[1];

    // 验证Token合法性
    const decodedToken = await admin.auth().verifyIdToken(idToken);
    // 将解码后的用户信息挂载到req对象
    req.user = decodedToken;
    next(); // 验证通过,进入下一个路由/中间件
  } catch (error) {
    console.error('Token验证失败:', error);
    return res.status(403).json({ message: 'Token无效或已过期' });
  }
}

module.exports = verifyFirebaseToken;
四、在API路由中使用中间件

现在你可以在需要保护的API路由上使用这个中间件,只有验证通过的用户才能访问:

const express = require('express');
const router = express.Router();
const verifyFirebaseToken = require('./verifyFirebaseToken');

// 受保护的用户信息接口
router.get('/user/profile', verifyFirebaseToken, (req, res) => {
  // req.user包含用户UID、邮箱、是否验证邮箱等核心信息
  res.json({
    message: '访问受保护资源成功',
    userInfo: {
      uid: req.user.uid,
      email: req.user.email,
      emailVerified: req.user.email_verified
    }
  });
});

module.exports = router;
额外注意事项
  • Token有效期为1小时,前端可以监听onIdTokenChanged事件自动刷新Token,避免过期后请求失败。
  • 后端服务账号密钥要妥善保管,生产环境建议用环境变量加载(比如process.env.FIREBASE_SERVICE_ACCOUNT)。
  • 如果需要存储自定义用户数据,可以结合Firebase实时数据库或Firestore,用用户UID作为关联键。

内容的提问来源于stack exchange,提问作者jin chong

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:47:58