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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 06:52:42