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

如何在Vercel Edge Functions中验证Firebase Auth ID Token?

在Vercel Edge Functions中验证Firebase ID Token并获取用户信息

因为Vercel Edge Functions不兼容Firebase Admin SDK,我们可以用标准JWT工具库手动完成ID Token验证,下面是完整实现方案:

1. 选择适配的JWT库

推荐用jose——轻量、现代的JWT工具库,完美适配Edge环境,无兼容性问题。安装命令:

npm install jose

2. 核心验证逻辑

Firebase ID Token是标准JWT,验证需完成3件事:

  • 从请求头提取Token(通常在Authorization: Bearer <token>中)
  • 用Firebase公钥验证签名、Issuer、Audience等字段合法性
  • 解码后直接从Payload中提取用户信息

3. 完整代码示例

import { jwtVerify, createRemoteJWKSet } from 'jose';

// 替换为你的Firebase项目ID,建议存到Vercel环境变量中
const FIREBASE_PROJECT_ID = process.env.FIREBASE_PROJECT_ID || 'your-project-id';

// 自动获取并缓存Firebase公钥集合
const jwks = createRemoteJWKSet(
  new URL('https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com')
);

export default async function handler(request: Request) {
  // 提取ID Token
  const authHeader = request.headers.get('Authorization');
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return new Response('Unauthorized', { status: 401 });
  }
  const idToken = authHeader.split(' ')[1];

  try {
    // 验证Token合法性
    const { payload } = await jwtVerify(idToken, jwks, {
      issuer: `https://securetoken.google.com/${FIREBASE_PROJECT_ID}`,
      audience: FIREBASE_PROJECT_ID,
    });

    // 提取用户核心信息
    const userInfo = {
      uid: payload.sub, // Firebase的uid对应JWT的sub字段
      email: payload.email,
      name: payload.name,
      emailVerified: payload.email_verified,
      // 自定义声明直接从Payload中提取(比如你设置的role字段)
      customClaims: {
        role: payload.role,
        // 其他自定义字段同理
      }
    };

    // 后续业务逻辑,示例:返回用户信息
    return new Response(JSON.stringify(userInfo), {
      headers: { 'Content-Type': 'application/json' },
      status: 200,
    });
  } catch (err) {
    // Token验证失败(过期、签名无效、iss/aud不匹配等)
    return new Response('Invalid or expired token', { status: 401 });
  }
}

// 指定运行时为Edge Functions
export const config = {
  runtime: 'edge',
};

关键注意事项

  • 公钥缓存:createRemoteJWKSet会自动缓存Firebase公钥,无需手动处理,大幅提升请求性能
  • 环境变量:Firebase项目ID需存到Vercel环境变量中,避免硬编码泄露敏感信息
  • 错误处理:所有验证失败场景(Token过期、签名错误等)都会抛出异常,直接返回401即可
  • 自定义声明:通过Firebase Admin SDK或控制台设置的自定义声明,会直接出现在JWT Payload中,直接取值即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:52:53