Mensaje de error
jwt issuer invalid. expected: https://login.example.com/
El texto que sigue a «expected:» es lo que hayas configurado; con un array de emisores, los valores se unen con comas.
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
Qué significa
El claim (declaración) `iss` del token no es igual a la opción `issuer` que pasas a `jwt.verify()` (o el token no tiene `iss` en absoluto). El texto que sigue a «expected:» es el valor de tu configuración, no el del token. jsonwebtoken compara las cadenas de forma exacta, así que la firma es válida, pero el token dice venir de un origen en el que tu servicio no confía.
Por qué ocurre
El mismo emisor, escrito de otra forma
frecuenteUna barra final, http frente a https, el host en mayúsculas o un segmento de ruta que falta (`/realms/main`, `/v2.0`, `/oauth2/default`). Los proveedores de identidad escriben `iss` exactamente igual que el `issuer` de su documento de descubrimiento; el verificador debe usar la misma cadena.
El token no tiene claim iss
ocasionalLos servicios internos de tokens suelen omitir `iss`. Con la opción `issuer` establecida, la ausencia del claim produce el mismo mensaje, porque no hay nada con lo que comparar.
El token viene realmente de otro emisor
ocasionalUn token de otro inquilino, entorno o proveedor. Aquí el error es señal de que la protección funciona: sigue rechazándolo.
Cómo solucionarlo
- 1.
Imprimir el iss del token como JSON
`JSON.stringify` hace visibles las diferencias invisibles: barras finales, espacios en blanco, otra ruta. Después, copia el `issuer` del proveedor de `/.well-known/openid-configuration` a tu configuración.
js const { iss } = jwt.decode(token) ?? {}; console.log(JSON.stringify(iss)); // compare byte for byte with your issuer option - 2.
Aceptar varios emisores solo de forma deliberada
La opción `issuer` acepta un array. Úsalo para una migración planificada entre dos formas de escribir el emisor o entre emisores que controlas, y asocia cada emisor con sus propias claves.
js jwt.verify(token, publicKey, { algorithms: ["ES256"], issuer: ["https://login.example.com/", "https://login.example.com"], // during a migration only });