Class: Clerk::SDK
- Inherits:
-
ClerkHttpClient::SDK
- Object
- ClerkHttpClient::SDK
- Clerk::SDK
- Defined in:
- lib/clerk/sdk.rb
Constant Summary collapse
- DEFAULT_HEADERS =
{ "User-Agent": "Clerk/#{Clerk::VERSION}; Faraday/#{Faraday::VERSION}; Ruby/#{RUBY_VERSION}", "X-Clerk-SDK": "ruby/#{Clerk::VERSION}", "Clerk-API-Version": "2025-04-10", }
- JWKS_CACHE_LIFETIME =
How often (in seconds) should JWKs be refreshed
3600
- @@jwks_cache =
1 hour
JWKSCache.new(JWKS_CACHE_LIFETIME)
Class Method Summary collapse
Instance Method Summary collapse
-
#decode_token(token) ⇒ Object
Returns the decoded JWT payload without verifying if the signature is valid.
-
#verify_token(token, force_refresh_jwks: false, algorithms: ["RS256"], timeout: 5) ⇒ Object
Decode the JWT and verify it’s valid (verify claims, signature etc.) using the provided algorithms.
Class Method Details
.jwks_cache ⇒ Object
19 20 21 |
# File 'lib/clerk/sdk.rb', line 19 def self.jwks_cache @@jwks_cache end |
Instance Method Details
#decode_token(token) ⇒ Object
Returns the decoded JWT payload without verifying if the signature is valid.
WARNING: This will not verify whether the signature is valid. You should not use this for untrusted messages! You most likely want to use ‘verify_token`.
27 28 29 |
# File 'lib/clerk/sdk.rb', line 27 def decode_token(token) JWT.decode(token, nil, false).first end |
#verify_token(token, force_refresh_jwks: false, algorithms: ["RS256"], timeout: 5) ⇒ Object
Decode the JWT and verify it’s valid (verify claims, signature etc.) using the provided algorithms.
JWKS are cached for JWKS_CACHE_LIFETIME seconds, in order to avoid unecessary roundtrips. In order to invalidate the cache, pass ‘force_refresh_jwks: true`.
A timeout for the request to the JWKs endpoint can be set with the ‘timeout` argument.
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/clerk/sdk.rb', line 37 def verify_token(token, force_refresh_jwks: false, algorithms: ["RS256"], timeout: 5) jwk_loader = ->() do # JWT.decode requires that the 'keys' key in the Hash is a symbol (as # opposed to a string which our SDK returns by default) {keys: SDK.jwks_cache.fetch(self, kid_not_found: [:invalidate] || [:kid_not_found], force_refresh: force_refresh_jwks)} end claims = JWT.decode(token, nil, true, algorithms: algorithms, exp_leeway: timeout, jwks: jwk_loader).first # orgs if claims["v"].nil? || claims["v"] == 1 claims["v"] = 1 elsif claims["v"] == 2 && claims["o"] claims["org_id"] = claims["o"].fetch("id", nil) claims["org_slug"] = claims["o"].fetch("slg", nil) claims["org_role"] = "org:#{claims["o"].fetch("rol", nil)}" = (claims) claims["org_permissions"] = if .any? claims.delete("o") claims.delete("fea") end claims end |