workos 2.2.0 → 2.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile.lock +2 -2
  3. data/lib/workos/audit_trail.rb +1 -0
  4. data/lib/workos/challenge.rb +2 -1
  5. data/lib/workos/connection.rb +1 -0
  6. data/lib/workos/deprecated_hash_wrapper.rb +76 -0
  7. data/lib/workos/directory.rb +1 -0
  8. data/lib/workos/directory_group.rb +26 -2
  9. data/lib/workos/directory_sync.rb +11 -8
  10. data/lib/workos/directory_user.rb +16 -2
  11. data/lib/workos/factor.rb +2 -6
  12. data/lib/workos/hash_provider.rb +19 -0
  13. data/lib/workos/organization.rb +1 -0
  14. data/lib/workos/organizations.rb +1 -0
  15. data/lib/workos/profile.rb +1 -0
  16. data/lib/workos/profile_and_token.rb +1 -0
  17. data/lib/workos/sso.rb +1 -0
  18. data/lib/workos/types/challenge_struct.rb +1 -1
  19. data/lib/workos/types/directory_group_struct.rb +6 -0
  20. data/lib/workos/types/directory_user_struct.rb +2 -0
  21. data/lib/workos/types/factor_struct.rb +0 -1
  22. data/lib/workos/types/passwordless_session_struct.rb +2 -0
  23. data/lib/workos/types/verify_factor_struct.rb +1 -3
  24. data/lib/workos/verify_factor.rb +1 -0
  25. data/lib/workos/version.rb +1 -1
  26. data/lib/workos/webhook.rb +1 -0
  27. data/lib/workos.rb +2 -0
  28. data/spec/lib/workos/directory_sync_spec.rb +29 -18
  29. data/spec/lib/workos/directory_user_spec.rb +36 -0
  30. data/spec/lib/workos/mfa_spec.rb +31 -1
  31. data/spec/support/fixtures/vcr_cassettes/directory_sync/get_group.yml +47 -29
  32. data/spec/support/fixtures/vcr_cassettes/directory_sync/get_user.yml +28 -31
  33. data/spec/support/fixtures/vcr_cassettes/directory_sync/list_groups/with_after.yml +46 -32
  34. data/spec/support/fixtures/vcr_cassettes/directory_sync/list_groups/with_before.yml +47 -31
  35. data/spec/support/fixtures/vcr_cassettes/directory_sync/list_groups/with_directory.yml +46 -34
  36. data/spec/support/fixtures/vcr_cassettes/directory_sync/list_groups/with_limit.yml +41 -31
  37. data/spec/support/fixtures/vcr_cassettes/directory_sync/list_groups/with_no_options.yml +36 -26
  38. data/spec/support/fixtures/vcr_cassettes/directory_sync/list_groups/with_user.yml +38 -28
  39. data/spec/support/fixtures/vcr_cassettes/mfa/challenge_factor_totp_valid.yml +1 -1
  40. data/spec/support/fixtures/vcr_cassettes/mfa/enroll_factor_generic_valid.yml +1 -1
  41. data/spec/support/fixtures/vcr_cassettes/mfa/enroll_factor_sms_valid.yml +1 -1
  42. data/spec/support/fixtures/vcr_cassettes/mfa/enroll_factor_totp_valid.yml +1 -1
  43. data/spec/support/fixtures/vcr_cassettes/mfa/get_factor_valid.yml +1 -1
  44. data/spec/support/fixtures/vcr_cassettes/mfa/verify_factor_generic_valid_is_false.yml +82 -0
  45. metadata +9 -3
@@ -189,7 +189,7 @@ describe WorkOS::DirectorySync do
189
189
  context 'with directory option' do
190
190
  it 'forms the proper request to the API' do
191
191
  request_args = [
192
- '/directory_groups?directory=directory_01EK2YEMVTWGX27STRDR0N3MP9',
192
+ '/directory_groups?directory=directory_01G2Z8ADK5NPMVTWF48MVVE4HT',
193
193
  'Content-Type' => 'application/json'
194
194
  ]
195
195
 
@@ -200,10 +200,11 @@ describe WorkOS::DirectorySync do
200
200
 
201
201
  VCR.use_cassette 'directory_sync/list_groups/with_directory' do
202
202
  groups = described_class.list_groups(
203
- directory: 'directory_01EK2YEMVTWGX27STRDR0N3MP9',
203
+ directory: 'directory_01G2Z8ADK5NPMVTWF48MVVE4HT',
204
204
  )
205
205
 
206
206
  expect(groups.data.size).to eq(10)
207
+ expect(groups.data[0].name).to eq(groups.data[0]['name'])
207
208
  end
208
209
  end
209
210
  end
@@ -211,7 +212,7 @@ describe WorkOS::DirectorySync do
211
212
  context 'with user option' do
212
213
  it 'forms the proper request to the API' do
213
214
  request_args = [
214
- '/directory_groups?user=directory_user_01EK2YFBC3R10MPB4W49G5QDXG',
215
+ '/directory_groups?user=directory_user_01G2Z8D4FDB28ZNSRRBVCF2E0P',
215
216
  'Content-Type' => 'application/json'
216
217
  ]
217
218
 
@@ -222,7 +223,7 @@ describe WorkOS::DirectorySync do
222
223
 
223
224
  VCR.use_cassette 'directory_sync/list_groups/with_user' do
224
225
  groups = described_class.list_groups(
225
- user: 'directory_user_01EK2YFBC3R10MPB4W49G5QDXG',
226
+ user: 'directory_user_01G2Z8D4FDB28ZNSRRBVCF2E0P',
226
227
  )
227
228
 
228
229
  expect(groups.data.size).to eq(3)
@@ -233,8 +234,8 @@ describe WorkOS::DirectorySync do
233
234
  context 'with the before option' do
234
235
  it 'forms the proper request to the API' do
235
236
  request_args = [
236
- '/directory_groups?before=before-id&' \
237
- 'directory=directory_01EK2YEMVTWGX27STRDR0N3MP9',
237
+ '/directory_groups?before=directory_group_01G2Z8D4ZR8RJ03Y1W7P9K8NMG&' \
238
+ 'directory=directory_01G2Z8ADK5NPMVTWF48MVVE4HT',
238
239
  'Content-Type' => 'application/json'
239
240
  ]
240
241
 
@@ -245,11 +246,11 @@ describe WorkOS::DirectorySync do
245
246
 
246
247
  VCR.use_cassette 'directory_sync/list_groups/with_before' do
247
248
  groups = described_class.list_groups(
248
- before: 'before-id',
249
- directory: 'directory_01EK2YEMVTWGX27STRDR0N3MP9',
249
+ before: 'directory_group_01G2Z8D4ZR8RJ03Y1W7P9K8NMG',
250
+ directory: 'directory_01G2Z8ADK5NPMVTWF48MVVE4HT',
250
251
  )
251
252
 
252
- expect(groups.data.size).to eq(2)
253
+ expect(groups.data.size).to eq(10)
253
254
  end
254
255
  end
255
256
  end
@@ -257,8 +258,8 @@ describe WorkOS::DirectorySync do
257
258
  context 'with the after option' do
258
259
  it 'forms the proper request to the API' do
259
260
  request_args = [
260
- '/directory_groups?after=after-id&' \
261
- 'directory=directory_01EK2YEMVTWGX27STRDR0N3MP9',
261
+ '/directory_groups?after=directory_group_01G2Z8D4ZR8RJ03Y1W7P9K8NMG&' \
262
+ 'directory=directory_01G2Z8ADK5NPMVTWF48MVVE4HT',
262
263
  'Content-Type' => 'application/json'
263
264
  ]
264
265
 
@@ -269,11 +270,11 @@ describe WorkOS::DirectorySync do
269
270
 
270
271
  VCR.use_cassette 'directory_sync/list_groups/with_after' do
271
272
  groups = described_class.list_groups(
272
- after: 'after-id',
273
- directory: 'directory_01EK2YEMVTWGX27STRDR0N3MP9',
273
+ after: 'directory_group_01G2Z8D4ZR8RJ03Y1W7P9K8NMG',
274
+ directory: 'directory_01G2Z8ADK5NPMVTWF48MVVE4HT',
274
275
  )
275
276
 
276
- expect(groups.data.size).to eq(10)
277
+ expect(groups.data.size).to eq(9)
277
278
  end
278
279
  end
279
280
  end
@@ -282,7 +283,7 @@ describe WorkOS::DirectorySync do
282
283
  it 'forms the proper request to the API' do
283
284
  request_args = [
284
285
  '/directory_groups?limit=2&' \
285
- 'directory=directory_01EK2YEMVTWGX27STRDR0N3MP9',
286
+ 'directory=directory_01G2Z8ADK5NPMVTWF48MVVE4HT',
286
287
  'Content-Type' => 'application/json'
287
288
  ]
288
289
 
@@ -294,7 +295,7 @@ describe WorkOS::DirectorySync do
294
295
  VCR.use_cassette 'directory_sync/list_groups/with_limit' do
295
296
  groups = described_class.list_groups(
296
297
  limit: 2,
297
- directory: 'directory_01EK2YEMVTWGX27STRDR0N3MP9',
298
+ directory: 'directory_01G2Z8ADK5NPMVTWF48MVVE4HT',
298
299
  )
299
300
 
300
301
  expect(groups.data.size).to eq(2)
@@ -332,6 +333,7 @@ describe WorkOS::DirectorySync do
332
333
  )
333
334
 
334
335
  expect(users.data.size).to eq(4)
336
+ expect(users.data[0].first_name).to eq(users.data[0]['first_name'])
335
337
  end
336
338
  end
337
339
  end
@@ -436,10 +438,16 @@ describe WorkOS::DirectorySync do
436
438
  it 'returns a group' do
437
439
  VCR.use_cassette('directory_sync/get_group') do
438
440
  group = WorkOS::DirectorySync.get_group(
439
- 'directory_grp_01E64QTDNS0EGJ0FMCVY9BWGZT',
441
+ 'directory_group_01G2Z8D4ZR8RJ03Y1W7P9K8NMG',
440
442
  )
441
443
 
442
- expect(group['name']).to eq('Walrus')
444
+ expect(group['directory_id']).to eq('directory_01G2Z8ADK5NPMVTWF48MVVE4HT')
445
+ expect(group['organization_id']).to eq('org_01EGS4P7QR31EZ4YWD1Z1XA176')
446
+ expect(group['idp_id']).to eq('01jlao4614two3d')
447
+ expect(group['name']).to eq('Sales')
448
+ expect(group.name).to eq('Sales')
449
+ expect(group['created_at']).to eq('2022-05-13T17:45:31.732Z')
450
+ expect(group['updated_at']).to eq('2022-07-13T17:45:42.618Z')
443
451
  end
444
452
  end
445
453
  end
@@ -464,6 +472,9 @@ describe WorkOS::DirectorySync do
464
472
  )
465
473
 
466
474
  expect(user['first_name']).to eq('Logan')
475
+ expect(user.directory_id).to eq('directory_01FAZYMST676QMTFN1DDJZZX87')
476
+ expect(user.organization_id).to eq('org_01FAZWCWR03DVWA83NCJYKKD54')
477
+ expect(user.first_name).to eq('Logan')
467
478
  end
468
479
  end
469
480
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+ # typed: false
3
+
4
+ describe WorkOS::DirectoryUser do
5
+ # rubocop:disable Layout/LineLength
6
+ describe '.get_primary_email' do
7
+ context 'with one primary email' do
8
+ it 'returns the primary email' do
9
+ user = WorkOS::DirectoryUser.new('{"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"}, {"primary":false,"value":"logan@gmail.com"}],"first_name":"Logan","last_name":"Gingerich","state":"active","raw_attributes":{},"custom_attributes":{},"groups":[]}')
10
+ expect(user.primary_email).to eq('logan@workos.com')
11
+ end
12
+ end
13
+
14
+ context 'with multiple primary emails' do
15
+ it 'returns the first email marked as primary' do
16
+ user = WorkOS::DirectoryUser.new('{"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"}, {"primary":true,"value":"logan@gmail.com"}],"first_name":"Logan","last_name":"Gingerich","state":"active","raw_attributes":{},"custom_attributes":{},"groups":[]}')
17
+ expect(user.primary_email).to eq('logan@workos.com')
18
+ end
19
+ end
20
+
21
+ context 'with no primary emails' do
22
+ it 'returns nil' do
23
+ user = WorkOS::DirectoryUser.new('{"object":"directory_user","id":"directory_user_01FAZYNPC8M0HRYTKFP2GNX852","directory_id":"directory_01FAZYMST676QMTFN1DDJZZX87","idp_id":"6092c280a3f1e19ef6d8cef8","username":"logan@workos.com","emails":[{"primary":false,"value":"logan@gmail.com"}],"first_name":"Logan","last_name":"Gingerich","state":"active","raw_attributes":{},"custom_attributes":{},"groups":[]}')
24
+ expect(user.primary_email).to eq(nil)
25
+ end
26
+ end
27
+
28
+ context 'with an empty email array' do
29
+ it 'returns nil' do
30
+ user = WorkOS::DirectoryUser.new('{"object":"directory_user","id":"directory_user_01FAZYNPC8M0HRYTKFP2GNX852","directory_id":"directory_01FAZYMST676QMTFN1DDJZZX87","idp_id":"6092c280a3f1e19ef6d8cef8","username":"logan@workos.com","emails":[],"first_name":"Logan","last_name":"Gingerich","state":"active","raw_attributes":{},"custom_attributes":{},"groups":[]}')
31
+ expect(user.primary_email).to eq(nil)
32
+ end
33
+ end
34
+ end
35
+ # rubocop:enable Layout/LineLength
36
+ end
@@ -3,6 +3,7 @@
3
3
 
4
4
  describe WorkOS::MFA do
5
5
  it_behaves_like 'client'
6
+
6
7
  describe 'enroll_factor valid requests' do
7
8
  context 'enroll factor using valid generic argument' do
8
9
  it 'returns a valid factor object' do
@@ -14,6 +15,7 @@ describe WorkOS::MFA do
14
15
  end
15
16
  end
16
17
  end
18
+
17
19
  context 'enroll factor using valid totp arguments' do
18
20
  it 'returns a valid factor object' do
19
21
  VCR.use_cassette 'mfa/enroll_factor_totp_valid' do
@@ -26,6 +28,7 @@ describe WorkOS::MFA do
26
28
  end
27
29
  end
28
30
  end
31
+
29
32
  context 'enroll factor using valid sms arguments' do
30
33
  it 'returns a valid factor object' do
31
34
  VCR.use_cassette 'mfa/enroll_factor_sms_valid' do
@@ -38,6 +41,7 @@ describe WorkOS::MFA do
38
41
  end
39
42
  end
40
43
  end
44
+
41
45
  describe 'enroll_factor invalid responses' do
42
46
  context 'enroll factor throws error if type is not sms or totp' do
43
47
  it 'returns an error' do
@@ -52,6 +56,7 @@ describe WorkOS::MFA do
52
56
  )
53
57
  end
54
58
  end
59
+
55
60
  context 'enroll factor throws error if type is not sms or totp' do
56
61
  it 'returns an error' do
57
62
  expect do
@@ -78,6 +83,7 @@ describe WorkOS::MFA do
78
83
  end
79
84
  end
80
85
  end
86
+
81
87
  describe 'challenge factor with valid request arguments' do
82
88
  context 'challenge with totp' do
83
89
  it 'returns challenge factor object for totp' do
@@ -89,6 +95,7 @@ describe WorkOS::MFA do
89
95
  end
90
96
  end
91
97
  end
98
+
92
99
  context 'challenge with sms' do
93
100
  it 'returns a challenge factor object for sms' do
94
101
  VCR.use_cassette 'mfa/challenge_factor_sms_valid' do
@@ -100,6 +107,7 @@ describe WorkOS::MFA do
100
107
  end
101
108
  end
102
109
  end
110
+
103
111
  context 'challenge with generic' do
104
112
  it 'returns a valid challenge factor object for generic otp' do
105
113
  VCR.use_cassette 'mfa/challenge_factor_generic_valid' do
@@ -111,6 +119,7 @@ describe WorkOS::MFA do
111
119
  end
112
120
  end
113
121
  end
122
+
114
123
  describe 'challenge factor with invalid arguments' do
115
124
  context 'challenge with totp mssing authentication_factor_id' do
116
125
  it 'returns argument error' do
@@ -123,6 +132,7 @@ describe WorkOS::MFA do
123
132
  end
124
133
  end
125
134
  end
135
+
126
136
  describe 'challenge factor with valid requests' do
127
137
  context 'verify generic otp' do
128
138
  it 'returns a true boolean if the challenge has not been verifed yet' do
@@ -135,6 +145,19 @@ describe WorkOS::MFA do
135
145
  end
136
146
  end
137
147
  end
148
+
149
+ context 'verify generic otp invalid response' do
150
+ it 'returns a true boolean if the challenge has not been verifed yet' do
151
+ VCR.use_cassette 'mfa/verify_factor_generic_valid_is_false' do
152
+ verify_factor = described_class.verify_factor(
153
+ authentication_challenge_id: 'auth_challenge_01FZ4YVRBMXP5ZM0A7BP4AJ12J',
154
+ code: '897792',
155
+ )
156
+ expect(verify_factor.valid == 'false')
157
+ end
158
+ end
159
+ end
160
+
138
161
  context 'verify generic otp' do
139
162
  it 'returns error that the challenge has already been verfied' do
140
163
  VCR.use_cassette 'mfa/verify_factor_generic_invalid' do
@@ -146,6 +169,7 @@ describe WorkOS::MFA do
146
169
  end.to raise_error(WorkOS::InvalidRequestError)
147
170
  end
148
171
  end
172
+
149
173
  context 'verify generic otp' do
150
174
  it 'returns error that the challenge has expired' do
151
175
  VCR.use_cassette 'mfa/verify_factor_generic_expired' do
@@ -160,6 +184,7 @@ describe WorkOS::MFA do
160
184
  end
161
185
  end
162
186
  end
187
+
163
188
  describe 'verify_factor with invalid argument' do
164
189
  context 'missing code argument' do
165
190
  it 'returns argument error' do
@@ -173,8 +198,9 @@ describe WorkOS::MFA do
173
198
  )
174
199
  end
175
200
  end
201
+
176
202
  context 'missing authentication_challenge_id argument' do
177
- it '' do
203
+ it 'returns and error' do
178
204
  expect do
179
205
  described_class.verify_factor(
180
206
  code: '897792',
@@ -185,6 +211,7 @@ describe WorkOS::MFA do
185
211
  )
186
212
  end
187
213
  end
214
+
188
215
  context 'missing code and authentication_challenge_id arguments' do
189
216
  it 'returns argument error' do
190
217
  expect do
@@ -196,6 +223,7 @@ describe WorkOS::MFA do
196
223
  end
197
224
  end
198
225
  end
226
+
199
227
  describe 'tests returning and deleting a factor' do
200
228
  context 'returns a factor' do
201
229
  it 'uses get_factor to return factor' do
@@ -207,6 +235,7 @@ describe WorkOS::MFA do
207
235
  end
208
236
  end
209
237
  end
238
+
210
239
  context 'invalid factor request' do
211
240
  it 'uses get_factor and throws error if id is wrong' do
212
241
  VCR.use_cassette 'mfa/get_factor_invalid' do
@@ -218,6 +247,7 @@ describe WorkOS::MFA do
218
247
  end
219
248
  end
220
249
  end
250
+
221
251
  context 'deletes facotr' do
222
252
  it 'uses delete_factor to delete factor' do
223
253
  VCR.use_cassette 'mfa/delete_factor' do
@@ -2,7 +2,7 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://api.workos.com/directory_groups/directory_grp_01E64QTDNS0EGJ0FMCVY9BWGZT
5
+ uri: https://api.workos.com/directory_groups/directory_group_01G2Z8D4ZR8RJ03Y1W7P9K8NMG
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
@@ -14,7 +14,7 @@ http_interactions:
14
14
  Accept:
15
15
  - "*/*"
16
16
  User-Agent:
17
- - WorkOS; ruby/2.7.1; x86_64-darwin19; v0.2.3
17
+ - WorkOS; ruby/2.7.2; arm64-darwin21; v2.3.0
18
18
  Authorization:
19
19
  - Bearer <API_KEY>
20
20
  response:
@@ -22,41 +22,59 @@ http_interactions:
22
22
  code: 200
23
23
  message: OK
24
24
  headers:
25
- Server:
26
- - Cowboy
25
+ Date:
26
+ - Thu, 14 Jul 2022 16:49:09 GMT
27
+ Content-Type:
28
+ - application/json; charset=utf-8
29
+ Transfer-Encoding:
30
+ - chunked
27
31
  Connection:
28
32
  - keep-alive
29
- Vary:
30
- - Origin, Accept-Encoding
31
33
  Access-Control-Allow-Credentials:
32
34
  - 'true'
33
- X-Dns-Prefetch-Control:
34
- - 'off'
35
- X-Frame-Options:
36
- - SAMEORIGIN
35
+ Content-Security-Policy:
36
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
37
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
38
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
39
+ Etag:
40
+ - W/"277-8j8DgAIILf/mCF7LCmvrqcqdwK4"
41
+ Expect-Ct:
42
+ - max-age=0
43
+ Referrer-Policy:
44
+ - no-referrer
37
45
  Strict-Transport-Security:
38
46
  - max-age=15552000; includeSubDomains
39
- X-Download-Options:
40
- - noopen
47
+ Vary:
48
+ - Origin, Accept-Encoding
49
+ Via:
50
+ - 1.1 spaces-router (b642bf20b975)
41
51
  X-Content-Type-Options:
42
52
  - nosniff
43
- X-Xss-Protection:
44
- - 1; mode=block
53
+ X-Dns-Prefetch-Control:
54
+ - 'off'
55
+ X-Download-Options:
56
+ - noopen
57
+ X-Frame-Options:
58
+ - SAMEORIGIN
59
+ X-Permitted-Cross-Domain-Policies:
60
+ - none
45
61
  X-Request-Id:
46
- - 4fb94ab3-ecff-4cea-b0b7-d4d1b3ffad3a
47
- Content-Type:
48
- - application/json; charset=utf-8
49
- Content-Length:
50
- - '65'
51
- Etag:
52
- - W/"41-QrnAKhorJuUwAsR1OyMpfB8q1Kc"
53
- Date:
54
- - Thu, 30 Apr 2020 04:47:49 GMT
55
- Via:
56
- - 1.1 vegur
62
+ - 0f21c2f3-e24a-e3a2-85d3-41ee9e45b3e2
63
+ X-Xss-Protection:
64
+ - '0'
65
+ Cf-Cache-Status:
66
+ - DYNAMIC
67
+ Report-To:
68
+ - '{"endpoints":[{"url":"https:\/\/a.nel.cloudflare.com\/report\/v3?s=Hnm%2BEiBTG2ROFxqX2mdwcp0HvQ173SgQlQDCmTmBQEbLv9w2dkcl2qMqYh44OSHRABBCkRfuJ2MtnHuqb6sQ5RjHRMKSCfRqklsOrgd%2FHo0PEE6mW0u%2BlZqBMIlN1BEp"}],"group":"cf-nel","max_age":604800}'
69
+ Nel:
70
+ - '{"success_fraction":0,"report_to":"cf-nel","max_age":604800}'
71
+ Server:
72
+ - cloudflare
73
+ Cf-Ray:
74
+ - 72abc002fbd9f039-EWR
57
75
  body:
58
- encoding: UTF-8
59
- string: '{"id":"directory_grp_01E64QTDNS0EGJ0FMCVY9BWGZT","name":"Walrus"}'
60
- http_version:
61
- recorded_at: Thu, 30 Apr 2020 04:47:49 GMT
76
+ encoding: ASCII-8BIT
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
62
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/3.0.1; x86_64-darwin19; v1.4.0
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
- - Mon, 09 Aug 2021 17:36:13 GMT
26
+ - Thu, 14 Jul 2022 16:46:23 GMT
27
27
  Content-Type:
28
28
  - application/json; charset=utf-8
29
- Transfer-Encoding:
30
- - chunked
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
- X-Dns-Prefetch-Control:
42
- - 'off'
39
+ Etag:
40
+ - W/"680-NPvBik348v8xg6EE7iZMYwD5UXw"
43
41
  Expect-Ct:
44
42
  - max-age=0
45
- X-Frame-Options:
46
- - SAMEORIGIN
43
+ Referrer-Policy:
44
+ - no-referrer
47
45
  Strict-Transport-Security:
48
46
  - max-age=15552000; includeSubDomains
49
- X-Download-Options:
50
- - noopen
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
- Referrer-Policy:
56
- - no-referrer
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=m6%2FJ3BJ75VMwSOtfDQXjt%2FoL29FI%2Bv5VswhZzg6LVkOQi7nyI19Sks%2FkDGCDrSQ%2FMtyU6DI4OFWR9RB1I04IGdhehsY2oPGugIj%2BhHMiJdQEcE6vPAsuaF1HyVnXGvMgRYdurEW1Jr7rSYBWeA%3D%3D"}],"group":"cf-nel","max_age":604800}'
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
- - 67c2bed0ebe6c7e6-DFW
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-07-19T19:17:52+0000","workEmail":"logan@workos.com","department":"Infra","departmentId":"5f27ada9a5e9bc0001a0ae4a"},"custom_attributes":{"department":"Infra"},"groups":[{"object":"directory_group","id":"directory_group_01FAZYNN1NZWMBRAXXDSTB5NFH","directory_id":"directory_01FAZYMST676QMTFN1DDJZZX87","name":"Department
82
- - Infra","raw_attributes":{"id":"5f27ada9a5e9bc0001a0ae4a","name":"Infra","parent":"5f27ada9a5e9bc0001a0ae48"}},{"object":"directory_group","id":"directory_group_01FAZYNNQ4HQ6EBF29MPTH7VKB","directory_id":"directory_01FAZYMST676QMTFN1DDJZZX87","name":"Team
83
- - Platform","raw_attributes":{"id":"5f696c8e9a63a60e965aaca8","name":"Platform","parent":null}}]}'
84
- http_version:
85
- recorded_at: Mon, 09 Aug 2021 17:36:13 GMT
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