Skip to content

Processor

Processor — основной тип для операций JWT, реализующий интерфейс TokenManager. Все методы безопасны для конкурентного использования.

Экземпляр создаётся через jwt.New(cfg).

Create

go
func (p *Processor) Create(claims CustomClaims) (string, error)

Создаёт новый JWT-токен доступа. Принимает любой тип, реализующий интерфейс CustomClaims.

Параметры

ПараметрТипОписание
claimsCustomClaimsУтверждения токена

Возвращаемые значения

ВозвратТипОписание
tokenstringПодписанная JWT-строка
errerrorОшибка при неудачной валидации или подписи

Ошибки

ОшибкаУсловие возникновения
ErrProcessorClosedProcessor закрыт
ErrInvalidClaimsВалидация Claims не удалась
ErrRateLimitExceededПревышен порог ограничения скорости

Пример

go
// Встроенные Claims
claims := &jwt.Claims{UserID: "user123", Username: "alice"}
token, err := processor.Create(claims)

// Пользовательские Claims
myClaims := &MyClaims{UserID: "123"}
token, err := processor.Create(myClaims)

Validate

go
func (p *Processor) Validate(tokenString string) (Claims, bool, error)

Проверяет JWT-токен доступа и возвращает разобранные Claims.

Параметры

ПараметрТипОписание
tokenStringstringJWT-строка

Возвращаемые значения

ВозвратТипОписание
claimsClaimsРазобранные утверждения (копия значения)
validboolДействителен ли токен
errerrorОшибка при неудачной проверке

Ошибки

ОшибкаУсловие возникновения
ErrProcessorClosedProcessor закрыт
ErrEmptyTokenТокен пуст
ErrInvalidTokenПодпись недействительна
ErrAlgorithmMismatchАлгоритм токена не совпадает с конфигурацией
ErrExpirationRequiredRequireExpiration включён, но в токене отсутствует утверждение exp
ErrTokenExpiredТокен истёк
ErrTokenNotValidYetТокен ещё не действителен
ErrTokenInvalidIssuerИздатель не совпадает
ErrTokenInvalidAudienceАудитория не совпадает
ErrTokenRevokedТокен отозван
ErrInvalidClaimsВалидация Claims не удалась

Пример

go
claims, valid, err := processor.Validate(tokenString)
if err != nil {
    // Обработка ошибки
    return
}
if valid {
    fmt.Println(claims.UserID)
}

CreateRefresh

go
func (p *Processor) CreateRefresh(claims CustomClaims) (string, error)

Создаёт токен обновления с использованием RefreshTokenTTL вместо AccessTokenTTL.

Параметры

ПараметрТипОписание
claimsCustomClaimsУтверждения токена

Возвращаемые значения

ВозвратТипОписание
tokenstringПодписанный токен обновления
errerrorОшибка при неудачной валидации или подписи

Ошибки

ОшибкаУсловие возникновения
ErrProcessorClosedProcessor закрыт
ErrInvalidClaimsВалидация Claims не удалась
ErrRateLimitExceededПревышен порог ограничения скорости

Refresh

go
func (p *Processor) Refresh(refreshTokenString string) (string, error)

Обновляет существующий токен обновления и возвращает новый токен доступа. Токен обновления полностью проверяется (подпись, срок действия, чёрный список) перед выдачей нового токена доступа; поля IssuedAt, ExpiresAt и ID исходного токена сбрасываются и генерируются заново.

Тип токена и ротация

  • Проверка типа токена: Токены с token_type=access отклоняются (возвращается ErrTokenTypeMismatch), чтобы предотвратить использование токенов доступа для получения новых токенов; старые токены без token_type по-прежнему принимаются для обратной совместимости.
  • Не отзывает исходный токен автоматически: Refresh не отзывает переданный токен обновления. Исходный токен остаётся действительным до истечения срока или явного отзыва через Revoke(). Для семантики одноразового использования вызовите Revoke(refreshTokenString) после успешного Refresh.

Замечание по безопасности

При обновлении проверяются только стандартные JWT-поля (exp, nbf, iss, aud, чёрный список) и базовая структурная валидность (наличие UserID или Username). Глубокие ограничения полей (лимит длины, инъекционные паттерны) не перепроверяются, так как они уже были проверены при создании.

Параметры

ПараметрТипОписание
refreshTokenStringstringТокен обновления

Возвращаемые значения

ВозвратТипОписание
tokenstringНовый токен доступа
errerrorОшибка при неудачной проверке

Ошибки

ОшибкаУсловие возникновения
ErrProcessorClosedProcessor закрыт
ErrEmptyTokenТокен пуст
ErrInvalidTokenПодпись недействительна
ErrAlgorithmMismatchАлгоритм токена не совпадает с конфигурацией
ErrExpirationRequiredRequireExpiration включён, но в токене отсутствует утверждение exp
ErrTokenExpiredТокен истёк
ErrTokenNotValidYetТокен ещё не действителен
ErrTokenInvalidIssuerИздатель не совпадает
ErrTokenInvalidAudienceАудитория не совпадает
ErrTokenRevokedТокен отозван
ErrInvalidClaimsВалидация Claims не удалась
ErrTokenTypeMismatchОбновление токеном доступа (token_type=access)
ErrRateLimitExceededПревышен порог ограничения скорости

ValidateInto

go
func (p *Processor) ValidateInto(tokenString string, claims CustomClaims) (CustomClaims, bool, error)

Проверяет токен и заполняет пользовательскую структуру Claims. Возвращает тот же указатель, что и переданный claims.

Параметры

ПараметрТипОписание
tokenStringstringJWT-строка
claimsCustomClaimsЦелевой указатель Claims

Возвращаемые значения

ВозвратТипОписание
claimsCustomClaimsЗаполненные Claims
validboolДействителен ли токен
errerrorОшибка при неудачной проверке

Пример

go
myClaims := &MyClaims{}
result, valid, err := processor.ValidateInto(tokenString, myClaims)
if valid {
    fmt.Println(result.(*MyClaims).UserID)
}

Ошибки

ОшибкаУсловие возникновения
ErrProcessorClosedProcessor закрыт
ErrEmptyTokenТокен пуст
ErrInvalidTokenПодпись недействительна
ErrAlgorithmMismatchАлгоритм токена не совпадает с конфигурацией
ErrExpirationRequiredRequireExpiration включён, но в токене отсутствует утверждение exp
ErrTokenExpiredТокен истёк
ErrTokenNotValidYetТокен ещё не действителен
ErrTokenInvalidIssuerИздатель не совпадает
ErrTokenInvalidAudienceАудитория не совпадает
ErrTokenRevokedТокен отозван
ErrInvalidClaimsВалидация Claims не удалась

RefreshInto

go
func (p *Processor) RefreshInto(refreshTokenString string, claims CustomClaims) (string, error)

Обновляет токен с использованием пользовательских Claims. Временные поля объекта Claims (IssuedAt, ExpiresAt, ID) автоматически восстанавливаются после операции, даже в случае ошибки или panic.

Проверка типа токена

Токены с token_type=access отклоняются (возвращается ErrTokenTypeMismatch), чтобы предотвратить использование токенов доступа для получения новых токенов; старые токены без token_type по-прежнему принимаются для обратной совместимости.

Замечание по безопасности

При обновлении проверяются только стандартные JWT-поля (exp, nbf, iss, aud, чёрный список) и базовая структурная валидность. Глубокие ограничения полей (лимит длины, инъекционные паттерны) не перепроверяются, так как они уже были проверены при создании.

Параметры

ПараметрТипОписание
refreshTokenStringstringТокен обновления
claimsCustomClaimsЦелевой указатель Claims

Возвращаемые значения

ВозвратТипОписание
tokenstringНовый токен доступа
errerrorОшибка при неудачной проверке

Ошибки

ОшибкаУсловие возникновения
ErrProcessorClosedProcessor закрыт
ErrEmptyTokenТокен пуст
ErrInvalidTokenПодпись недействительна
ErrAlgorithmMismatchАлгоритм токена не совпадает с конфигурацией
ErrExpirationRequiredRequireExpiration включён, но в токене отсутствует утверждение exp
ErrTokenExpiredТокен истёк
ErrTokenNotValidYetТокен ещё не действителен
ErrTokenInvalidIssuerИздатель не совпадает
ErrTokenInvalidAudienceАудитория не совпадает
ErrTokenRevokedТокен отозван
ErrInvalidClaimsВалидация Claims не удалась
ErrTokenTypeMismatchОбновление токеном доступа (token_type=access)
ErrRateLimitExceededПревышен порог ограничения скорости

Revoke

go
func (p *Processor) Revoke(tokenString string) error

Добавляет токен в чёрный список, проверяя подпись и извлекая ID токена (jti). Только токены с действительной подписью могут быть отозваны, что предотвращает добавление злоумышленниками произвольных ID токенов в чёрный список.

Поведение TTL

  • Утверждение exp токена определяет TTL записи в чёрном списке
  • Токены без exp по умолчанию получают TTL 7 дней
  • TTL ограничен 30 днями, чтобы предотвратить блокировку памяти подделанными чрезмерно большими значениями exp (защита от DoS)
  • Истёкшие токены также могут быть отозваны; запись автоматически очищается чёрным списком

Параметры

ПараметрТипОписание
tokenStringstringТокен для отзыва

Возвращаемые значения

ВозвратТипОписание
errerrorОшибка при неудачном отзыве

Ошибки

ОшибкаУсловие возникновения
ErrProcessorClosedProcessor закрыт
ErrEmptyTokenТокен пуст
ErrBlacklistNotConfiguredЧёрный список не настроен
ErrInvalidTokenНедействительная подпись или некорректный токен
ErrTokenInvalidIssuerИздатель не совпадает
ErrTokenInvalidAudienceАудитория не совпадает
ErrTokenMissingIDВ токене отсутствует утверждение jti

IsRevoked

go
func (p *Processor) IsRevoked(tokenString string) (bool, error)

Проверяет, был ли токен отозван. После проверки подписи выполняется поиск статуса jti токена в чёрном списке. Если чёрный список не настроен, возвращает false и ошибку nil.

Параметры

ПараметрТипОписание
tokenStringstringJWT-строка

Возвращаемые значения

ВозвратТипОписание
revokedboolОтозван ли токен
errerrorОшибка при неудачном запросе

Ошибки

ОшибкаУсловие возникновения
ErrProcessorClosedProcessor закрыт
ErrEmptyTokenТокен пуст
ErrInvalidTokenНедействительная подпись или некорректный токен
ErrTokenInvalidIssuerИздатель не совпадает
ErrTokenInvalidAudienceАудитория не совпадает
ErrTokenMissingIDВ токене отсутствует утверждение jti

ParseUnverified

go
func (p *Processor) ParseUnverified(tokenString string, claims any) error

Разбирает токен без проверки подписи. Подходит для извлечения информации из Claims, когда доверие к токену не требуется.

Предупреждение

Возвращаемые Claims не проверены и не могут быть доверенными. Используйте только для отладки или логирования.

Параметры

ПараметрТипОписание
tokenStringstringJWT-строка
claimsanyЦелевой указатель Claims

Возвращаемые значения

ВозвратТипОписание
errerrorОшибка при неудачном разборе

Ошибки

ОшибкаУсловие
ErrProcessorClosedProcessor закрыт
ErrEmptyTokenТокен пуст
Обёрнутая ошибкаВозвращает обёрнутую ошибку разбора для некорректных токенов (не является сигнальной ошибкой; не может быть сопоставлена через errors.Is)

Close

go
func (p *Processor) Close() error

Освобождает ресурсы и безопасно очищает ключи. Может вызываться многократно, последующие вызовы возвращают ErrProcessorClosed.

Возвращаемые значения

ВозвратТипОписание
errerrorОшибка при неудачном закрытии

IsClosed

go
func (p *Processor) IsClosed() bool

Проверяет, закрыт ли Processor.

Возвращаемые значения

ВозвратТипОписание
closedboolЗакрыт ли Processor