Mensagem de erro
jwt issuer invalid. expected: https://login.example.com/
O texto após “expected:” é o que você configurou; com um array de emissores, os valores aparecem separados por vírgulas.
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
O que significa
A claim `iss` do token não é igual à opção `issuer` que você passou para `jwt.verify()` (ou o token nem tem `iss`). O texto após “expected:” é o valor que você configurou, não o do token. O jsonwebtoken compara strings de forma exata; portanto, a assinatura é válida, mas o token afirma vir de um lugar em que seu serviço não confia.
Por que acontece
Mesmo emissor, grafia diferente
comumUma barra final, diferença entre http e https, host em maiúsculas ou um segmento de caminho ausente (`/realms/main`, `/v2.0`, `/oauth2/default`). Os provedores de identidade gravam o `iss` exatamente como o `issuer` do documento de descoberta deles; o verificador precisa usar a mesma string.
O token não tem a claim iss
ocasionalServiços internos de tokens muitas vezes omitem o `iss`. Com a opção `issuer` definida, um token sem essa claim falha com a mesma mensagem, porque não há nada para comparar.
O token realmente vem de outro emissor
ocasionalUm token de outro locatário, ambiente ou provedor. Aqui o erro é a proteção funcionando: continue rejeitando o token.
Como corrigir
- 1.
Imprimir o iss do token como JSON
`JSON.stringify` torna visíveis diferenças invisíveis — barras finais, espaços em branco, um caminho diferente. Em seguida, copie o `issuer` do provedor de `/.well-known/openid-configuration` para sua configuração.
js const { iss } = jwt.decode(token) ?? {}; console.log(JSON.stringify(iss)); // compare byte for byte with your issuer option - 2.
Aceitar vários emissores só de forma deliberada
A opção `issuer` aceita um array. Use-o para uma migração planejada entre duas grafias ou entre emissores que você controla — e associe cada emissor às próprias chaves.
js jwt.verify(token, publicKey, { algorithms: ["ES256"], issuer: ["https://login.example.com/", "https://login.example.com"], // during a migration only });