Skip to content

错误

哨兵错误

所有错误均使用 errors.Is() 进行判断:

go
var (
    ErrInvalidConfig        = errors.New("invalid configuration")
    ErrInvalidSecretKey     = errors.New("invalid secret key")
    ErrInvalidSigningMethod = errors.New("invalid signing method")

    ErrInvalidToken          = errors.New("invalid token")
    ErrEmptyToken            = errors.New("empty token")
    ErrAlgorithmMismatch     = errors.New("token algorithm does not match configured signing method")
    ErrTokenRevoked          = errors.New("token revoked")
    ErrTokenMissingID        = errors.New("token missing ID")
    ErrTokenTypeMismatch     = errors.New("token type mismatch")
    ErrTokenExpired          = errors.New("token expired")
    ErrTokenNotValidYet      = errors.New("token not valid yet")
    ErrTokenInvalidIssuer    = errors.New("token invalid issuer")
    ErrTokenInvalidAudience  = errors.New("token invalid audience")
    ErrExpirationRequired    = errors.New("token missing expiration claim")

    ErrInvalidClaims = errors.New("invalid claims")

    ErrRateLimitExceeded = errors.New("rate limit exceeded")

    ErrBlacklistNotConfigured = errors.New("blacklist not configured")

    ErrProcessorClosed = errors.New("processor closed")
    ErrStoreClosed     = errors.New("blacklist store is closed")
)

错误一览

错误说明使用 errors.Is() 检查
ErrInvalidConfig配置无效New()Config.Validate()
ErrInvalidSecretKey密钥无效New()
ErrInvalidSigningMethod签名方法无效New()
ErrInvalidToken令牌无效(签名错误等)Validate()Refresh()ValidateInto()RefreshInto()Revoke()IsRevoked()
ErrEmptyToken令牌为空所有令牌操作方法
ErrAlgorithmMismatch令牌算法与配置不匹配Validate()Refresh()ValidateInto()RefreshInto()
ErrTokenRevoked令牌已吊销Validate()Refresh()ValidateInto()RefreshInto()
ErrTokenMissingID令牌缺少 IDRevoke()IsRevoked()
ErrTokenTypeMismatch令牌类型不匹配(用访问令牌刷新)Refresh()RefreshInto()
ErrTokenExpired令牌过期Validate()Refresh()ValidateInto()RefreshInto()
ErrTokenNotValidYet令牌尚未生效Validate()Refresh()ValidateInto()RefreshInto()
ErrTokenInvalidIssuer签发者不匹配Validate()Refresh()ValidateInto()RefreshInto()Revoke()IsRevoked()
ErrTokenInvalidAudience受众不匹配Validate()Refresh()ValidateInto()RefreshInto()Revoke()IsRevoked()
ErrExpirationRequired启用 RequireExpiration 但令牌缺少 expValidate()Refresh()ValidateInto()RefreshInto()
ErrInvalidClaimsClaims 验证失败Create()CreateRefresh()Validate()Refresh()ValidateInto()RefreshInto()
ErrRateLimitExceeded超出限流Create()CreateRefresh()Refresh()RefreshInto()
ErrBlacklistNotConfigured黑名单未配置Revoke()
ErrProcessorClosedProcessor 已关闭所有方法
ErrStoreClosed存储已关闭Revoke()

按场景分类

配置阶段

错误触发方法典型原因
ErrInvalidConfigNew()多个配置项不合法
ErrInvalidSecretKeyNew()HMAC 密钥不足 32 字节或为弱密钥
ErrInvalidSigningMethodNew()不在 12 种内置算法中

令牌验证

错误触发方法典型原因
ErrEmptyToken所有令牌操作方法传入空字符串
ErrInvalidTokenValidate()Refresh()ValidateInto()RefreshInto()Revoke()IsRevoked()签名不匹配或格式错误
ErrAlgorithmMismatchValidate()Refresh()ValidateInto()RefreshInto()令牌 header 中的算法与配置不匹配
ErrExpirationRequiredValidate()Refresh()ValidateInto()RefreshInto()启用 RequireExpiration 但令牌缺少 exp 声明
ErrTokenExpiredValidate()Refresh()ValidateInto()RefreshInto()超过 exp 时间
ErrTokenNotValidYetValidate()Refresh()ValidateInto()RefreshInto()尚未到达 nbf 时间
ErrTokenInvalidIssuerValidate()Refresh()ValidateInto()RefreshInto()Revoke()IsRevoked()issConfig.Issuer 不匹配
ErrTokenInvalidAudienceValidate()Refresh()ValidateInto()RefreshInto()Revoke()IsRevoked()audConfig.ExpectedAudience 不匹配
ErrTokenRevokedValidate()Refresh()ValidateInto()RefreshInto()令牌在黑名单中
ErrTokenTypeMismatchRefresh()RefreshInto()用访问令牌(token_type=access)尝试刷新
ErrInvalidClaimsCreate()CreateRefresh()Validate()Refresh()ValidateInto()RefreshInto()业务验证失败
ErrTokenMissingIDRevoke()IsRevoked()令牌缺少 jti 字段

限流与黑名单

错误触发方法典型原因
ErrRateLimitExceededCreate()CreateRefresh()Refresh()RefreshInto()超出窗口内请求上限
ErrBlacklistNotConfiguredRevoke()未配置黑名单存储
ErrTokenMissingIDRevoke()IsRevoked()令牌缺少 jti 字段

生命周期

错误触发方法典型原因
ErrProcessorClosed所有方法调用 Close() 后继续操作
ErrStoreClosedRevoke()黑名单存储已关闭

错误处理模式

go
import "errors"

claims, valid, err := processor.Validate(tokenString)
if err != nil {
    switch {
    case errors.Is(err, jwt.ErrTokenExpired):
        // 令牌过期 - 引导用户刷新
    case errors.Is(err, jwt.ErrTokenRevoked):
        // 令牌已吊销 - 拒绝访问
    case errors.Is(err, jwt.ErrInvalidToken):
        // 签名无效 - 拒绝访问
    case errors.Is(err, jwt.ErrProcessorClosed):
        // 系统错误 - Processor 已关闭
    default:
        // 未知错误
    }
}

错误类型

ValidationError

go
type ValidationError struct {
    Field   string
    Message string
    Err     error
}

字段级验证失败错误。详见 类型与常量 → ValidationError