I’m trying to configure firebase-admin SDK on my nextjs + TS project. Whenever i try to invoke any SDK function, i get a webAssembly error. In my case, i am trying to configure a middleware for the server side api, and when i call the verifyIdToken method it throws the error. Has anyone faced similar errors ? How can i fix this ?
Below is my middleware.ts
file:
import { auth } from "./lib/config/firebaseConfig";
import { NextResponse } from "next/server";
import { NextRequest } from "next/server";
interface ExtendedNextRequest extends NextRequest {
uid?: string;
}
export async function middleware(req: ExtendedNextRequest, res: NextResponse) {
try {
let token = req.headers.get("Authorization");
if (!token)
return NextResponse.json({ message: "Access Denied" }, { status: 403 });
if (token.startsWith("Bearer ")) {
token = token.split(" ")[1];
}
let decodedToken = await auth.verifyIdToken(token);
let uid = decodedToken.uid;
req.uid = uid;
return NextResponse.next();
} catch (error: any) {
console.log(error.errorInfo);
return NextResponse.json({ message: "Invalid Token" }, { status: 401 });
}
}
Below is the error i recieve:
⨯ ./node_modules/farmhash-modern/bin/bundler/farmhash_modern_bg.wasm
Module parse failed: Unexpected character '' (1:0)
The module seem to be a WebAssembly module, but module is not flagged as WebAssembly module for webpack.
BREAKING CHANGE: Since webpack 5 WebAssembly is not enabled by default and flagged as experimental feature.
You need to enable one of the WebAssembly experiments via 'experiments.asyncWebAssembly: true' (based on async modules) or 'experiments.syncWebAssembly: true' (like webpack 4, deprecated).
For files that transpile to WebAssembly, make sure to set the module type in the 'module.rules' section of the config (e. g. 'type: "webassembly/async"').
(Source code omitted for this binary file)
Import trace for requested module:
./node_modules/farmhash-modern/bin/bundler/farmhash_modern_bg.wasm
./node_modules/farmhash-modern/bin/bundler/farmhash_modern.js
./node_modules/farmhash-modern/lib/browser.js
./node_modules/firebase-admin/lib/remote-config/condition-evaluator-internal.js
./node_modules/firebase-admin/lib/remote-config/remote-config.js
./node_modules/firebase-admin/lib/app/firebase-namespace.js
./node_modules/firebase-admin/lib/default-namespace.js
./node_modules/firebase-admin/lib/index.js
./lib/config/firebaseConfig.ts
2
Answers
I have not managed to find the cause of the problem, but it seems that calling admin functions inside the middleware is buggy. A quick workaround is to create an API endpoint that returns the uid of the user connected with a session. Then you can call the endpoint inside the middleware to get the uid.
This fails because
middleware.ts
is executed by Vercel as an edge function, which is not a full Node environment. One solution would be to move your authentication calls out of the middleware and instead authenticate the user at the beginning of a standard serverless function.There’s more discussion over at https://github.com/firebase/firebase-admin-node/issues/2627. A library that tries to solve this issue is https://github.com/awinogrodzki/next-firebase-auth-edge but I haven’t tested it myself.