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
相关产品推荐
相关产品推荐

