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 がクローズ済み
ErrInvalidClaimsClaims の検証に失敗
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トークンが失効済み
ErrInvalidClaimsClaims の検証に失敗

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)

リフレッシュトークンを作成します。AccessTokenTTL ではなく RefreshTokenTTL を使用します。

パラメータ

パラメータ説明
claimsCustomClaimsトークンクレーム

戻り値

戻り値説明
tokenstring署名済みリフレッシュトークン
errerror検証または署名に失敗した場合にエラーを返す

エラー

エラー発生条件
ErrProcessorClosedProcessor がクローズ済み
ErrInvalidClaimsClaims の検証に失敗
ErrRateLimitExceededレート制限のしきい値を超過

Refresh

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

既存のリフレッシュトークンを更新し、新しいアクセストークンを返します。リフレッシュトークンは新しいアクセストークンを発行する前に完全に検証(署名、有効期限、ブラックリスト)され、元のトークンの IssuedAtExpiresAtID はリセットおよび再生成されます。

トークンタイプとローテーション

  • トークンタイプチェックtoken_type=access のトークンは拒否され(ErrTokenTypeMismatch を返す)、アクセストークンが新たなトークン取得に使われるのを防ぎます。token_type を持たない古いトークンは後方互換性のため引き続き受け付けられます。
  • 元のトークンを自動失効させないRefresh は渡されたリフレッシュトークンを失効させません。元のトークンは期限切れまたは明示的に Revoke() されるまで有効なままです。ワンタイム使用のセマンティクスが必要な場合は、Refresh 成功後に Revoke(refreshTokenString) を呼び出してください。

セキュリティ上の注意

リフレッシュ時は標準 JWT フィールド(exp、nbf、iss、aud、ブラックリスト)と基本構造の有効性(UserID または Username が必須)のみ検証します。深いフィールド制約(長さ制限、注入パターン)は作成時に検証済みのため、再チェックされません。

パラメータ

パラメータ説明
refreshTokenStringstringリフレッシュトークン

戻り値

戻り値説明
tokenstring新しいアクセストークン
errerror検証に失敗した場合にエラーを返す

エラー

エラー発生条件
ErrProcessorClosedProcessor がクローズ済み
ErrEmptyTokenトークンが空
ErrInvalidToken署名が無効
ErrAlgorithmMismatchトークンのアルゴリズムが設定と一致しない
ErrExpirationRequiredRequireExpiration が有効だがトークンに exp クレームがない
ErrTokenExpiredトークンの有効期限切れ
ErrTokenNotValidYetトークンがまだ有効ではない
ErrTokenInvalidIssuer発行者が一致しない
ErrTokenInvalidAudienceオーディエンスが一致しない
ErrTokenRevokedトークンが失効済み
ErrInvalidClaimsClaims の検証に失敗
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トークンが失効済み
ErrInvalidClaimsClaims の検証に失敗

RefreshInto

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

カスタム Claims を使用してトークンをリフレッシュします。Claims オブジェクトの時系列フィールド(IssuedAtExpiresAtID)は操作後に自動的に復元され、エラーや 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トークンが失効済み
ErrInvalidClaimsClaims の検証に失敗
ErrTokenTypeMismatchアクセストークン(token_type=access)でリフレッシュを試行
ErrRateLimitExceededレート制限のしきい値を超過

Revoke

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

署名を検証してトークン ID(jti)を抽出し、トークンをブラックリストに追加します。有効な署名を持つトークンのみが失効可能で、悪意のある呼び出し元が任意のトークン ID をブラックリストに追加するのを防ぎます。

TTL の振る舞い

  • トークンの exp がブラックリストエントリの TTL を決定します
  • exp のないトークンはデフォルトで 7 日間の TTL となります
  • 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 ステータスを検索します。ブラックリストが未設定の場合、falsenil エラーを返します。

パラメータ

パラメータ説明
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

リソースを解放し、秘密鍵を安全にクリアします。複数回呼び出し可能で、2 回目以降は ErrProcessorClosed を返します。

戻り値

戻り値説明
errerrorクローズに失敗した場合にエラーを返す

IsClosed

go
func (p *Processor) IsClosed() bool

Processor がクローズ済みかどうかを確認します。

戻り値

戻り値説明
closedboolクローズ済みかどうか