firebase / firebase/firebase-admin-node

[Firebase v14] App Check verifyToken crashes with ERR_REQUIRE_ESM (jwks-rsa@4 require()s ESM-only jose@6)

Abierto
#3,181 2 comentarios 5 reacciones 1 asignado Reclamado por @jonathanedey Ver en GitHub
api: appcheck
Lenguaje dominante
TypeScript
Estrellas
1.7k
Forks
419
Merge medio
3 d 10 h
PR fusionados (30 d)
16

Descripción

## Summary

`getAppCheck().verifyToken()` throws `ERR_REQUIRE_ESM` in a CommonJS/serverless runtime. The transitive dep `jwks-rsa@4.0.1` does `const jose = require('jose')` but declares `jose@^6.1.3`, and jose@6 is ESM-only, so the `require()` is a hard Node error.

## Error
```
Error [ERR_REQUIRE_ESM]: require() of ES Module
node_modules/.pnpm/jose@6.2.3/node_modules/jose/dist/webapi/index.js
from node_modules/.pnpm/jwks-rsa@4.0.1/node_modules/jwks-rsa/src/utils.js
not supported.
```

## Root cause (verified)
1. `firebase-admin@14.0.0` App Check verification depends on `jwks-rsa@4.0.1`.
2. `jwks-rsa@4.0.1` declares `"jose": "^6.1.3"` and loads it via CommonJS in `src/utils.js`:
```js
const jose = require('jose');
```
3. `jose@6.2.3` is ESM-only (`"type": "module"`, no `require` export condition).
4. Node refuses `require()` of an ESM module, so any path reaching App Check JWKS verification crashes.

`jwks-rsa@4.0.1` is internally inconsistent: a CommonJS `require('jose')` paired with a `jose` range whose only satisfying versions are ESM-only. `firebase-admin` ships this combination. It only uses `jose.importJWK` and `jose.exportSPKI`, which are API-identical across jose 4/5/6.

## Why production only
Dev uses an ESM-capable loader, so the import resolves via interop. In a production CommonJS/serverless bundle (`firebase-admin` is externalized and loaded with `require()`), the `require()`-of-ESM hits the hard error.

## Environment
- firebase-admin: 14.0.0
- jwks-rsa: 4.0.1 (transitive)
- jose resolved: 6.2.3 (ESM-only)
- Node.js 20+, CommonJS context, serverless (Vercel), Next.js 16, pnpm 11

## Expected
App Check verification works in a CommonJS/serverless runtime without manual dependency overrides.

## Suggested fix
Move `jwks-rsa` to a version that loads `jose` via dynamic `import()`, or constrain `jose` to a dual CJS/ESM build (`^4`/`^5`), or pin/patch `jwks-rsa`'s `jose` in `firebase-admin`.

## Workaround (consumer side)
```yaml
# pnpm-workspace.yaml
overrides:
jwks-rsa>jose: "4.15.9"
```

Guía de contribución

Abrir la guía de contribución

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.