如何从Express托管的Firebase Function中提取认证信息?
实现方法
你可以通过验证Firebase Auth ID令牌的方式,自动从请求中提取用户的UID、邮箱、电话以及自定义声明,无需手动在请求参数/体里传递信息。具体实现步骤如下:
1. 基础准备
确保你的Firebase Functions项目已经初始化firebase-admin,Functions环境下默认会自动完成服务账号配置,无需额外本地配置。
2. 编写身份验证中间件
创建一个Express中间件,负责从请求头提取并验证ID令牌,解码后将用户信息挂载到req对象上:
const admin = require('firebase-admin'); admin.initializeApp(); // 身份验证中间件 const authenticateUser = async (req, res, next) => { const authHeader = req.headers.authorization; if (!authHeader || !authHeader.startsWith('Bearer ')) { return res.status(401).json({ error: '未提供有效的身份令牌' }); } const idToken = authHeader.split('Bearer ')[1]; try { const decodedToken = await admin.auth().verifyIdToken(idToken); req.user = decodedToken; next(); } catch (error) { return res.status(401).json({ error: '身份令牌无效或已过期' }); } };
3. 在Express路由中使用中间件
将中间件应用到需要获取用户信息的路由,之后就能直接从req.user读取所需数据:
const functions = require('firebase-functions'); const express = require('express'); const app = express(); // 给特定路由应用身份验证中间件 app.get('/api/user-info', authenticateUser, (req, res) => { const { uid, email, phoneNumber, customClaims } = req.user; // 提取自定义声明中的特定字段,比如示例里的role const userRole = customClaims?.role || '普通用户'; res.json({ uid, email, phoneNumber, userRole, allCustomClaims: customClaims }); }); // 将Express应用托管为Firebase Function exports.app = functions.https.onRequest(app);
关键说明
- 令牌传递:客户端需通过
firebase.auth().currentUser.getIdToken()获取ID令牌,请求时放在Authorization: Bearer <idToken>请求头中。 - 数据字段:解码后的
req.user包含uid、email、phoneNumber(若用户已设置)、customClaims(自定义声明对象)等核心信息,无需额外调用Auth API查询。 - 性能优化:
verifyIdToken会缓存验证结果,同一有效令牌的重复请求不会重复调用Auth服务,性能开销极低。
内容的提问来源于stack exchange,提问作者starleaf1
相关产品推荐
相关产品推荐

