clerk-sdk-ruby 2.7.0 → 2.9.0.beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a63fa1a8677b50586e50404f49bc11c2b281fa99c2dd56e22f932f14a10c28ad
4
- data.tar.gz: 797d3896292214650cd3caf2065d84fe36a6667ab24e2989ccedcde3c0b97b30
3
+ metadata.gz: 3bb75c4354d383821c456ef0e4a3da02d2dbb2404a89dddc6dab99190251c918
4
+ data.tar.gz: aea4736f0e1c16d94c2f081c32218280d84015282054cbd9a42b7518ab5590d0
5
5
  SHA512:
6
- metadata.gz: 6194a064d7505ff5d9940e27a37842006401158c60f673f1f3b5425a5da4a52d05b7d77aa984495a9006e77fe376c2a7abedce1086c5c76f5e9430d13bd65a46
7
- data.tar.gz: ab494cc80de603e5c9bd15b751219bdbef0ababcd611f9c190f9e1167d4b6abc6328556fcc6dc26521cc449529c028007102d1c15dfe72287056db11eb3ff05e
6
+ metadata.gz: 0b9b95ab6ba5d002b1a78eff6ad5af4a4c930ea4ae6ef553eab5a7965854a64624340b17ac1ac84348516920fc1b3aba880b459f2e2eb0e112d98018fefce043
7
+ data.tar.gz: 0caf5c13e253ef08e89b998f68630d7e67574286effa2aa4e8a6490b550dfba0a6f8444e9171fb0b24e3d428d3b1d34c616840926bb0b29260088e7935834bf9
data/.gitignore CHANGED
@@ -9,3 +9,5 @@
9
9
 
10
10
  .byebug_history
11
11
  *.gem
12
+
13
+ .idea
data/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  ## unreleased
2
2
 
3
+ ## 2.9.0.beta1 - 2022-12-23
4
+
5
+ - fix: Make JWKS cache work across different SDK instances [https://github.com/clerkinc/clerk-sdk-ruby/pull/27]
6
+
7
+ ## 2.8.0 - 2022-11-29
8
+
9
+ - feat: Add support for the users.verify_totp endpoint
10
+
11
+ ## 2.7.0 - 2022-11-02
12
+
13
+ - feat: Add `#clerk_organization` and `#clerk_organization_id` helpers to fetch the current user's active organization [https://github.com/clerkinc/clerk-sdk-ruby/pull/22]
14
+ - feat: Implement Organization Metadata update endpoint [https://github.com/clerkinc/clerk-sdk-ruby/pull/21]
15
+
3
16
  ## 2.6.0 - 2022-11-01
4
17
 
5
18
  - feat: Implement Organization endpoints [https://github.com/clerkinc/clerk-sdk-ruby/pull/20]
data/Gemfile.lock CHANGED
@@ -1,14 +1,16 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- clerk-sdk-ruby (2.6.0)
4
+ clerk-sdk-ruby (2.8.0)
5
+ concurrent-ruby (~> 1.1)
5
6
  faraday (~> 1.4.1)
6
- jwt (~> 2.2)
7
+ jwt (~> 2.5)
7
8
 
8
9
  GEM
9
10
  remote: https://rubygems.org/
10
11
  specs:
11
12
  byebug (11.1.3)
13
+ concurrent-ruby (1.1.10)
12
14
  faraday (1.4.3)
13
15
  faraday-em_http (~> 1.0)
14
16
  faraday-em_synchrony (~> 1.0)
@@ -23,13 +25,14 @@ GEM
23
25
  faraday-net_http (1.0.1)
24
26
  faraday-net_http_persistent (1.2.0)
25
27
  jwt (2.5.0)
26
- minitest (5.14.2)
28
+ minitest (5.16.3)
27
29
  multipart-post (2.2.3)
28
- rake (13.0.3)
30
+ rake (13.0.6)
29
31
  ruby2_keywords (0.0.5)
30
- timecop (0.9.4)
32
+ timecop (0.9.6)
31
33
 
32
34
  PLATFORMS
35
+ universal-darwin-21
33
36
  x86_64-linux
34
37
 
35
38
  DEPENDENCIES
@@ -40,4 +43,4 @@ DEPENDENCIES
40
43
  timecop (~> 0.9.4)
41
44
 
42
45
  BUNDLED WITH
43
- 2.2.32
46
+ 2.3.25
@@ -28,7 +28,8 @@ Gem::Specification.new do |spec|
28
28
  spec.require_paths = ["lib"]
29
29
 
30
30
  spec.add_dependency "faraday", "~> 1.4.1"
31
- spec.add_dependency "jwt", '~> 2.2'
31
+ spec.add_dependency "jwt", '~> 2.5'
32
+ spec.add_dependency "concurrent-ruby", "~> 1.1"
32
33
 
33
34
  spec.add_development_dependency "byebug", "~> 11.1"
34
35
  spec.add_development_dependency "timecop", "~> 0.9.4"
@@ -0,0 +1,32 @@
1
+ class JWKSCache
2
+ def initialize(lifetime)
3
+ @lifetime = lifetime
4
+ @jwks = nil
5
+ @last_update = nil
6
+ @lock = Concurrent::ReadWriteLock.new
7
+ end
8
+
9
+ def fetch(sdk, force_refresh: false, kid_not_found: false)
10
+ should_refresh = @lock.with_read_lock do
11
+ @jwks.nil? || @last_update.nil? || force_refresh ||
12
+ (Time.now.to_i-@last_update > @lifetime) ||
13
+ (kid_not_found && Time.now.to_i-@last_update > 300)
14
+ end
15
+
16
+ if should_refresh
17
+ @lock.with_write_lock do
18
+ @last_update = Time.now.to_i
19
+
20
+ @jwks = begin
21
+ sdk.jwks.all["keys"]
22
+ rescue Clerk::Errors::Base
23
+ nil
24
+ end
25
+ end
26
+ end
27
+
28
+ @lock.with_read_lock do
29
+ @jwks
30
+ end
31
+ end
32
+ end
@@ -194,7 +194,8 @@ module Clerk
194
194
  end
195
195
 
196
196
  def development_or_staging?
197
- Clerk.configuration.api_key.start_with?("test_")
197
+ Clerk.configuration.api_key.start_with?("test_") ||
198
+ Clerk.configuration.api_key.start_with?("sk_test_")
198
199
  end
199
200
 
200
201
  def production?
@@ -202,7 +203,7 @@ module Clerk
202
203
  end
203
204
 
204
205
  def cross_origin_request?(req)
205
- # origin contains scheme+host and optionally port (ommitted if 80 or 443)
206
+ # origin contains scheme+host and optionally port (omitted if 80 or 443)
206
207
  # ref. https://www.rfc-editor.org/rfc/rfc6454#section-6.1
207
208
  origin = req.env["HTTP_ORIGIN"]
208
209
  return false if origin.nil?
@@ -0,0 +1,17 @@
1
+ require "forwardable"
2
+ require_relative "plural_resource"
3
+
4
+ module Clerk
5
+ module Resources
6
+ class EmailAddresses
7
+ extend Forwardable
8
+
9
+ def initialize(client)
10
+ @client = client
11
+ @resource = PluralResource.new(client, "email_addresses")
12
+ end
13
+
14
+ def_delegators :@resource, :find, :create, :update, :delete
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,17 @@
1
+ require "forwardable"
2
+ require_relative "plural_resource"
3
+
4
+ module Clerk
5
+ module Resources
6
+ class PhoneNumbers
7
+ extend Forwardable
8
+
9
+ def initialize(client)
10
+ @client = client
11
+ @resource = PluralResource.new(client, "phone_numbers")
12
+ end
13
+
14
+ def_delegators :@resource, :find, :create, :update, :delete
15
+ end
16
+ end
17
+ end
@@ -21,6 +21,10 @@ module Clerk
21
21
  @client.request(:post, "#{@resource.resource_path(user_id)}/verify_password", body: { password: password })
22
22
  end
23
23
 
24
+ def verify_totp(user_id, totp_or_backup_code)
25
+ @client.request(:post, "#{@resource.resource_path(user_id)}/verify_totp", body: { code: totp_or_backup_code })
26
+ end
27
+
24
28
  def disable_mfa(user_id)
25
29
  @client.request(:delete, "#{@resource.resource_path(user_id)}/mfa")
26
30
  end
@@ -1,8 +1,10 @@
1
1
  require_relative "resources/allowlist_identifiers"
2
2
  require_relative "resources/allowlist"
3
3
  require_relative "resources/clients"
4
+ require_relative "resources/email_addresses"
4
5
  require_relative "resources/emails"
5
6
  require_relative "resources/organizations"
7
+ require_relative "resources/phone_numbers"
6
8
  require_relative "resources/sessions"
7
9
  require_relative "resources/sms_messages"
8
10
  require_relative "resources/users"
data/lib/clerk/sdk.rb CHANGED
@@ -5,18 +5,22 @@ require "logger"
5
5
  require "net/http"
6
6
  require "json"
7
7
  require "jwt"
8
+ require "concurrent-ruby"
8
9
 
9
10
  require_relative "resources/allowlist_identifiers"
10
11
  require_relative "resources/allowlist"
11
12
  require_relative "resources/clients"
13
+ require_relative "resources/email_addresses"
12
14
  require_relative "resources/emails"
13
15
  require_relative "resources/organizations"
16
+ require_relative "resources/phone_numbers"
14
17
  require_relative "resources/sessions"
15
18
  require_relative "resources/sms_messages"
16
19
  require_relative "resources/users"
17
20
  require_relative "resources/users"
18
21
  require_relative "resources/jwks"
19
22
  require_relative "errors"
23
+ require_relative "jwks_cache"
20
24
 
21
25
  module Clerk
22
26
  class SDK
@@ -28,10 +32,14 @@ module Clerk
28
32
  # How often (in seconds) should JWKs be refreshed
29
33
  JWKS_CACHE_LIFETIME = 3600 # 1 hour
30
34
 
35
+ @@jwks_cache = JWKSCache.new(JWKS_CACHE_LIFETIME)
36
+
37
+ def self.jwks_cache
38
+ @@jwks_cache
39
+ end
40
+
31
41
  def initialize(api_key: nil, base_url: nil, logger: nil, ssl_verify: true,
32
42
  connection: nil)
33
- @jwks_fetched_at = nil
34
-
35
43
  if connection # Inject a Faraday::Connection for testing or full control over Faraday
36
44
  @conn = connection
37
45
  return
@@ -111,6 +119,10 @@ module Clerk
111
119
  Resources::Clients.new(self)
112
120
  end
113
121
 
122
+ def email_addresses
123
+ Resources::EmailAddresses.new(self)
124
+ end
125
+
114
126
  def emails
115
127
  Resources::Emails.new(self)
116
128
  end
@@ -119,6 +131,10 @@ module Clerk
119
131
  Resources::Organizations.new(self)
120
132
  end
121
133
 
134
+ def phone_numbers
135
+ Resources::PhoneNumbers.new(self)
136
+ end
137
+
122
138
  def sessions
123
139
  Resources::Sessions.new(self)
124
140
  end
@@ -160,17 +176,9 @@ module Clerk
160
176
  # `timeout` argument.
161
177
  def verify_token(token, force_refresh_jwks: false, algorithms: ['RS256'], timeout: 5)
162
178
  jwk_loader = ->(options) do
163
- @cached_jwks = nil if options[:invalidate] || force_refresh_jwks
164
- @cached_jwks = nil if @jwks_fetched_at && Time.now.to_i - @jwks_fetched_at > JWKS_CACHE_LIFETIME
165
-
166
- @cached_jwks ||= begin
167
- keys = jwks.all["keys"]
168
- @jwks_fetched_at = Time.now.to_i
169
-
170
- # JWT.decode requires that the 'keys' key in the Hash is a symbol (as
171
- # opposed to a string which our SDK returns by default)
172
- { keys: keys }
173
- end
179
+ # JWT.decode requires that the 'keys' key in the Hash is a symbol (as
180
+ # opposed to a string which our SDK returns by default)
181
+ { keys: SDK.jwks_cache.fetch(self, kid_not_found: (options[:invalidate] || options[:kid_not_found]), force_refresh: force_refresh_jwks) }
174
182
  end
175
183
 
176
184
  JWT.decode(token, nil, true, algorithms: algorithms, jwks: jwk_loader).first
data/lib/clerk/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Clerk
4
- VERSION = "2.7.0"
4
+ VERSION = "2.9.0.beta1"
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clerk-sdk-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.0
4
+ version: 2.9.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Clerk
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-11-02 00:00:00.000000000 Z
11
+ date: 2022-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -30,14 +30,28 @@ dependencies:
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '2.2'
33
+ version: '2.5'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '2.2'
40
+ version: '2.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: concurrent-ruby
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.1'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.1'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: byebug
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -89,6 +103,7 @@ files:
89
103
  - lib/clerk.rb
90
104
  - lib/clerk/authenticatable.rb
91
105
  - lib/clerk/errors.rb
106
+ - lib/clerk/jwks_cache.rb
92
107
  - lib/clerk/proxy.rb
93
108
  - lib/clerk/rack_middleware.rb
94
109
  - lib/clerk/rack_middleware_v2.rb
@@ -97,9 +112,11 @@ files:
97
112
  - lib/clerk/resources/allowlist.rb
98
113
  - lib/clerk/resources/allowlist_identifiers.rb
99
114
  - lib/clerk/resources/clients.rb
115
+ - lib/clerk/resources/email_addresses.rb
100
116
  - lib/clerk/resources/emails.rb
101
117
  - lib/clerk/resources/jwks.rb
102
118
  - lib/clerk/resources/organizations.rb
119
+ - lib/clerk/resources/phone_numbers.rb
103
120
  - lib/clerk/resources/plural_resource.rb
104
121
  - lib/clerk/resources/sessions.rb
105
122
  - lib/clerk/resources/singular_resource.rb
@@ -126,9 +143,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
126
143
  version: 2.4.0
127
144
  required_rubygems_version: !ruby/object:Gem::Requirement
128
145
  requirements:
129
- - - ">="
146
+ - - ">"
130
147
  - !ruby/object:Gem::Version
131
- version: '0'
148
+ version: 1.3.1
132
149
  requirements: []
133
150
  rubygems_version: 3.2.5
134
151
  signing_key: