Mensagem de erro
Expected a different algorithm (JWT::IncorrectAlgorithm)
Também aparece como
- JWT::IncorrectAlgorithm: Expected a different algorithm
ruby-jwt (Ruby) — JWT::IncorrectAlgorithm from JWT.decode
O que significa
O cabeçalho `alg` do token não está entre os algoritmos que você permitiu — e, se você não passou nenhuma opção `algorithm:`/`algorithms:`, o ruby-jwt não permite nenhum. Desde o ruby-jwt 2.x, o verificador precisa indicar o algoritmo explicitamente, porque confiar no próprio cabeçalho do token é a origem dos conhecidos ataques de confusão de algoritmo. A assinatura não foi verificada.
Por que acontece
Nenhum algoritmo passado para JWT.decode
comumO código de tutoriais do ruby-jwt 1.x chama `JWT.decode(token, key, true)`. Nesse caso, as versões atuais rejeitam todo token com este erro.
O emissor usa um algoritmo diferente do configurado
comumUma migração de RS256 para ES256 (ou de HS256 para um algoritmo assimétrico) do lado do emissor quebra os verificadores que ainda fixam o valor antigo.
Um token de outro emissor, ou uma sondagem
ocasionalTokens com `alg: none` ou `HS256` enviados a uma API que verifica RS256/ES256 são rejeitados aqui — como deve ser.
Como corrigir
- 1.
Indicar explicitamente o algoritmo do emissor
Passe `algorithm:` (ou `algorithms:` para uma lista curta). Com vários algoritmos, use uma função de carregamento de JWKS para que cada token seja verificado com uma chave do tipo correspondente.
ruby payload, header = JWT.decode(token, public_key, true, algorithm: "ES256") # several allowed algorithms (e.g. during a migration), each matched to the right key type: payload, header = JWT.decode(token, nil, true, algorithms: ["ES256", "RS256"], jwks: jwks_loader)