Class: KeycloakSdk::JwtValidator

Inherits:
Object
  • Object
show all
Defined in:
lib/keycloak_sdk/jwt_validator.rb

Overview

자체강화 JWT 검증기. ruby-jwt의 안전하지 않은 기본값을 전부 오버라이드한다: RS256 핀(none/confusion 구조적 거부)·iss 정확·aud 포함·exp 필수·nbf·클록스큐. 키는 DoS-safe JwksStore로 조회한다(위조 서명은 재조회 미유발). 헤더 alg는 검증 알고리즘 선택에 미사용.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(issuer:, audience:, jwks_store:, algorithms: ["RS256"], clock_skew: 30) ⇒ JwtValidator

Returns a new instance of JwtValidator.

Raises:



10
11
12
13
14
15
16
17
18
19
20
21
# File 'lib/keycloak_sdk/jwt_validator.rb', line 10

def initialize(issuer:, audience:, jwks_store:, algorithms: ["RS256"], clock_skew: 30)
  # ruby-jwt의 verify_iss/verify_aud 빌더는 값이 nil이면 조용히 no-op이 되어
  # verify_iss:true/verify_aud:true를 켜도 검사를 건너뛴다 — fail-closed로 방어.
  raise ConfigError, "issuer is required" if issuer.nil? || issuer.to_s.strip.empty?
  raise ConfigError, "audience is required" if audience.nil? || audience.to_s.strip.empty?

  @issuer = issuer
  @audience = audience
  @jwks_store = jwks_store
  @algorithms = algorithms
  @clock_skew = clock_skew
end

Class Method Details

.from_config(config:, jwks_store:) ⇒ Object

기대 aud는 config.expected_audience(설정 시) — 미설정이면 종전대로 client_id.



24
25
26
27
28
# File 'lib/keycloak_sdk/jwt_validator.rb', line 24

def self.from_config(config:, jwks_store:)
  new(issuer: OidcEndpoints.from_config(config).issuer,
      audience: config.expected_audience || config.client_id, jwks_store: jwks_store,
      algorithms: config.signature_algorithms, clock_skew: config.clock_skew)
end

Instance Method Details

#validate(token) ⇒ Object



30
31
32
33
34
35
# File 'lib/keycloak_sdk/jwt_validator.rb', line 30

def validate(token)
  payload, = JWT.decode(token, nil, true, decode_options)
  to_validated(payload)
rescue JWT::DecodeError => e
  raise TokenValidationError, "JWT validation failed: #{e.message}"
end