workos 4.0.0 → 4.2.0

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.
Files changed (139) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +37 -0
  3. data/.github/workflows/release.yml +43 -0
  4. data/.rubocop.yml +8 -1
  5. data/Gemfile.lock +22 -69
  6. data/lib/workos/audit_log_export.rb +8 -31
  7. data/lib/workos/audit_logs.rb +0 -26
  8. data/lib/workos/authentication_factor_and_challenge.rb +0 -3
  9. data/lib/workos/authentication_response.rb +12 -5
  10. data/lib/workos/challenge.rb +9 -28
  11. data/lib/workos/client.rb +0 -41
  12. data/lib/workos/configuration.rb +0 -1
  13. data/lib/workos/connection.rb +11 -35
  14. data/lib/workos/directory.rb +10 -37
  15. data/lib/workos/directory_group.rb +9 -36
  16. data/lib/workos/directory_sync.rb +0 -21
  17. data/lib/workos/directory_user.rb +17 -51
  18. data/lib/workos/errors.rb +0 -16
  19. data/lib/workos/event.rb +5 -26
  20. data/lib/workos/events.rb +0 -7
  21. data/lib/workos/factor.rb +9 -28
  22. data/lib/workos/hash_provider.rb +0 -1
  23. data/lib/workos/impersonator.rb +23 -0
  24. data/lib/workos/invitation.rb +12 -37
  25. data/lib/workos/mfa.rb +0 -42
  26. data/lib/workos/organization.rb +8 -31
  27. data/lib/workos/organization_membership.rb +8 -27
  28. data/lib/workos/organizations.rb +0 -26
  29. data/lib/workos/passwordless.rb +0 -14
  30. data/lib/workos/portal.rb +1 -13
  31. data/lib/workos/profile.rb +12 -39
  32. data/lib/workos/profile_and_token.rb +1 -4
  33. data/lib/workos/refresh_authentication_response.rb +24 -0
  34. data/lib/workos/sso.rb +1 -43
  35. data/lib/workos/types/intent.rb +16 -0
  36. data/lib/workos/types/list_struct.rb +8 -5
  37. data/lib/workos/types/passwordless_session_struct.rb +10 -9
  38. data/lib/workos/types/provider.rb +15 -0
  39. data/lib/workos/types.rb +5 -23
  40. data/lib/workos/user.rb +10 -31
  41. data/lib/workos/user_and_token.rb +1 -4
  42. data/lib/workos/user_management.rb +108 -219
  43. data/lib/workos/user_response.rb +0 -3
  44. data/lib/workos/verify_challenge.rb +4 -18
  45. data/lib/workos/version.rb +1 -2
  46. data/lib/workos/webhook.rb +5 -26
  47. data/lib/workos/webhooks.rb +1 -38
  48. data/lib/workos.rb +2 -2
  49. data/spec/lib/workos/audit_logs_spec.rb +2 -3
  50. data/spec/lib/workos/configuration_spec.rb +0 -1
  51. data/spec/lib/workos/directory_sync_spec.rb +0 -1
  52. data/spec/lib/workos/directory_user_spec.rb +0 -1
  53. data/spec/lib/workos/event_spec.rb +0 -1
  54. data/spec/lib/workos/mfa_spec.rb +0 -1
  55. data/spec/lib/workos/organizations_spec.rb +0 -1
  56. data/spec/lib/workos/passwordless_spec.rb +0 -1
  57. data/spec/lib/workos/portal_spec.rb +0 -1
  58. data/spec/lib/workos/sso_spec.rb +0 -1
  59. data/spec/lib/workos/user_management_spec.rb +59 -10
  60. data/spec/lib/workos/webhooks_spec.rb +0 -1
  61. data/spec/spec_helper.rb +6 -9
  62. data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_code/valid.yml +1 -1
  63. data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_code/valid_with_impersonator.yml +80 -0
  64. data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_email_verification/valid.yml +1 -1
  65. data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_magic_auth/valid.yml +1 -1
  66. data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_organization_selection/valid.yml +1 -1
  67. data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_password/valid.yml +1 -1
  68. data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_refresh_code/invalid.yml +81 -0
  69. data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_refresh_token/valid.yml +81 -0
  70. data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_totp/valid.yml +1 -1
  71. data/spec/support/shared_examples/client_spec.rb +0 -1
  72. data/workos.gemspec +1 -6
  73. metadata +19 -129
  74. data/.semaphore/rubygems.yml +0 -24
  75. data/.semaphore/semaphore.yml +0 -51
  76. data/bin/tapioca +0 -29
  77. data/codecov.yml +0 -12
  78. data/devbox.json +0 -18
  79. data/devbox.lock +0 -11
  80. data/lib/workos/types/audit_log_export_struct.rb +0 -17
  81. data/lib/workos/types/challenge_struct.rb +0 -18
  82. data/lib/workos/types/connection_struct.rb +0 -20
  83. data/lib/workos/types/directory_group_struct.rb +0 -19
  84. data/lib/workos/types/directory_struct.rb +0 -19
  85. data/lib/workos/types/directory_user_struct.rb +0 -26
  86. data/lib/workos/types/event_struct.rb +0 -15
  87. data/lib/workos/types/factor_struct.rb +0 -18
  88. data/lib/workos/types/intent_enum.rb +0 -17
  89. data/lib/workos/types/invitation_struct.rb +0 -20
  90. data/lib/workos/types/magic_auth_challenge_struct.rb +0 -12
  91. data/lib/workos/types/organization_membership_struct.rb +0 -16
  92. data/lib/workos/types/organization_struct.rb +0 -17
  93. data/lib/workos/types/profile_struct.rb +0 -21
  94. data/lib/workos/types/provider_enum.rb +0 -16
  95. data/lib/workos/types/user_struct.rb +0 -18
  96. data/lib/workos/types/verify_challenge_struct.rb +0 -13
  97. data/lib/workos/types/webhook_struct.rb +0 -15
  98. data/sorbet/config +0 -2
  99. data/sorbet/rbi/gems/addressable@2.8.0.rbi +0 -290
  100. data/sorbet/rbi/gems/ast@2.4.2.rbi +0 -54
  101. data/sorbet/rbi/gems/codecov@0.2.12.rbi +0 -55
  102. data/sorbet/rbi/gems/coderay@1.1.3.rbi +0 -8
  103. data/sorbet/rbi/gems/crack@0.4.5.rbi +0 -57
  104. data/sorbet/rbi/gems/diff-lcs@1.4.4.rbi +0 -185
  105. data/sorbet/rbi/gems/docile@1.3.5.rbi +0 -54
  106. data/sorbet/rbi/gems/hashdiff@1.0.1.rbi +0 -82
  107. data/sorbet/rbi/gems/json@2.5.1.rbi +0 -109
  108. data/sorbet/rbi/gems/method_source@1.0.0.rbi +0 -8
  109. data/sorbet/rbi/gems/parallel@1.20.1.rbi +0 -113
  110. data/sorbet/rbi/gems/parser@3.0.1.0.rbi +0 -1187
  111. data/sorbet/rbi/gems/pry@0.14.2.rbi +0 -8
  112. data/sorbet/rbi/gems/public_suffix@4.0.6.rbi +0 -146
  113. data/sorbet/rbi/gems/rainbow@3.0.0.rbi +0 -153
  114. data/sorbet/rbi/gems/rake@13.0.3.rbi +0 -807
  115. data/sorbet/rbi/gems/rbi@0.0.16.rbi +0 -2118
  116. data/sorbet/rbi/gems/regexp_parser@2.1.1.rbi +0 -1117
  117. data/sorbet/rbi/gems/rexml@3.2.5.rbi +0 -709
  118. data/sorbet/rbi/gems/rspec-core@3.9.3.rbi +0 -2467
  119. data/sorbet/rbi/gems/rspec-expectations@3.9.4.rbi +0 -1569
  120. data/sorbet/rbi/gems/rspec-mocks@3.9.1.rbi +0 -1493
  121. data/sorbet/rbi/gems/rspec-support@3.9.4.rbi +0 -511
  122. data/sorbet/rbi/gems/rspec@3.9.0.rbi +0 -38
  123. data/sorbet/rbi/gems/rubocop-ast@1.4.1.rbi +0 -1881
  124. data/sorbet/rbi/gems/rubocop@0.93.1.rbi +0 -11497
  125. data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +0 -405
  126. data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +0 -89
  127. data/sorbet/rbi/gems/simplecov@0.21.2.rbi +0 -577
  128. data/sorbet/rbi/gems/simplecov_json_formatter@0.1.2.rbi +0 -8
  129. data/sorbet/rbi/gems/spoom@1.1.15.rbi +0 -1549
  130. data/sorbet/rbi/gems/tapioca@0.7.3.rbi +0 -1718
  131. data/sorbet/rbi/gems/thor@1.2.1.rbi +0 -844
  132. data/sorbet/rbi/gems/unicode-display_width@1.7.0.rbi +0 -22
  133. data/sorbet/rbi/gems/unparser@0.6.2.rbi +0 -8
  134. data/sorbet/rbi/gems/vcr@5.0.0.rbi +0 -699
  135. data/sorbet/rbi/gems/webmock@3.12.2.rbi +0 -662
  136. data/sorbet/rbi/gems/yard-sorbet@0.8.0.rbi +0 -268
  137. data/sorbet/rbi/gems/yard@0.9.26.rbi +0 -4048
  138. data/sorbet/tapioca/config.yml +0 -13
  139. data/sorbet/tapioca/require.rb +0 -4
@@ -1,20 +1,18 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  module WorkOS
5
4
  # The VerifyChallenge class provides a lightweight wrapper around
6
5
  # a WorkOS Authentication Challenge resource.
7
6
  class VerifyChallenge
8
7
  include HashProvider
9
- extend T::Sig
10
8
 
11
9
  attr_accessor :challenge, :valid
12
10
 
13
- sig { params(json: String).void }
14
11
  def initialize(json)
15
- raw = parse_json(json)
16
- @challenge = T.let(raw.challenge, Hash)
17
- @valid = raw.valid
12
+ hash = JSON.parse(json, symbolize_names: true)
13
+
14
+ @challenge = hash[:challenge]
15
+ @valid = hash[:valid]
18
16
  end
19
17
 
20
18
  def to_json(*)
@@ -23,17 +21,5 @@ module WorkOS
23
21
  valid: valid,
24
22
  }
25
23
  end
26
-
27
- private
28
-
29
- sig { params(json_string: String).returns(WorkOS::Types::VerifyChallengeStruct) }
30
- def parse_json(json_string)
31
- hash = JSON.parse(json_string, symbolize_names: true)
32
-
33
- WorkOS::Types::VerifyChallengeStruct.new(
34
- challenge: hash[:challenge],
35
- valid: hash[:valid],
36
- )
37
- end
38
24
  end
39
25
  end
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
- # typed: strong
3
2
 
4
3
  module WorkOS
5
- VERSION = '4.0.0'
4
+ VERSION = '4.2.0'
6
5
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: true
3
2
 
4
3
  module WorkOS
5
4
  # The Webhook class provides a lightweight wrapper around
@@ -7,18 +6,16 @@ module WorkOS
7
6
  # in user space, and is instantiated internally but exposed.
8
7
  class Webhook
9
8
  include HashProvider
10
- extend T::Sig
11
9
 
12
10
  attr_accessor :id, :event, :data, :created_at
13
11
 
14
- sig { params(json: String).void }
15
12
  def initialize(json)
16
- raw = parse_json(json)
13
+ hash = JSON.parse(json, symbolize_names: true)
17
14
 
18
- @id = T.let(raw.id, String)
19
- @event = T.let(raw.event, String)
20
- @data = raw.data
21
- @created_at = T.let(raw.created_at, String)
15
+ @id = hash[:id]
16
+ @event = hash[:event]
17
+ @data = hash[:data]
18
+ @created_at = hash[:created_at]
22
19
  end
23
20
 
24
21
  def to_json(*)
@@ -29,23 +26,5 @@ module WorkOS
29
26
  created_at: created_at,
30
27
  }
31
28
  end
32
-
33
- private
34
-
35
- sig do
36
- params(
37
- json_string: String,
38
- ).returns(WorkOS::Types::WebhookStruct)
39
- end
40
- def parse_json(json_string)
41
- hash = JSON.parse(json_string, symbolize_names: true)
42
-
43
- WorkOS::Types::WebhookStruct.new(
44
- id: hash[:id],
45
- event: hash[:event],
46
- data: hash[:data],
47
- created_at: hash[:created_at],
48
- )
49
- end
50
29
  end
51
30
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: true
3
2
 
4
3
  require 'openssl'
5
4
 
@@ -14,8 +13,6 @@ module WorkOS
14
13
  #
15
14
  module Webhooks
16
15
  class << self
17
- extend T::Sig
18
-
19
16
  DEFAULT_TOLERANCE = 180
20
17
 
21
18
  # Initializes an Event object from a JSON payload
@@ -37,14 +34,6 @@ module WorkOS
37
34
  #
38
35
  # @return [WorkOS::Webhook]
39
36
  # rubocop:enable Layout/LineLength
40
- sig do
41
- params(
42
- payload: String,
43
- sig_header: String,
44
- secret: String,
45
- tolerance: Integer,
46
- ).returns(WorkOS::Webhook)
47
- end
48
37
  def construct_event(
49
38
  payload:,
50
39
  sig_header:,
@@ -74,14 +63,6 @@ module WorkOS
74
63
  #
75
64
  # @return Boolean
76
65
  # rubocop:enable Layout/LineLength
77
- sig do
78
- params(
79
- payload: String,
80
- sig_header: String,
81
- secret: String,
82
- tolerance: Integer,
83
- ).returns(T::Boolean)
84
- end
85
66
  # rubocop:disable Metrics/AbcSize
86
67
  def verify_header(
87
68
  payload:,
@@ -134,11 +115,6 @@ module WorkOS
134
115
  # => ['1626125972272', '80f7ab7efadc306eb5797c588cee9410da9be4416782b497bf1e1bf4175fb928']
135
116
  #
136
117
  # @return Array
137
- sig do
138
- params(
139
- sig_header: String,
140
- ).returns([String, String])
141
- end
142
118
  def get_timestamp_and_signature_hash(
143
119
  sig_header:
144
120
  )
@@ -174,13 +150,6 @@ module WorkOS
174
150
  #
175
151
  # @return String
176
152
  # rubocop:enable Layout/LineLength
177
- sig do
178
- params(
179
- timestamp: String,
180
- payload: String,
181
- secret: String,
182
- ).returns(String)
183
- end
184
153
  def compute_signature(
185
154
  timestamp:,
186
155
  payload:,
@@ -193,19 +162,13 @@ module WorkOS
193
162
 
194
163
  # Constant time string comparison to prevent timing attacks
195
164
  # Code borrowed from ActiveSupport
196
- sig do
197
- params(
198
- str_a: String,
199
- str_b: String,
200
- ).returns(T::Boolean)
201
- end
202
165
  def secure_compare(
203
166
  str_a:,
204
167
  str_b:
205
168
  )
206
169
  return false unless str_a.bytesize == str_b.bytesize
207
170
 
208
- l = T.unsafe(str_a.unpack("C#{str_a.bytesize}"))
171
+ l = str_a.unpack("C#{str_a.bytesize}")
209
172
 
210
173
  res = 0
211
174
  str_b.each_byte { |byte| res |= byte ^ l.shift }
data/lib/workos.rb CHANGED
@@ -1,8 +1,6 @@
1
1
  # frozen_string_literal: true
2
- # typed: true
3
2
 
4
3
  require 'workos/version'
5
- require 'sorbet-runtime'
6
4
  require 'json'
7
5
  require 'workos/hash_provider'
8
6
  require 'workos/configuration'
@@ -58,6 +56,7 @@ module WorkOS
58
56
  autoload :Event, 'workos/event'
59
57
  autoload :Events, 'workos/events'
60
58
  autoload :Factor, 'workos/factor'
59
+ autoload :Impersonator, 'workos/impersonator'
61
60
  autoload :Invitation, 'workos/invitation'
62
61
  autoload :MFA, 'workos/mfa'
63
62
  autoload :Organization, 'workos/organization'
@@ -67,6 +66,7 @@ module WorkOS
67
66
  autoload :Portal, 'workos/portal'
68
67
  autoload :Profile, 'workos/profile'
69
68
  autoload :ProfileAndToken, 'workos/profile_and_token'
69
+ autoload :RefreshAuthenticationResponse, 'workos/refresh_authentication_response'
70
70
  autoload :SSO, 'workos/sso'
71
71
  autoload :Types, 'workos/types'
72
72
  autoload :User, 'workos/user'
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS::AuditLogs do
5
4
  it_behaves_like 'client'
@@ -48,7 +47,7 @@ describe WorkOS::AuditLogs do
48
47
  idempotency_key: 'idempotency_key',
49
48
  )
50
49
 
51
- expect(response).to eq T::Private::Types::Void::VOID
50
+ expect(response.code).to eq '201'
52
51
  end
53
52
  end
54
53
  end
@@ -61,7 +60,7 @@ describe WorkOS::AuditLogs do
61
60
  event: valid_event,
62
61
  )
63
62
 
64
- expect(response).to eq T::Private::Types::Void::VOID
63
+ expect(response.code).to eq '201'
65
64
  end
66
65
  end
67
66
  end
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS do
5
4
  describe '.configure' do
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS::DirectorySync do
5
4
  it_behaves_like 'client'
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS::DirectoryUser do
5
4
  # rubocop:disable Layout/LineLength
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS::Events do
5
4
  it_behaves_like 'client'
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS::MFA do
5
4
  it_behaves_like 'client'
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS::Organizations do
5
4
  it_behaves_like 'client'
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS::Passwordless do
5
4
  it_behaves_like 'client'
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS::Portal do
5
4
  it_behaves_like 'client'
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  require 'securerandom'
5
4
 
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  describe WorkOS::UserManagement do
5
4
  it_behaves_like 'client'
@@ -377,7 +376,7 @@ describe WorkOS::UserManagement do
377
376
  describe '.authenticate_with_password' do
378
377
  context 'with a valid password' do
379
378
  it 'returns user' do
380
- VCR.use_cassette('user_management/authenticate_with_password/valid') do
379
+ VCR.use_cassette('user_management/authenticate_with_password/valid', tag: :token) do
381
380
  authentication_response = WorkOS::UserManagement.authenticate_with_password(
382
381
  email: 'test@workos.app',
383
382
  password: '7YtYic00VWcXatPb',
@@ -418,6 +417,24 @@ describe WorkOS::UserManagement do
418
417
  user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/108.0.0.0 Safari/537.36',
419
418
  )
420
419
  expect(authentication_response.user.id).to eq('user_01H93ZY4F80YZRRS6N59Z2HFVS')
420
+ expect(authentication_response.access_token).to eq('<ACCESS_TOKEN>')
421
+ expect(authentication_response.refresh_token).to eq('<REFRESH_TOKEN>')
422
+ end
423
+ end
424
+
425
+ context 'when the user is being impersonated' do
426
+ it 'contains the impersonator metadata' do
427
+ VCR.use_cassette('user_management/authenticate_with_code/valid_with_impersonator') do
428
+ authentication_response = WorkOS::UserManagement.authenticate_with_code(
429
+ code: '01HRX85ATQB2MN40K4FZ9C2HFR',
430
+ client_id: 'client_01GS91XFB2YPR1C0NR5SH758Q0',
431
+ )
432
+
433
+ expect(authentication_response.impersonator).to have_attributes(
434
+ email: 'admin@foocorp.com',
435
+ reason: 'For testing.',
436
+ )
437
+ end
421
438
  end
422
439
  end
423
440
  end
@@ -438,10 +455,42 @@ describe WorkOS::UserManagement do
438
455
  end
439
456
  end
440
457
 
458
+ describe '.authenticate_with_refresh_token' do
459
+ context 'with a valid refresh_token' do
460
+ it 'returns user' do
461
+ VCR.use_cassette('user_management/authenticate_with_refresh_token/valid', tag: :token) do
462
+ authentication_response = WorkOS::UserManagement.authenticate_with_refresh_token(
463
+ refresh_token: 'some_refresh_token',
464
+ client_id: 'client_123',
465
+ ip_address: '200.240.210.16',
466
+ user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/108.0.0.0 Safari/537.36',
467
+ )
468
+ expect(authentication_response.access_token).to eq('<ACCESS_TOKEN>')
469
+ expect(authentication_response.refresh_token).to eq('<REFRESH_TOKEN>')
470
+ end
471
+ end
472
+ end
473
+
474
+ context 'with an invalid refresh_token' do
475
+ it 'raises an error' do
476
+ VCR.use_cassette('user_management/authenticate_with_refresh_code/invalid', tag: :token) do
477
+ expect do
478
+ WorkOS::UserManagement.authenticate_with_refresh_token(
479
+ refresh_token: 'invalid',
480
+ client_id: 'client_123',
481
+ ip_address: '200.240.210.16',
482
+ user_agent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) Chrome/108.0.0.0 Safari/537.36',
483
+ )
484
+ end.to raise_error(WorkOS::InvalidRequestError, /Status 400/)
485
+ end
486
+ end
487
+ end
488
+ end
489
+
441
490
  describe '.authenticate_with_magic_auth' do
442
491
  context 'with a valid code' do
443
492
  it 'returns user' do
444
- VCR.use_cassette('user_management/authenticate_with_magic_auth/valid') do
493
+ VCR.use_cassette('user_management/authenticate_with_magic_auth/valid', tag: :token) do
445
494
  authentication_response = WorkOS::UserManagement.authenticate_with_magic_auth(
446
495
  code: '452079',
447
496
  client_id: 'project_01EGKAEB7G5N88E83MF99J785F',
@@ -456,7 +505,7 @@ describe WorkOS::UserManagement do
456
505
 
457
506
  context 'with an invalid code' do
458
507
  it 'returns an error' do
459
- VCR.use_cassette('user_management/authenticate_with_magic_auth/invalid') do
508
+ VCR.use_cassette('user_management/authenticate_with_magic_auth/invalid', tag: :token) do
460
509
  expect do
461
510
  WorkOS::UserManagement.authenticate_with_magic_auth(
462
511
  code: 'invalid',
@@ -472,7 +521,7 @@ describe WorkOS::UserManagement do
472
521
  describe '.authenticate_with_organization_selection' do
473
522
  context 'with a valid code' do
474
523
  it 'returns user' do
475
- VCR.use_cassette('user_management/authenticate_with_organization_selection/valid') do
524
+ VCR.use_cassette('user_management/authenticate_with_organization_selection/valid', tag: :token) do
476
525
  authentication_response = WorkOS::UserManagement.authenticate_with_organization_selection(
477
526
  client_id: 'project_01EGKAEB7G5N88E83MF99J785F',
478
527
  organization_id: 'org_01H5JQDV7R7ATEYZDEG0W5PRYS',
@@ -488,7 +537,7 @@ describe WorkOS::UserManagement do
488
537
 
489
538
  context 'with an invalid token' do
490
539
  it 'returns an error' do
491
- VCR.use_cassette('user_management/authenticate_with_organization_selection/invalid') do
540
+ VCR.use_cassette('user_management/authenticate_with_organization_selection/invalid', tag: :token) do
492
541
  expect do
493
542
  WorkOS::UserManagement.authenticate_with_organization_selection(
494
543
  organization_id: 'invalid_org_id',
@@ -504,7 +553,7 @@ describe WorkOS::UserManagement do
504
553
  describe '.authenticate_with_totp' do
505
554
  context 'with a valid code' do
506
555
  it 'returns user' do
507
- VCR.use_cassette('user_management/authenticate_with_totp/valid') do
556
+ VCR.use_cassette('user_management/authenticate_with_totp/valid', tag: :token) do
508
557
  authentication_response = WorkOS::UserManagement.authenticate_with_totp(
509
558
  code: '01H93ZZHA0JBHFJH9RR11S83YN',
510
559
  client_id: 'client_123',
@@ -520,7 +569,7 @@ describe WorkOS::UserManagement do
520
569
 
521
570
  context 'with an invalid code' do
522
571
  it 'raises an error' do
523
- VCR.use_cassette('user_management/authenticate_with_totp/invalid') do
572
+ VCR.use_cassette('user_management/authenticate_with_totp/invalid', tag: :token) do
524
573
  expect do
525
574
  WorkOS::UserManagement.authenticate_with_totp(
526
575
  code: 'invalid',
@@ -539,7 +588,7 @@ describe WorkOS::UserManagement do
539
588
  describe '.authenticate_with_email_verification' do
540
589
  context 'with a valid code' do
541
590
  it 'returns user' do
542
- VCR.use_cassette('user_management/authenticate_with_email_verification/valid') do
591
+ VCR.use_cassette('user_management/authenticate_with_email_verification/valid', tag: :token) do
543
592
  authentication_response = WorkOS::UserManagement.authenticate_with_email_verification(
544
593
  code: '01H93ZZHA0JBHFJH9RR11S83YN',
545
594
  client_id: 'client_123',
@@ -554,7 +603,7 @@ describe WorkOS::UserManagement do
554
603
 
555
604
  context 'with an invalid code' do
556
605
  it 'raises an error' do
557
- VCR.use_cassette('user_management/authenticate_with_email_verification/invalid') do
606
+ VCR.use_cassette('user_management/authenticate_with_email_verification/invalid', tag: :token) do
558
607
  expect do
559
608
  WorkOS::UserManagement.authenticate_with_email_verification(
560
609
  code: 'invalid',
@@ -1,5 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
2
 
4
3
  require 'json'
5
4
  require 'openssl'
data/spec/spec_helper.rb CHANGED
@@ -1,13 +1,4 @@
1
1
  # frozen_string_literal: true
2
- # typed: false
3
-
4
- require 'simplecov'
5
- SimpleCov.start
6
-
7
- if ENV['CI'] == 'true'
8
- require 'codecov'
9
- SimpleCov.formatter = SimpleCov::Formatter::Codecov
10
- end
11
2
 
12
3
  $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
13
4
  $LOAD_PATH << File.join(File.dirname(__FILE__))
@@ -26,6 +17,12 @@ SPEC_ROOT = File.dirname __FILE__
26
17
  VCR.configure do |config|
27
18
  config.cassette_library_dir = 'spec/support/fixtures/vcr_cassettes'
28
19
  config.filter_sensitive_data('<API_KEY>') { WorkOS.config.key }
20
+ config.filter_sensitive_data('<ACCESS_TOKEN>', :token) do |interaction|
21
+ JSON.parse(interaction.response.body)['access_token']
22
+ end
23
+ config.filter_sensitive_data('<REFRESH_TOKEN>', :token) do |interaction|
24
+ JSON.parse(interaction.response.body)['refresh_token']
25
+ end
29
26
  config.hook_into :webmock
30
27
  end
31
28
 
@@ -76,7 +76,7 @@ http_interactions:
76
76
  - cloudflare
77
77
  body:
78
78
  encoding: ASCII-8BIT
79
- string: '{"user":{"object":"user","id":"user_01H93ZY4F80YZRRS6N59Z2HFVS","email":"test@workos.app","email_verified":false,"first_name":"Lucille","last_name":"Bluth","created_at":"2023-08-30T19:50:13.214Z","updated_at":"2023-08-30T19:50:13.214Z","user_type":"managed","sso_profile_id":"prof_01H93ZTVWYPAT4RKDSPFPPXH0J"}}'
79
+ string: '{"user":{"object":"user","id":"user_01H93ZY4F80YZRRS6N59Z2HFVS","email":"test@workos.app","email_verified":false,"first_name":"Lucille","last_name":"Bluth","created_at":"2023-08-30T19:50:13.214Z","updated_at":"2023-08-30T19:50:13.214Z","user_type":"managed","sso_profile_id":"prof_01H93ZTVWYPAT4RKDSPFPPXH0J"},"access_token":"<ACCESS_TOKEN>","refresh_token":"<REFRESH_TOKEN>"}'
80
80
  http_version:
81
81
  recorded_at: Wed, 30 Aug 2023 19:51:51 GMT
82
82
  recorded_with: VCR 5.0.0
@@ -0,0 +1,80 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.workos.com/user_management/authenticate
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"code":"01HRX85ATQB2MN40K4FZ9C2HFR","client_id":"client_01GS91XFB2YPR1C0NR5SH758Q0","client_secret":"<API_KEY>","ip_address":null,"user_agent":null,"grant_type":"authorization_code"}'
9
+ headers:
10
+ Content-Type:
11
+ - application/json
12
+ Accept-Encoding:
13
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
14
+ Accept:
15
+ - "*/*"
16
+ User-Agent:
17
+ - WorkOS; ruby/3.1.1; arm64-darwin21; v4.0.0
18
+ response:
19
+ status:
20
+ code: 200
21
+ message: OK
22
+ headers:
23
+ Date:
24
+ - Thu, 14 Mar 2024 01:10:34 GMT
25
+ Content-Type:
26
+ - application/json; charset=utf-8
27
+ Content-Length:
28
+ - '875'
29
+ Connection:
30
+ - keep-alive
31
+ Cf-Ray:
32
+ - 8640628169fa0d54-LAX
33
+ Cf-Cache-Status:
34
+ - DYNAMIC
35
+ Etag:
36
+ - W/"47c-66YSPNMN47PZx4ahCgTQvmryR90"
37
+ Strict-Transport-Security:
38
+ - max-age=15552000; includeSubDomains
39
+ Vary:
40
+ - Origin, Accept-Encoding
41
+ Via:
42
+ - 1.1 spaces-router (devel)
43
+ Access-Control-Allow-Credentials:
44
+ - 'true'
45
+ Content-Security-Policy:
46
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
47
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
48
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
49
+ Expect-Ct:
50
+ - max-age=0
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Content-Type-Options:
54
+ - nosniff
55
+ X-Dns-Prefetch-Control:
56
+ - 'off'
57
+ X-Download-Options:
58
+ - noopen
59
+ X-Frame-Options:
60
+ - SAMEORIGIN
61
+ X-Permitted-Cross-Domain-Policies:
62
+ - none
63
+ X-Request-Id:
64
+ - f22ea52f-bf1a-4d5e-acb1-10b2e99ffbe5
65
+ X-Xss-Protection:
66
+ - '0'
67
+ Set-Cookie:
68
+ - __cf_bm=pYiV6zsrN3V8vd8vKA_bp0qN2LYd1HUQAIVHcevLYw4-1710378634-1.0.1.1-wNPVRK6jpySHc7bqiAVCtM6T64oKxFAjrcvJNJAPU.RhZFRgPfQRGWYbC4l0ckcsyhZ2_I7GTu17yNowC.smHA;
69
+ path=/; expires=Thu, 14-Mar-24 01:40:34 GMT; domain=.workos.com; HttpOnly;
70
+ Secure; SameSite=None
71
+ - __cfruid=914cc38ede83520e897d1eaef25a8e5daa4975d0-1710378634; path=/; domain=.workos.com;
72
+ HttpOnly; Secure; SameSite=None
73
+ Server:
74
+ - cloudflare
75
+ body:
76
+ encoding: ASCII-8BIT
77
+ string: '{"user":{"object":"user","id":"user_01HP0B4ZV2FWWVY0BF16GFDAER","email":"bob@example.com","email_verified":false,"first_name":"Bob","last_name":"Loblaw","profile_picture_url":null,"created_at":"2024-02-06T23:13:18.137Z","updated_at":"2024-02-06T23:13:36.946Z"},"impersonator":{"email":"admin@foocorp.com","reason":"For testing."},"access_token":"<ACCESS_TOKEN>","refresh_token":"<REFRESH_TOKEN>"}'
78
+ http_version:
79
+ recorded_at: Thu, 14 Mar 2024 01:10:34 GMT
80
+ recorded_with: VCR 5.0.0
@@ -75,7 +75,7 @@ http_interactions:
75
75
  - cloudflare
76
76
  body:
77
77
  encoding: ASCII-8BIT
78
- string: '{"user":{"object":"user","id":"user_01H93ZY4F80YZRRS6N59Z2HFVS","email":"test@workos.app","email_verified":false,"first_name":"Lucille","last_name":"Bluth","created_at":"2023-08-30T19:50:13.214Z","updated_at":"2023-08-30T19:50:13.214Z","user_type":"managed","sso_profile_id":"prof_01H93ZTVWYPAT4RKDSPFPPXH0J"}}'
78
+ string: '{"user":{"object":"user","id":"user_01H93ZY4F80YZRRS6N59Z2HFVS","email":"test@workos.app","email_verified":false,"first_name":"Lucille","last_name":"Bluth","created_at":"2023-08-30T19:50:13.214Z","updated_at":"2023-08-30T19:50:13.214Z","user_type":"managed","sso_profile_id":"prof_01H93ZTVWYPAT4RKDSPFPPXH0J"},"access_token":"<ACCESS_TOKEN>","refresh_token":"<REFRESH_TOKEN>"}'
79
79
  http_version:
80
80
  recorded_at: Wed, 30 Aug 2023 19:51:51 GMT
81
81
  recorded_with: VCR 5.0.0
@@ -76,7 +76,7 @@ http_interactions:
76
76
  - cloudflare
77
77
  body:
78
78
  encoding: ASCII-8BIT
79
- string: '{"user":{"object":"user","id":"user_01H93WD0R0KWF8Q7BK02C0RPYJ","email":"test@workos.app","email_verified":true,"first_name":"Lucille","last_name":"Bluth","created_at":"2023-08-30T18:48:26.517Z","updated_at":"2023-08-30T18:58:00.821Z","user_type":"unmanaged","email_verified_at":"2023-08-30T18:58:00.915Z","google_oauth_profile_id":null,"microsoft_oauth_profile_id":null}}'
79
+ string: '{"user":{"object":"user","id":"user_01H93WD0R0KWF8Q7BK02C0RPYJ","email":"test@workos.app","email_verified":true,"first_name":"Lucille","last_name":"Bluth","created_at":"2023-08-30T18:48:26.517Z","updated_at":"2023-08-30T18:58:00.821Z","user_type":"unmanaged","email_verified_at":"2023-08-30T18:58:00.915Z","google_oauth_profile_id":null,"microsoft_oauth_profile_id":null},"access_token":"<ACCESS_TOKEN>","refresh_token":"<REFRESH_TOKEN>"}'
80
80
  http_version:
81
81
  recorded_at: Wed, 30 Aug 2023 18:58:00 GMT
82
82
  recorded_with: VCR 5.0.0
@@ -76,7 +76,7 @@ http_interactions:
76
76
  - cloudflare
77
77
  body:
78
78
  encoding: UTF-8
79
- string: '{"organization_id":"org_01H5JQDV7R7ATEYZDEG0W5PRYS","user":{"object":"user","id":"user_01H93WD0R0KWF8Q7BK02C0RPYJ","email":"test@workos.app","email_verified":true,"first_name":"Lucille","last_name":"Bluth","created_at":"2023-08-30T18:48:26.517Z","updated_at":"2023-08-30T18:58:00.821Z","user_type":"unmanaged","email_verified_at":"2023-08-30T18:58:00.915Z","google_oauth_profile_id":null,"microsoft_oauth_profile_id":null}}'
79
+ string: '{"organization_id":"org_01H5JQDV7R7ATEYZDEG0W5PRYS","user":{"object":"user","id":"user_01H93WD0R0KWF8Q7BK02C0RPYJ","email":"test@workos.app","email_verified":true,"first_name":"Lucille","last_name":"Bluth","created_at":"2023-08-30T18:48:26.517Z","updated_at":"2023-08-30T18:58:00.821Z","user_type":"unmanaged","email_verified_at":"2023-08-30T18:58:00.915Z","google_oauth_profile_id":null,"microsoft_oauth_profile_id":null},"access_token":"<ACCESS_TOKEN>","refresh_token":"<REFRESH_TOKEN>"}'
80
80
  http_version:
81
81
  recorded_at: Wed, 20 Dec 2023 22:00:12 GMT
82
82
  recorded_with: VCR 5.0.0
@@ -76,7 +76,7 @@ http_interactions:
76
76
  - cloudflare
77
77
  body:
78
78
  encoding: ASCII-8BIT
79
- string: '{"user":{"object":"user","id":"user_01H7TVSKS45SDHN5V9XPSM6H44","email":"test@workos.app","email_verified":true,"first_name":null,"last_name":null,"created_at":"2023-08-14T20:28:58.929Z","updated_at":"2023-08-28T15:56:19.798Z","user_type":"unmanaged","email_verified_at":"2023-08-22T11:18:01.850Z","google_oauth_profile_id":null,"microsoft_oauth_profile_id":null}}'
79
+ string: '{"user":{"object":"user","id":"user_01H7TVSKS45SDHN5V9XPSM6H44","email":"test@workos.app","email_verified":true,"first_name":null,"last_name":null,"created_at":"2023-08-14T20:28:58.929Z","updated_at":"2023-08-28T15:56:19.798Z","user_type":"unmanaged","email_verified_at":"2023-08-22T11:18:01.850Z","google_oauth_profile_id":null,"microsoft_oauth_profile_id":null},"access_token":"<ACCESS_TOKEN>","refresh_token":"<REFRESH_TOKEN>"}'
80
80
  http_version:
81
81
  recorded_at: Tue, 29 Aug 2023 00:24:25 GMT
82
82
  recorded_with: VCR 5.0.0