Class: ChatSDK::Teams::JwtVerifier

Inherits:
Object
  • Object
show all
Defined in:
lib/chat_sdk/teams/jwt_verifier.rb

Constant Summary collapse

OPENID_CONFIG_URL =
"https://login.botframework.com/v1/.well-known/openidconfiguration"
JWKS_CACHE_TTL =

1 hour

3600

Instance Method Summary collapse

Constructor Details

#initialize(app_id:) ⇒ JwtVerifier

Returns a new instance of JwtVerifier.



9
10
11
12
13
# File 'lib/chat_sdk/teams/jwt_verifier.rb', line 9

def initialize(app_id:)
  @app_id = app_id
  @jwks_keys = nil
  @jwks_fetched_at = nil
end

Instance Method Details

#verify!(token) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# File 'lib/chat_sdk/teams/jwt_verifier.rb', line 15

def verify!(token)
  raise ChatSDK::SignatureVerificationError, "Missing authorization token" if token.nil? || token.empty?

  jwks = fetch_jwks
  header = JWT.decode(token, nil, false).last
  kid = header["kid"]

  key = jwks.find { |k| k[:kid] == kid }
  raise ChatSDK::SignatureVerificationError, "Unknown signing key" unless key

  decoded = JWT.decode(
    token,
    key[:key],
    true,
    algorithm: header["alg"] || "RS256",
    aud: @app_id,
    verify_aud: true
  )
  decoded.first
rescue JWT::DecodeError, JWT::VerificationError, JWT::ExpiredSignature, JWT::InvalidAudError => e
  raise ChatSDK::SignatureVerificationError, "JWT verification failed: #{e.message}"
end