workos 2.3.0 → 2.5.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +2 -2
- data/README.md +4 -1
- data/lib/workos/audit_trail.rb +0 -1
- data/lib/workos/client.rb +14 -5
- data/lib/workos/configuration.rb +17 -0
- data/lib/workos/directory_group.rb +5 -1
- data/lib/workos/directory_sync.rb +0 -1
- data/lib/workos/directory_user.rb +7 -1
- data/lib/workos/errors.rb +3 -0
- data/lib/workos/mfa.rb +22 -7
- data/lib/workos/organizations.rb +0 -1
- data/lib/workos/passwordless.rb +0 -1
- data/lib/workos/portal.rb +0 -1
- data/lib/workos/sso.rb +1 -2
- data/lib/workos/types/directory_group_struct.rb +1 -0
- data/lib/workos/types/directory_user_struct.rb +2 -0
- data/lib/workos/types/{verify_factor_struct.rb → verify_challenge_struct.rb} +3 -3
- data/lib/workos/types.rb +1 -1
- data/lib/workos/{verify_factor.rb → verify_challenge.rb} +5 -6
- data/lib/workos/version.rb +1 -1
- data/lib/workos.rb +17 -7
- data/spec/lib/workos/configuration_spec.rb +61 -0
- data/spec/lib/workos/directory_sync_spec.rb +4 -1
- data/spec/lib/workos/mfa_spec.rb +93 -74
- data/spec/lib/workos/sso_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -2
- data/spec/support/fixtures/vcr_cassettes/directory_sync/get_group.yml +10 -12
- data/spec/support/fixtures/vcr_cassettes/directory_sync/get_user.yml +28 -31
- data/spec/support/fixtures/vcr_cassettes/mfa/challenge_factor_generic_valid.yml +2 -2
- data/spec/support/fixtures/vcr_cassettes/mfa/challenge_factor_sms_valid.yml +2 -2
- data/spec/support/fixtures/vcr_cassettes/mfa/challenge_factor_totp_valid.yml +2 -2
- data/spec/support/fixtures/vcr_cassettes/mfa/{verify_factor_generic_expired.yml → verify_challenge_generic_expired.yml} +2 -2
- data/spec/support/fixtures/vcr_cassettes/mfa/{verify_factor_generic_invalid.yml → verify_challenge_generic_invalid.yml} +2 -2
- data/spec/support/fixtures/vcr_cassettes/mfa/{verify_factor_generic_valid.yml → verify_challenge_generic_valid.yml} +2 -2
- data/spec/support/fixtures/vcr_cassettes/mfa/{verify_factor_generic_valid_is_false.yml → verify_challenge_generic_valid_is_false.yml} +2 -2
- data/spec/support/shared_examples/client_spec.rb +14 -0
- metadata +16 -16
- data/lib/workos/base.rb +0 -18
- data/spec/lib/workos/base_spec.rb +0 -30
data/spec/lib/workos/mfa_spec.rb
CHANGED
@@ -4,8 +4,8 @@
|
|
4
4
|
describe WorkOS::MFA do
|
5
5
|
it_behaves_like 'client'
|
6
6
|
|
7
|
-
describe 'enroll_factor
|
8
|
-
context '
|
7
|
+
describe '.enroll_factor' do
|
8
|
+
context 'with valid generic argument' do
|
9
9
|
it 'returns a valid factor object' do
|
10
10
|
VCR.use_cassette 'mfa/enroll_factor_generic_valid' do
|
11
11
|
factor = described_class.enroll_factor(
|
@@ -16,7 +16,7 @@ describe WorkOS::MFA do
|
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
|
-
context '
|
19
|
+
context 'with valid totp arguments' do
|
20
20
|
it 'returns a valid factor object' do
|
21
21
|
VCR.use_cassette 'mfa/enroll_factor_totp_valid' do
|
22
22
|
factor = described_class.enroll_factor(
|
@@ -29,7 +29,7 @@ describe WorkOS::MFA do
|
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
|
-
context '
|
32
|
+
context 'with valid sms arguments' do
|
33
33
|
it 'returns a valid factor object' do
|
34
34
|
VCR.use_cassette 'mfa/enroll_factor_sms_valid' do
|
35
35
|
factor = described_class.enroll_factor(
|
@@ -40,10 +40,8 @@ describe WorkOS::MFA do
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
43
|
-
end
|
44
43
|
|
45
|
-
|
46
|
-
context 'enroll factor throws error if type is not sms or totp' do
|
44
|
+
context 'when type is not sms or totp' do
|
47
45
|
it 'returns an error' do
|
48
46
|
expect do
|
49
47
|
described_class.enroll_factor(
|
@@ -57,7 +55,7 @@ describe WorkOS::MFA do
|
|
57
55
|
end
|
58
56
|
end
|
59
57
|
|
60
|
-
context '
|
58
|
+
context 'when type is totp but missing arguments' do
|
61
59
|
it 'returns an error' do
|
62
60
|
expect do
|
63
61
|
described_class.enroll_factor(
|
@@ -70,7 +68,7 @@ describe WorkOS::MFA do
|
|
70
68
|
)
|
71
69
|
end
|
72
70
|
end
|
73
|
-
context '
|
71
|
+
context 'when type is sms and phone number is nil' do
|
74
72
|
it 'returns an error' do
|
75
73
|
expect do
|
76
74
|
described_class.enroll_factor(
|
@@ -84,7 +82,7 @@ describe WorkOS::MFA do
|
|
84
82
|
end
|
85
83
|
end
|
86
84
|
|
87
|
-
describe '
|
85
|
+
describe '.challenge_factor' do
|
88
86
|
context 'challenge with totp' do
|
89
87
|
it 'returns challenge factor object for totp' do
|
90
88
|
VCR.use_cassette 'mfa/challenge_factor_totp_valid' do
|
@@ -118,9 +116,7 @@ describe WorkOS::MFA do
|
|
118
116
|
end
|
119
117
|
end
|
120
118
|
end
|
121
|
-
end
|
122
119
|
|
123
|
-
describe 'challenge factor with invalid arguments' do
|
124
120
|
context 'challenge with totp mssing authentication_factor_id' do
|
125
121
|
it 'returns argument error' do
|
126
122
|
expect do
|
@@ -133,48 +129,58 @@ describe WorkOS::MFA do
|
|
133
129
|
end
|
134
130
|
end
|
135
131
|
|
136
|
-
describe '
|
137
|
-
|
138
|
-
|
139
|
-
VCR.use_cassette 'mfa/
|
140
|
-
|
132
|
+
describe '.verify_factor' do
|
133
|
+
it 'throws a warning' do
|
134
|
+
expect do
|
135
|
+
VCR.use_cassette 'mfa/verify_challenge_generic_valid' do
|
136
|
+
described_class.verify_factor(
|
141
137
|
authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
|
142
138
|
code: '897792',
|
143
139
|
)
|
144
|
-
expect(verify_factor.valid == 'true')
|
145
140
|
end
|
146
|
-
end
|
141
|
+
end.to output("[DEPRECATION] `verify_factor` is deprecated. Please use `verify_challenge` instead.\n").to_stderr
|
147
142
|
end
|
148
143
|
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
expect(verify_factor.valid == 'false')
|
157
|
-
end
|
144
|
+
it 'calls verify_challenge' do
|
145
|
+
VCR.use_cassette 'mfa/verify_challenge_generic_valid' do
|
146
|
+
verify_factor = described_class.verify_factor(
|
147
|
+
authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
|
148
|
+
code: '897792',
|
149
|
+
)
|
150
|
+
expect(verify_factor.valid == 'true')
|
158
151
|
end
|
159
152
|
end
|
153
|
+
end
|
160
154
|
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
155
|
+
describe '.verify_challenge' do
|
156
|
+
context 'with generic otp' do
|
157
|
+
context 'and the challenge has not been verified' do
|
158
|
+
it 'returns true if the code is correct' do
|
159
|
+
VCR.use_cassette 'mfa/verify_challenge_generic_valid' do
|
160
|
+
verify_challenge = described_class.verify_challenge(
|
166
161
|
authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
|
167
162
|
code: '897792',
|
168
163
|
)
|
169
|
-
|
164
|
+
expect(verify_challenge.valid == 'true')
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
it 'returns false if the code is incorrect' do
|
169
|
+
VCR.use_cassette 'mfa/verify_challenge_generic_valid_is_false' do
|
170
|
+
verify_challenge = described_class.verify_challenge(
|
171
|
+
authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
|
172
|
+
code: '897792',
|
173
|
+
)
|
174
|
+
expect(verify_challenge.valid == 'false')
|
175
|
+
end
|
170
176
|
end
|
171
177
|
end
|
172
178
|
|
173
|
-
context '
|
174
|
-
it 'returns error
|
175
|
-
VCR.use_cassette 'mfa/
|
179
|
+
context 'and the challenge has already been verified' do
|
180
|
+
it 'returns an error' do
|
181
|
+
VCR.use_cassette 'mfa/verify_challenge_generic_invalid' do
|
176
182
|
expect do
|
177
|
-
described_class.
|
183
|
+
described_class.verify_challenge(
|
178
184
|
authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
|
179
185
|
code: '897792',
|
180
186
|
)
|
@@ -182,51 +188,62 @@ describe WorkOS::MFA do
|
|
182
188
|
end
|
183
189
|
end
|
184
190
|
end
|
185
|
-
end
|
186
|
-
end
|
187
191
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
192
|
+
context 'and the challenge has expired' do
|
193
|
+
it 'returns an error' do
|
194
|
+
VCR.use_cassette 'mfa/verify_challenge_generic_expired' do
|
195
|
+
expect do
|
196
|
+
described_class.verify_challenge(
|
197
|
+
authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
|
198
|
+
code: '897792',
|
199
|
+
)
|
200
|
+
end.to raise_error(WorkOS::InvalidRequestError)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
context 'with missing code argument' do
|
206
|
+
it 'returns an argument error' do
|
207
|
+
expect do
|
208
|
+
described_class.verify_challenge(
|
209
|
+
authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
|
210
|
+
)
|
211
|
+
end.to raise_error(
|
212
|
+
ArgumentError,
|
213
|
+
"Incomplete arguments: 'authentication_challenge_id' and 'code' are required arguments",
|
194
214
|
)
|
195
|
-
end
|
196
|
-
ArgumentError,
|
197
|
-
"Incomplete arguments: 'authentication_challenge_id' and 'code' are required arguments",
|
198
|
-
)
|
215
|
+
end
|
199
216
|
end
|
200
|
-
end
|
201
217
|
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
218
|
+
context 'with missing authentication_challenge_id argument' do
|
219
|
+
it 'returns an error' do
|
220
|
+
expect do
|
221
|
+
described_class.verify_challenge(
|
222
|
+
code: '897792',
|
223
|
+
)
|
224
|
+
end.to raise_error(
|
225
|
+
ArgumentError,
|
226
|
+
"Incomplete arguments: 'authentication_challenge_id' and 'code' are required arguments",
|
207
227
|
)
|
208
|
-
end
|
209
|
-
ArgumentError,
|
210
|
-
"Incomplete arguments: 'authentication_challenge_id' and 'code' are required arguments",
|
211
|
-
)
|
228
|
+
end
|
212
229
|
end
|
213
|
-
end
|
214
230
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
231
|
+
context 'with missing code and authentication_challenge_id arguments' do
|
232
|
+
it 'returns an argument error' do
|
233
|
+
expect do
|
234
|
+
described_class.verify_challenge
|
235
|
+
end.to raise_error(
|
236
|
+
ArgumentError,
|
237
|
+
"Incomplete arguments: 'authentication_challenge_id' and 'code' are required arguments",
|
238
|
+
)
|
239
|
+
end
|
223
240
|
end
|
224
241
|
end
|
225
242
|
end
|
226
243
|
|
227
|
-
describe '
|
228
|
-
context '
|
229
|
-
it '
|
244
|
+
describe '.get_factor' do
|
245
|
+
context 'with a valid id' do
|
246
|
+
it 'returns a factor' do
|
230
247
|
VCR.use_cassette 'mfa/get_factor_valid' do
|
231
248
|
factor = described_class.get_factor(
|
232
249
|
id: 'auth_factor_01FZ4WMXXA09XF6NK1XMKNWB3M',
|
@@ -236,8 +253,8 @@ describe WorkOS::MFA do
|
|
236
253
|
end
|
237
254
|
end
|
238
255
|
|
239
|
-
context 'invalid
|
240
|
-
it '
|
256
|
+
context 'with an invalid id' do
|
257
|
+
it 'returns an error' do
|
241
258
|
VCR.use_cassette 'mfa/get_factor_invalid' do
|
242
259
|
expect do
|
243
260
|
described_class.get_factor(
|
@@ -247,7 +264,9 @@ describe WorkOS::MFA do
|
|
247
264
|
end
|
248
265
|
end
|
249
266
|
end
|
267
|
+
end
|
250
268
|
|
269
|
+
describe '.delete_factor' do
|
251
270
|
context 'deletes facotr' do
|
252
271
|
it 'uses delete_factor to delete factor' do
|
253
272
|
VCR.use_cassette 'mfa/delete_factor' do
|
data/spec/lib/workos/sso_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -25,7 +25,7 @@ SPEC_ROOT = File.dirname __FILE__
|
|
25
25
|
|
26
26
|
VCR.configure do |config|
|
27
27
|
config.cassette_library_dir = 'spec/support/fixtures/vcr_cassettes'
|
28
|
-
config.filter_sensitive_data('<API_KEY>') { WorkOS.key }
|
28
|
+
config.filter_sensitive_data('<API_KEY>') { WorkOS.config.key }
|
29
29
|
config.hook_into :webmock
|
30
30
|
end
|
31
31
|
|
@@ -51,6 +51,6 @@ RSpec.configure do |config|
|
|
51
51
|
end
|
52
52
|
end)
|
53
53
|
|
54
|
-
config.before(:all) { WorkOS.key ||= '' }
|
54
|
+
config.before(:all) { WorkOS.config.key ||= '' }
|
55
55
|
config.before(:each) { VCR.turn_on! }
|
56
56
|
end
|
@@ -14,7 +14,7 @@ http_interactions:
|
|
14
14
|
Accept:
|
15
15
|
- "*/*"
|
16
16
|
User-Agent:
|
17
|
-
- WorkOS; ruby/
|
17
|
+
- WorkOS; ruby/2.7.2; arm64-darwin21; v2.3.0
|
18
18
|
Authorization:
|
19
19
|
- Bearer <API_KEY>
|
20
20
|
response:
|
@@ -23,7 +23,7 @@ http_interactions:
|
|
23
23
|
message: OK
|
24
24
|
headers:
|
25
25
|
Date:
|
26
|
-
-
|
26
|
+
- Thu, 14 Jul 2022 16:49:09 GMT
|
27
27
|
Content-Type:
|
28
28
|
- application/json; charset=utf-8
|
29
29
|
Transfer-Encoding:
|
@@ -37,7 +37,7 @@ http_interactions:
|
|
37
37
|
https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
|
38
38
|
''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
|
39
39
|
Etag:
|
40
|
-
- W/"
|
40
|
+
- W/"277-8j8DgAIILf/mCF7LCmvrqcqdwK4"
|
41
41
|
Expect-Ct:
|
42
42
|
- max-age=0
|
43
43
|
Referrer-Policy:
|
@@ -47,7 +47,7 @@ http_interactions:
|
|
47
47
|
Vary:
|
48
48
|
- Origin, Accept-Encoding
|
49
49
|
Via:
|
50
|
-
- 1.1 spaces-router (
|
50
|
+
- 1.1 spaces-router (b642bf20b975)
|
51
51
|
X-Content-Type-Options:
|
52
52
|
- nosniff
|
53
53
|
X-Dns-Prefetch-Control:
|
@@ -59,24 +59,22 @@ http_interactions:
|
|
59
59
|
X-Permitted-Cross-Domain-Policies:
|
60
60
|
- none
|
61
61
|
X-Request-Id:
|
62
|
-
-
|
62
|
+
- 0f21c2f3-e24a-e3a2-85d3-41ee9e45b3e2
|
63
63
|
X-Xss-Protection:
|
64
64
|
- '0'
|
65
65
|
Cf-Cache-Status:
|
66
66
|
- DYNAMIC
|
67
67
|
Report-To:
|
68
|
-
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=
|
68
|
+
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Hnm%2BEiBTG2ROFxqX2mdwcp0HvQ173SgQlQDCmTmBQEbLv9w2dkcl2qMqYh44OSHRABBCkRfuJ2MtnHuqb6sQ5RjHRMKSCfRqklsOrgd%2FHo0PEE6mW0u%2BlZqBMIlN1BEp"}],"group":"cf-nel","max_age":604800}'
|
69
69
|
Nel:
|
70
70
|
- '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
|
71
71
|
Server:
|
72
72
|
- cloudflare
|
73
73
|
Cf-Ray:
|
74
|
-
-
|
75
|
-
Alt-Svc:
|
76
|
-
- h3=":443"; ma=86400, h3-29=":443"; ma=86400
|
74
|
+
- 72abc002fbd9f039-EWR
|
77
75
|
body:
|
78
76
|
encoding: ASCII-8BIT
|
79
|
-
string: '{"object":"directory_group","id":"directory_group_01G2Z8D4ZR8RJ03Y1W7P9K8NMG","idp_id":"01jlao4614two3d","directory_id":"directory_01G2Z8ADK5NPMVTWF48MVVE4HT","name":"Sales","created_at":"2022-05-13T17:45:31.732Z","updated_at":"2022-
|
80
|
-
http_version:
|
81
|
-
recorded_at:
|
77
|
+
string: '{"object":"directory_group","id":"directory_group_01G2Z8D4ZR8RJ03Y1W7P9K8NMG","idp_id":"01jlao4614two3d","directory_id":"directory_01G2Z8ADK5NPMVTWF48MVVE4HT","organization_id":"org_01EGS4P7QR31EZ4YWD1Z1XA176","name":"Sales","created_at":"2022-05-13T17:45:31.732Z","updated_at":"2022-07-13T17:45:42.618Z","raw_attributes":{"id":"01jlao4614two3d","etag":"\"SEQQBYC70u6XQ2UUjmjNYw6b0a5EzY0mTMShjiZga8A/uLYJ0Hrx1gXXVg9z-zGLBZET2Wo\"","kind":"admin#directory#group","name":"Sales","email":"sales@foo-corp.com","description":"","adminCreated":true,"directMembersCount":"1","nonEditableAliases":["sales@foo-corp.com.test-google-a.com"]}}'
|
78
|
+
http_version:
|
79
|
+
recorded_at: Thu, 14 Jul 2022 16:49:09 GMT
|
82
80
|
recorded_with: VCR 5.0.0
|
@@ -14,7 +14,7 @@ http_interactions:
|
|
14
14
|
Accept:
|
15
15
|
- "*/*"
|
16
16
|
User-Agent:
|
17
|
-
- WorkOS; ruby/
|
17
|
+
- WorkOS; ruby/2.7.2; arm64-darwin21; v2.3.0
|
18
18
|
Authorization:
|
19
19
|
- Bearer <API_KEY>
|
20
20
|
response:
|
@@ -23,64 +23,61 @@ http_interactions:
|
|
23
23
|
message: OK
|
24
24
|
headers:
|
25
25
|
Date:
|
26
|
-
-
|
26
|
+
- Thu, 14 Jul 2022 16:46:23 GMT
|
27
27
|
Content-Type:
|
28
28
|
- application/json; charset=utf-8
|
29
|
-
|
30
|
-
-
|
29
|
+
Content-Length:
|
30
|
+
- '616'
|
31
31
|
Connection:
|
32
32
|
- keep-alive
|
33
|
-
Vary:
|
34
|
-
- Origin, Accept-Encoding
|
35
33
|
Access-Control-Allow-Credentials:
|
36
34
|
- 'true'
|
37
35
|
Content-Security-Policy:
|
38
36
|
- 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
|
39
37
|
https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
|
40
38
|
''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
|
41
|
-
|
42
|
-
-
|
39
|
+
Etag:
|
40
|
+
- W/"680-NPvBik348v8xg6EE7iZMYwD5UXw"
|
43
41
|
Expect-Ct:
|
44
42
|
- max-age=0
|
45
|
-
|
46
|
-
-
|
43
|
+
Referrer-Policy:
|
44
|
+
- no-referrer
|
47
45
|
Strict-Transport-Security:
|
48
46
|
- max-age=15552000; includeSubDomains
|
49
|
-
|
50
|
-
-
|
47
|
+
Vary:
|
48
|
+
- Origin, Accept-Encoding
|
49
|
+
Via:
|
50
|
+
- 1.1 spaces-router (b642bf20b975)
|
51
51
|
X-Content-Type-Options:
|
52
52
|
- nosniff
|
53
|
+
X-Dns-Prefetch-Control:
|
54
|
+
- 'off'
|
55
|
+
X-Download-Options:
|
56
|
+
- noopen
|
57
|
+
X-Frame-Options:
|
58
|
+
- SAMEORIGIN
|
53
59
|
X-Permitted-Cross-Domain-Policies:
|
54
60
|
- none
|
55
|
-
|
56
|
-
-
|
61
|
+
X-Request-Id:
|
62
|
+
- 51a82273-b413-cead-b968-c07ba4d6fd08
|
57
63
|
X-Xss-Protection:
|
58
64
|
- '0'
|
59
|
-
X-Request-Id:
|
60
|
-
- 59862449-73e5-4dfd-93ab-3764b1917801
|
61
|
-
Etag:
|
62
|
-
- W/"4c3-Ikxt2N0fUuSxCjv+RdYvW8W9Xwo"
|
63
|
-
Via:
|
64
|
-
- 1.1 vegur
|
65
65
|
Cf-Cache-Status:
|
66
66
|
- DYNAMIC
|
67
67
|
Report-To:
|
68
|
-
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=
|
68
|
+
- '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=OS7ELJ3A8tkzMafvaIThD%2B5JlYmul1puZlAXTxEKYBLlq%2B6DCtqDqAi4dtr4yRP3khNmg6MwPiuLqtdOXRmPOtag9Ti%2FGK8ra%2BJOlpwkFjD965CNBfzao4EJtExDkbS3"}],"group":"cf-nel","max_age":604800}'
|
69
69
|
Nel:
|
70
70
|
- '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
|
71
71
|
Server:
|
72
72
|
- cloudflare
|
73
73
|
Cf-Ray:
|
74
|
-
-
|
75
|
-
Alt-Svc:
|
76
|
-
- h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400, h3=":443";
|
77
|
-
ma=86400
|
74
|
+
- 72abbbf2b93e8ca5-EWR
|
78
75
|
body:
|
79
76
|
encoding: ASCII-8BIT
|
80
|
-
string: '{"object":"directory_user","id":"directory_user_01FAZYNPC8M0HRYTKFP2GNX852","directory_id":"directory_01FAZYMST676QMTFN1DDJZZX87","idp_id":"6092c280a3f1e19ef6d8cef8","username":"logan@workos.com","emails":[{"primary":true,"value":"logan@workos.com"}],"first_name":"Logan","last_name":"Gingerich","state":"active","raw_attributes":{"id":"6092c280a3f1e19ef6d8cef8","name":"Logan
|
81
|
-
Paul Gingerich","teams":["5f696c8e9a63a60e965aaca8"],"spokeId":null,"lastName":"Gingerich","createdAt":"2021-05-05T16:06:24+0000","firstName":"Logan","updatedAt":"2021-
|
82
|
-
-
|
83
|
-
-
|
84
|
-
http_version:
|
85
|
-
recorded_at:
|
77
|
+
string: '{"object":"directory_user","id":"directory_user_01FAZYNPC8M0HRYTKFP2GNX852","directory_id":"directory_01FAZYMST676QMTFN1DDJZZX87","organization_id":"org_01FAZWCWR03DVWA83NCJYKKD54","idp_id":"6092c280a3f1e19ef6d8cef8","username":"logan@workos.com","emails":[{"primary":true,"value":"logan@workos.com"}],"first_name":"Logan","last_name":"Gingerich","state":"active","raw_attributes":{"id":"6092c280a3f1e19ef6d8cef8","name":"Logan
|
78
|
+
Paul Gingerich","teams":["5f696c8e9a63a60e965aaca8"],"spokeId":null,"lastName":"Gingerich","createdAt":"2021-05-05T16:06:24+0000","firstName":"Logan","updatedAt":"2021-11-11T05:08:14+0000","workEmail":"logan@workos.com","department":"Infra","departmentId":"5f27ada9a5e9bc0001a0ae4a"},"custom_attributes":{},"created_at":"2021-07-19T17:57:57.268Z","updated_at":"2022-01-24T11:23:01.614Z","groups":[{"object":"directory_group","id":"directory_group_01FAZYNNQ4HQ6EBF29MPTH7VKB","idp_id":"5f696c8e9a63a60e965aaca8","directory_id":"directory_01FAZYMST676QMTFN1DDJZZX87","organization_id":"org_01FAZWCWR03DVWA83NCJYKKD54","name":"Team
|
79
|
+
- Platform","created_at":"2021-07-19T17:57:56.580Z","updated_at":"2022-01-24T11:23:01.333Z","raw_attributes":{"id":"5f696c8e9a63a60e965aaca8","name":"Platform","parent":null}},{"object":"directory_group","id":"directory_group_01FAZYNN1NZWMBRAXXDSTB5NFH","idp_id":"5f27ada9a5e9bc0001a0ae4a","directory_id":"directory_01FAZYMST676QMTFN1DDJZZX87","organization_id":"org_01FAZWCWR03DVWA83NCJYKKD54","name":"Department
|
80
|
+
- Infra","created_at":"2021-07-19T17:57:55.893Z","updated_at":"2022-01-24T11:23:01.333Z","raw_attributes":{"id":"5f27ada9a5e9bc0001a0ae4a","name":"Infra","parent":"5f27ada9a5e9bc0001a0ae48"}}]}'
|
81
|
+
http_version:
|
82
|
+
recorded_at: Thu, 14 Jul 2022 16:46:23 GMT
|
86
83
|
recorded_with: VCR 5.0.0
|
@@ -2,10 +2,10 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://api.workos.com/auth/factors/challenge
|
5
|
+
uri: https://api.workos.com/auth/factors/auth_factor_01FZ4WMXXA09XF6NK1XMKNWB3M/challenge
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '{"sms_template":null
|
8
|
+
string: '{"sms_template":null}'
|
9
9
|
headers:
|
10
10
|
Content-Type:
|
11
11
|
- application/json
|
@@ -2,10 +2,10 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://api.workos.com/auth/factors/challenge
|
5
|
+
uri: https://api.workos.com/auth/factors/auth_factor_01FZ4TS14D1PHFNZ9GF6YD8M1F/challenge
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '{"sms_template":"Your code is {{code}}"
|
8
|
+
string: '{"sms_template":"Your code is {{code}}"}'
|
9
9
|
headers:
|
10
10
|
Content-Type:
|
11
11
|
- application/json
|
@@ -2,10 +2,10 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://api.workos.com/auth/factors/challenge
|
5
|
+
uri: https://api.workos.com/auth/factors/auth_factor_01FZ4TS0MWPZR7GATS7KCXANQZ/challenge
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '{"sms_template":null
|
8
|
+
string: '{"sms_template":null}'
|
9
9
|
headers:
|
10
10
|
Content-Type:
|
11
11
|
- application/json
|
@@ -2,10 +2,10 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://api.workos.com/auth/
|
5
|
+
uri: https://api.workos.com/auth/challenges/auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J/verify
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '{"
|
8
|
+
string: '{"code":"897792"}'
|
9
9
|
headers:
|
10
10
|
Content-Type:
|
11
11
|
- application/json
|
@@ -2,10 +2,10 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://api.workos.com/auth/
|
5
|
+
uri: https://api.workos.com/auth/challenges/auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J/verify
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '{"
|
8
|
+
string: '{"code":"897792"}'
|
9
9
|
headers:
|
10
10
|
Content-Type:
|
11
11
|
- application/json
|
@@ -2,10 +2,10 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://api.workos.com/auth/
|
5
|
+
uri: https://api.workos.com/auth/challenges/auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J/verify
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '{"
|
8
|
+
string: '{"code":"897792"}'
|
9
9
|
headers:
|
10
10
|
Content-Type:
|
11
11
|
- application/json
|
@@ -2,10 +2,10 @@
|
|
2
2
|
http_interactions:
|
3
3
|
- request:
|
4
4
|
method: post
|
5
|
-
uri: https://api.workos.com/auth/
|
5
|
+
uri: https://api.workos.com/auth/challenges/auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J/verify
|
6
6
|
body:
|
7
7
|
encoding: UTF-8
|
8
|
-
string: '{"
|
8
|
+
string: '{"code":"897792"}'
|
9
9
|
headers:
|
10
10
|
Content-Type:
|
11
11
|
- application/json
|
@@ -13,4 +13,18 @@ RSpec.shared_examples 'client' do
|
|
13
13
|
it 'returns new instance' do
|
14
14
|
expect(described_class.client.object_id).to_not eq described_class.client.object_id
|
15
15
|
end
|
16
|
+
|
17
|
+
if RUBY_VERSION >= '2.6.0'
|
18
|
+
it 'sets the timeouts, including the write timeout' do
|
19
|
+
expect(described_class.client.open_timeout).to_not be_nil
|
20
|
+
expect(described_class.client.read_timeout).to_not be_nil
|
21
|
+
expect(described_class.client.write_timeout).to_not be_nil
|
22
|
+
end
|
23
|
+
else
|
24
|
+
it 'sets the open and read timeouts, but not the write timeout' do
|
25
|
+
expect(described_class.client.open_timeout).to_not be_nil
|
26
|
+
expect(described_class.client.read_timeout).to_not be_nil
|
27
|
+
expect(described_class.client.write_timeout).to be_nil
|
28
|
+
end
|
29
|
+
end
|
16
30
|
end
|