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

Next.js中间件集成firebase-admin失败:Edge Runtime不支持os模块

解决Next.js中间件中firebase-admin依赖Node.js模块报错的问题

方案一:切换中间件到Node.js Runtime

Next.js中间件默认使用Edge Runtime,而firebase-admin依赖Node.js核心模块(如os),直接切换到Node.js Runtime即可解决:

  1. 在你的middleware.ts文件顶部添加以下代码,指定运行时为Node.js:
export const runtime = 'nodejs';
  1. 重启Next.js开发服务器,原有firebase-admin的认证逻辑即可正常运行。

方案二:Edge Runtime下手动验证Firebase ID Token(无需firebase-admin)

如果想保留Edge Runtime的性能优势,可以不用firebase-admin,改用jose库直接验证Firebase ID Token:

  1. 安装依赖:
npm install jose
  1. 在middleware中实现验证逻辑:
import { NextResponse } from 'next/server';
import { jwtVerify } from 'jose';

// 获取Firebase公钥用于验证Token签名
async function getFirebasePublicKey(kid: string) {
  const keyResponse = await fetch('https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com');
  const publicKeys = await keyResponse.json();
  return publicKeys[kid];
}

export async function middleware(request: Request) {
  const authHeader = request.headers.get('Authorization');
  // 检查请求头是否包含有效的Bearer Token
  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return new Response('Unauthorized', { status: 401 });
  }

  const token = authHeader.split(' ')[1];

  try {
    // 验证Token的签名和有效性
    await jwtVerify(token, async (header) => {
      const publicKey = await getFirebasePublicKey(header.kid!);
      return new TextEncoder().encode(publicKey);
    });

    // 验证通过,继续处理请求
    return NextResponse.next();
  } catch (error) {
    // 验证失败,返回401
    return new Response('Unauthorized', { status: 401 });
  }
}

报错原因说明

Next.js中间件默认的Edge Runtime基于V8引擎,仅支持Web标准API,不兼容Node.js核心模块(如os、fs)。而firebase-admin是为Node.js环境开发的SDK,内部依赖这些Node.js专属模块,因此在Edge Runtime中会触发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:05:23