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即可解决:
- 在你的
middleware.ts文件顶部添加以下代码,指定运行时为Node.js:
export const runtime = 'nodejs';
- 重启Next.js开发服务器,原有firebase-admin的认证逻辑即可正常运行。
方案二:Edge Runtime下手动验证Firebase ID Token(无需firebase-admin)
如果想保留Edge Runtime的性能优势,可以不用firebase-admin,改用jose库直接验证Firebase ID Token:
- 安装依赖:
npm install jose
- 在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
相关产品推荐
相关产品推荐

