Перейти к содержимому
ecdsa.com
ruby-jwt (Ruby)Ruby

Сообщение об ошибке

Signature verification failed (JWT::VerificationError)

Также выводится как

  • JWT::VerificationError: Signature verification failed

Если исключение не перехвачено, Ruby выводит место, где возникла ошибка, а за ним — «Signature verification failed (JWT::VerificationError)»; текст одинаков в ruby-jwt 2.10 и 3.3.

ruby-jwt (Ruby) — JWT::VerificationError from JWT.decode

Что это означает

ruby-jwt декодировал токен и проверил его подпись переданным ключом, но проверка не прошла. Токен корректно сформирован, алгоритм разрешён, а ключ не принадлежит подписанту или токен изменили. `JWT::VerificationError` — подкласс `JWT::DecodeError`, поэтому `rescue JWT::DecodeError` перехватывает её вместе с ошибками некорректного токена.

Почему это происходит

Как исправить

  1. 1.

    Выбирайте ключи по kid из JWKS издателя

    Параметр `jwks:` принимает загрузчик; если в токене указан неизвестный ключ, ruby-jwt вызывает загрузчик повторно с `kid_not_found: true`, поэтому ротация ключей подхватывается.

    ruby
    require "jwt"
    require "net/http"
    
    jwks_loader = ->(options) do
      @jwks = nil if options[:kid_not_found] && @jwks_loaded_at.to_i < Time.now.to_i - 300 # refetch on rotation
      @jwks ||= begin
        @jwks_loaded_at = Time.now.to_i
        JSON.parse(Net::HTTP.get(URI("https://issuer.example.com/.well-known/jwks.json")))
      end
    end
    
    payload, header = JWT.decode(token, nil, true, algorithms: ["ES256"], jwks: jwks_loader,
                                 iss: "https://issuer.example.com/", verify_iss: true)
  2. 2.

    Убедитесь, что ключи совпадают

    Если хеши открытых половин совпадают, ключ ни при чём; тогда ищите изменения токена при передаче.

    bash
    openssl pkey -in issuer-private.pem -pubout | sha256sum
    openssl pkey -pubin -in configured-public.pem | sha256sum   # must be identical

Связанные ошибки

Открыть всю базу ошибок подписей