Skip to content

エラー処理

CyberGo JWT はセンチネルエラー(sentinel errors)パターンを使用しており、すべてのエラーは errors.Is() で判定します。

基本パターン

go
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.ErrTokenInvalidIssuer):
        // 発行者が一致しない
    case errors.Is(err, jwt.ErrTokenInvalidAudience):
        // オーディエンスが一致しない
    case errors.Is(err, jwt.ErrInvalidToken):
        // 署名が無効またはフォーマットエラー
    case errors.Is(err, jwt.ErrProcessorClosed):
        // Processor がクローズ済み
    default:
        // その他のエラー
    }
}

errors.Is() の使用

err == jwt.ErrTokenExpired や文字列マッチングは使用しないでください。errors.Is() はラップされたエラーも正しく処理します。

エラーの分類

設定段階

jwt.New() は以下のエラーを返す可能性があります:

エラー原因解決方法
ErrInvalidConfig複数の設定項目が不正Config の各フィールドを確認
ErrInvalidSecretKeyHMAC 秘密鍵が 32 バイト未満または弱鍵より強力な鍵を使用
ErrInvalidSigningMethodサポートされていない署名アルゴリズム内蔵の 12 種のアルゴリズムを使用

トークン操作

エラーメソッド処理の推奨
ErrEmptyTokenすべてのトークン操作メソッドリクエストヘッダーを確認
ErrInvalidTokenValidate, Refresh, ValidateInto, RefreshInto, Revoke, IsRevoked署名の不一致、アクセスを拒否
ErrAlgorithmMismatchValidate, Refresh, ValidateInto, RefreshIntoトークンのアルゴリズムが設定と不一致、アクセスを拒否
ErrExpirationRequiredValidate, Refresh, ValidateInto, RefreshIntoRequireExpiration 有効だがトークンに exp クレームなし
ErrTokenTypeMismatchRefresh, RefreshIntoアクセストークン(token_type=access)でリフレッシュ試行、アクセスを拒否
ErrTokenExpiredValidate, Refresh, ValidateInto, RefreshIntoユーザーにトークンのリフレッシュを案内
ErrTokenNotValidYetValidate, Refresh, ValidateInto, RefreshIntoクロックの同期を確認
ErrTokenInvalidIssuerValidate, Refresh, ValidateInto, RefreshInto, Revoke, IsRevoked発行者が一致しない
ErrTokenInvalidAudienceValidate, Refresh, ValidateInto, RefreshInto, Revoke, IsRevokedオーディエンスが一致しない
ErrTokenRevokedValidate, Refresh, ValidateInto, RefreshIntoトークンが失効済み、アクセスを拒否
ErrInvalidClaimsCreate, CreateRefresh, Validate, Refresh, ValidateInto, RefreshIntoビジネス検証の失敗
ErrTokenMissingIDRevoke, IsRevokedトークンに jti がない

レート制限とブラックリスト

エラーメソッド処理の推奨
ErrRateLimitExceededCreate, CreateRefresh, Refresh, RefreshInto429 を返す
ErrBlacklistNotConfiguredRevokeブラックリストを設定

ライフサイクル

エラーメソッド処理の推奨
ErrProcessorClosedすべてのメソッドProcessor を再作成
ErrStoreClosedRevoke などストアがクローズ済み

エラー型

ValidationError

フィールドレベルの検証失敗時に返され、具体的なフィールドとエラー情報を含みます:

go
type ValidationError struct {
    Field   string  // エラーが発生したフィールド名
    Message string  // エラーの説明
    Err     error   // 内部エラー
}

Web サービスでのエラー処理

go
func handleProtected(w http.ResponseWriter, r *http.Request) {
    tokenString := extractToken(r)
    claims, valid, err := processor.Validate(tokenString)
    if err != nil {
        switch {
        case errors.Is(err, jwt.ErrTokenExpired):
            http.Error(w, "token expired", http.StatusUnauthorized)
        case errors.Is(err, jwt.ErrTokenRevoked):
            http.Error(w, "token revoked", http.StatusUnauthorized)
        case errors.Is(err, jwt.ErrInvalidToken):
            http.Error(w, "invalid token", http.StatusUnauthorized)
        default:
            http.Error(w, "auth failed", http.StatusUnauthorized)
        }
        return
    }
    if !valid {
        http.Error(w, "invalid token", http.StatusUnauthorized)
        return
    }
    // リクエストを処理
}

次のステップ