Сообщение об ошибке
token is unverifiable: error while executing keyfunc: kid "2026-10" not found in key set
Также выводится как
- token is unverifiable: error while executing keyfunc
- token is unverifiable: no keyfunc was provided
Текст после «error while executing keyfunc:» — это то, что вернула ваша Keyfunc. Вызов `jwt.Parse` с Keyfunc, равной nil, даёт «token is unverifiable: no keyfunc was provided».
golang-jwt/jwt (Go) — jwt.ErrTokenUnverifiable wrapping the error your Keyfunc returned
Что это означает
golang-jwt не смог получить ключ для проверки токена: ваша `Keyfunc` вернула ошибку, и golang-jwt обернул её в `ErrTokenUnverifiable` («error while executing keyfunc: …»). Всё, что следует за этим префиксом, — сообщение вашей собственной Keyfunc; в нашем воспроизведении это поиск ключа по `kid`, который ничего не нашёл. Токен не был ни проверен, ни отклонён по существу.
Почему это происходит
Токен ссылается на ключ, которого у сервиса нет
частоКлючи, загруженные один раз при запуске, устаревают, как только издатель проводит ротацию. `kid` из другого окружения или от другого издателя приводит к такому же сбою поиска.
Не удалось загрузить набор ключей
частоKeyfunc, которые скачивают JWKS по требованию, возвращают по этому же пути сетевые ошибки (DNS, TLS, тайм-ауты, HTTP 404). Настоящую причину называет обёрнутое сообщение.
Keyfunc не передана
иногда`jwt.Parse(token, nil)` или переменная с Keyfunc, которую так и не инициализировали. Без источника ключей golang-jwt ничего проверить не может.
Как исправить
- 1.
Используйте Keyfunc с обновляемым JWKS
Keyfunc на основе JWKS обновляет ключи в фоне и при появлении неизвестного `kid`, поэтому ротация ключей не приводит к сбоям в работе сервиса.
go k, err := keyfunc.NewDefaultCtx(ctx, []string{"https://issuer.example.com/.well-known/jwks.json"}) if err != nil { log.Fatalf("load JWKS: %v", err) } // Refetches the JWKS in the background and on unknown kids (rate-limited). token, err := jwt.Parse(raw, k.Keyfunc, jwt.WithValidMethods([]string{"ES256"})) - 2.
Записывайте в лог обёрнутую причину
`errors.Is(err, jwt.ErrTokenUnverifiable)` определяет класс ошибки, а обёрнутая ошибка подскажет, что случилось: ключ не нашёлся при поиске или набор ключей не удалось загрузить.
go if errors.Is(err, jwt.ErrTokenUnverifiable) { // The wrapped error is whatever your Keyfunc returned: log it, answer 401. log.Printf("cannot verify token: %v", errors.Unwrap(err)) }