workos 0.6.0 → 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f0fdd6aec096f0a3a3aa2f20c398515b1bf42d8e5b3d529e316bdce2327a0961
4
- data.tar.gz: 269a70ac10a9aa6f7b49f7cefbde2b1af8e5bf559b429d202b5d5167bb8b83f2
3
+ metadata.gz: aa4a3df1bd438866ffdd87bea0cc2b4c0155a1a72073f22265335845711e0b07
4
+ data.tar.gz: e0330ab1c70938e2092f76102aa62559574a20dce5e9b6d3443c1c80792c82b7
5
5
  SHA512:
6
- metadata.gz: dd67a590cefd06ae6fc83e45cd0cfe9243d8849e865e0b7f7eb342d0bb9a29b10cbb6693802d54bb25c045a2f90505f17217358c36ef196a2066ffab0ca6f2bc
7
- data.tar.gz: e528ade9f4a33fff0a25d24fcdb94f6232a3fc00c8ef27233735520a71a7b8c207c2fb853040c96ce34a5a8b91c842d4b9dc485699101bcc58159743f9471934
6
+ metadata.gz: c1e6953bd43faa02ba0f0a7e8e6fe192a05b68d6a5694f6a448a6da7d419a9adb409a7512b3a7a95caf8ba630cb56d9eb0a52cb5d32f7afc0205dcc4e7b80434
7
+ data.tar.gz: 3ff44f67cbe7f1fa8151d08579ee1e997d30d222b0c72d666a5d0cca21817a2201c97a1780aefe2965dcb20f42640cce71827e6092375eff87fbb114eed2cc0e
@@ -0,0 +1,5 @@
1
+ # See GitHub's docs for more details:
2
+ # https://help.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners
3
+
4
+ # Rubyist Team
5
+ * @workos-inc/ruby
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- workos (0.6.0)
4
+ workos (0.9.1)
5
5
  sorbet-runtime (~> 0.5)
6
6
 
7
7
  GEM
@@ -54,7 +54,7 @@ GEM
54
54
  simplecov-html (0.12.2)
55
55
  sorbet (0.5.5560)
56
56
  sorbet-static (= 0.5.5560)
57
- sorbet-runtime (0.5.5909)
57
+ sorbet-runtime (0.5.5943)
58
58
  sorbet-static (0.5.5560-universal-darwin-14)
59
59
  unicode-display_width (1.6.0)
60
60
  vcr (5.0.0)
data/README.md CHANGED
@@ -42,50 +42,9 @@ Alternatively, you may set the key yourself, such as in an initializer in your a
42
42
  WorkOS.key = '[your api key]'
43
43
  ```
44
44
 
45
- ## The Audit Trail Module
46
-
47
- The Audit Trail Module provides methods for creating Audit Trail events on
48
- WorkOS.
49
-
50
- See our [Audit Trail
51
- Overview](https://docs.workos.com/audit-trail/overview) for
52
- more information.
53
-
54
- ```ruby
55
- payload = {
56
- group: 'Foo Corp',
57
- location: '127.0.0.1',
58
- action: 'user.created',
59
- action_type: 'C',
60
- actor_name: 'Foo',
61
- actor_id: 'user_12345',
62
- target_name: 'Bar',
63
- target_id: 'user_67890',
64
- occurred_at: '2020-01-10T15:30:00-05:00',
65
- metadata: {
66
- source: 'Email',
67
- }
68
- }
69
-
70
- WorkOS::AuditTrail.create_event(event: payload)
71
- ```
72
-
73
- ### Idempotency
74
-
75
- To perform an idempotent request, provide an additional idempotency_key
76
- parameter to the `create_event` options.
77
-
78
- ```ruby
79
- WorkOS::AuditTrail.create_event(event: payload, idempotency_key: 'key123456')
80
- ```
81
-
82
- See our [API
83
- Reference](https://docs.workos.com/audit-trail/api-reference#idempotency)
84
- for more information on idempotency keys.
85
-
86
45
  ## The SSO Module
87
46
 
88
- The SSO Module provides convenience methods for authenticating a Single Sign On (SSO) user via WorkOS. WorkOS SSO follows the Oauth 2.0 specification.
47
+ The SSO Module provides convenient methods for authenticating a Single Sign On (SSO) user via WorkOS. WorkOS SSO follows the OAuth 2.0 specification.
89
48
 
90
49
  First, you'll direct your SSO users to an `authorization_url`. They will sign in to their SSO account with their Identity Provider, and be redirected to a
91
50
  callback URL that you set in your WorkOS Dashboard. The user will be redirected with a `code` URL parameter, which you can then exchange for a WorkOS::Profile
@@ -137,7 +96,7 @@ the user to your callback URL with a `code` parameter. You'll use `WorkOS::SSO.p
137
96
  code for a `WorkOS::Profile`.
138
97
 
139
98
  ```ruby
140
- WorkOS::SSO.profile(code:, project_id:)</h4>
99
+ WorkOS::SSO.profile(code:, project_id:)
141
100
  ```
142
101
 
143
102
  > Fetch a WorkOS::Profile for an authorized user.
@@ -154,6 +113,7 @@ This method will return an instance of a `WorkOS::Profile` with the following at
154
113
  @id="prof_01DRA1XNSJDZ19A31F183ECQW5",
155
114
  @email="demo@workos-okta.com",
156
115
  @first_name="WorkOS",
116
+ @connection_id="conn_01EMH8WAK20T42N2NBMNBCYHAG",
157
117
  @connection_type="OktaSAML",
158
118
  @last_name="Demo",
159
119
  @idp_id="00u1klkowm8EGah2H357",
@@ -167,7 +127,7 @@ This method will return an instance of a `WorkOS::Profile` with the following at
167
127
  >
168
128
  ```
169
129
 
170
- Our Sintatra app can be extended to use this method:
130
+ Our Sinatra app can be extended to use this method:
171
131
 
172
132
  ```ruby
173
133
  DOMAIN = 'example.com'
@@ -197,3 +157,107 @@ end
197
157
  ```
198
158
 
199
159
  Given the `WorkOS::Profile`, you can now sign the user in according to your own authentication setup.
160
+
161
+ ## The Magic Link Module
162
+
163
+ The Magic Link Module provides methods for authenticating a Passwordless user via WorkOS.
164
+
165
+ First, you'll create a Passwordless Session for a Magic Link connection.
166
+ Then, using the session ID, you'll email a user the Magic Link confirmation URL.
167
+ The user can then click on that link to be authenticated to your application.
168
+
169
+ > Create a Passwordless Session for a Magic Link Connection.
170
+
171
+ `WorkOS::Passwordless.create_session` accepts four arguments:
172
+
173
+ - `email` (string) - the email of the user to authenticate.
174
+ - `type` (string) - The type of Passwordless Session to create. Currently, the only supported value is `MagicLink`.
175
+ - `state` (optional, string) - Optional parameter that a Developer can choose to include in their authorization URL. If included, then the redirect URI received from WorkOS will contain the exact `state` that was passed in the authorization URL.
176
+ - `redirect_uri` (string) - a callback URL where your application redirects the user-agent after an authorization code is granted (ex. `workos.dev/callback`). This must match one of your configured callback URLs for the associated project on your WorkOS dashboard.
177
+
178
+ This method will return a Passwordless Session object, containing the following attributes:
179
+
180
+ - `id` (string) - the unique ID of the session.
181
+ - `email` (string) - the email address of the user for the session.
182
+ - `expires_at` (date) - the ISO-8601 datetime at which the session expires.
183
+ - `link` (string) - the link for the user to authenticate with. You can use this link to send a custom email to the user, or send an email using the `WorkOS::Passwordless.send_session` method, described below.
184
+
185
+ > Email a user the Magic Link confirmation URL.
186
+
187
+ `WorkOS::Passwordless.send_session` accepts one argument:
188
+
189
+ - `id` (string) - the unique identifier of the Passwordless Session to send an email for.
190
+
191
+ This method will return a boolean confirming the Magic Link was sent.
192
+
193
+ > Example with Sinatra application
194
+
195
+ Our Sinatra app can be altered to use Magic Link:
196
+
197
+ ```ruby
198
+ PROJECT_ID = '{projectId}'
199
+ REDIRECT_URI = 'http://localhost:4567/callback'
200
+
201
+ post '/passwordless-auth' do
202
+ session = WorkOS::Passwordless.create_session(
203
+ email: params[:email],
204
+ type: 'MagicLink',
205
+ redirect_uri: REDIRECT_URI
206
+ )
207
+ WorkOS::Passwordless.send_session(session.id)
208
+
209
+ redirect '/check-email'
210
+ end
211
+
212
+ get '/callback' do
213
+ profile = WorkOS::SSO.profile(
214
+ code: params['code'],
215
+ project_id: PROJECT_ID,
216
+ )
217
+
218
+ session[:user] = profile.to_json
219
+
220
+ redirect '/'
221
+ end
222
+ ```
223
+
224
+ ## The Audit Trail Module
225
+
226
+ The Audit Trail Module provides methods for creating Audit Trail events on
227
+ WorkOS.
228
+
229
+ See our [Audit Trail
230
+ Overview](https://docs.workos.com/audit-trail/overview) for
231
+ more information.
232
+
233
+ ```ruby
234
+ payload = {
235
+ group: 'Foo Corp',
236
+ location: '127.0.0.1',
237
+ action: 'user.created',
238
+ action_type: 'C',
239
+ actor_name: 'Foo',
240
+ actor_id: 'user_12345',
241
+ target_name: 'Bar',
242
+ target_id: 'user_67890',
243
+ occurred_at: '2020-01-10T15:30:00-05:00',
244
+ metadata: {
245
+ source: 'Email',
246
+ }
247
+ }
248
+
249
+ WorkOS::AuditTrail.create_event(event: payload)
250
+ ```
251
+
252
+ ### Idempotency
253
+
254
+ To perform an idempotent request, provide an additional idempotency_key
255
+ parameter to the `create_event` options.
256
+
257
+ ```ruby
258
+ WorkOS::AuditTrail.create_event(event: payload, idempotency_key: 'key123456')
259
+ ```
260
+
261
+ See our [API
262
+ Reference](https://docs.workos.com/audit-trail/api-reference#idempotency)
263
+ for more information on idempotency keys.
@@ -32,6 +32,7 @@ module WorkOS
32
32
  autoload :Connection, 'workos/connection'
33
33
  autoload :DirectorySync, 'workos/directory_sync'
34
34
  autoload :Organization, 'workos/organization'
35
+ autoload :Passwordless, 'workos/passwordless'
35
36
  autoload :Portal, 'workos/portal'
36
37
  autoload :Profile, 'workos/profile'
37
38
  autoload :SSO, 'workos/sso'
@@ -83,8 +83,8 @@ module WorkOS
83
83
  # event occurred at or after
84
84
  # @option options [String] occurred_at_lt ISO-8601 datetime of when an
85
85
  # event occurred before
86
- # @option options [String] ISO-8601 datetime of when an event occured at
87
- # or before
86
+ # @option options [String] occurred_at_lte ISO-8601 datetime of when an
87
+ # event occured at or before
88
88
  # @option options [String] search Keyword search
89
89
  #
90
90
  # @return [Array<Hash>]
@@ -81,8 +81,7 @@ module WorkOS
81
81
  ].join('; ')
82
82
  end
83
83
 
84
-
85
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
84
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
86
85
  sig { params(response: ::T.untyped).void }
87
86
  def handle_error_response(response:)
88
87
  http_status = response.code.to_i
@@ -108,11 +107,10 @@ module WorkOS
108
107
  request_id: response['x-request-id'],
109
108
  )
110
109
  when 422
111
- errors = json['errors'].map do |error|
112
- "#{error['field']}: #{error['code']}"
113
- end.join('; ')
110
+ message = json['message']
111
+ errors = extract_error(json['errors']) if json['errors']
112
+ message += " (#{errors})" if errors
114
113
 
115
- message = "#{json['message']} (#{errors})"
116
114
  raise InvalidRequestError.new(
117
115
  message: message,
118
116
  http_status: http_status,
@@ -120,6 +118,14 @@ module WorkOS
120
118
  )
121
119
  end
122
120
  end
123
- # rubocop:enable Metrics/MethodLength, Metrics/AbcSize
121
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/CyclomaticComplexity
122
+
123
+ private
124
+
125
+ def extract_error(errors)
126
+ errors.map do |error|
127
+ "#{error['field']}: #{error['code']}"
128
+ end.join('; ')
129
+ end
124
130
  end
125
131
  end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+ # typed: true
3
+
4
+ require 'net/http'
5
+
6
+ module WorkOS
7
+ # The Passwordless module provides convenience methods for working with
8
+ # passwordless sessions including the WorkOS Magic Link. You'll need a valid
9
+ # API key.
10
+ #
11
+ # @see https://workos.com/docs/sso/configuring-magic-link
12
+ module Passwordless
13
+ class << self
14
+ extend T::Sig
15
+ include Base
16
+ include Client
17
+
18
+ # Create a Passwordless Session.
19
+ #
20
+ # @param [Hash] options A hash with options for the session
21
+ # @option options [String] email The email of the user to authenticate.
22
+ # @option options [String] state Optional parameter that the redirect URI
23
+ # received from WorkOS will contain. The state parameter can be used to
24
+ # encode arbitrary information to help restore application state between
25
+ # redirects.
26
+ # @option options [String] type The type of Passwordless Session to
27
+ # create. Currently, the only supported value is 'MagicLink'.
28
+ # @option options [String] redirect_uri The URI where users are directed
29
+ # after completing the authentication step. Must match a
30
+ # configured redirect URI on your WorkOS dashboard.
31
+ #
32
+ # @return Hash
33
+ sig do
34
+ params(
35
+ options: Hash,
36
+ ).returns(WorkOS::Types::PasswordlessSessionStruct)
37
+ end
38
+
39
+ # rubocop:disable Metrics/MethodLength
40
+ def create_session(options)
41
+ response = execute_request(
42
+ request: post_request(
43
+ path: '/passwordless/sessions',
44
+ auth: true,
45
+ body: options,
46
+ ),
47
+ )
48
+
49
+ hash = JSON.parse(response.body)
50
+
51
+ WorkOS::Types::PasswordlessSessionStruct.new(
52
+ id: hash['id'],
53
+ email: hash['email'],
54
+ expires_at: Date.parse(hash['expires_at']),
55
+ link: hash['link'],
56
+ )
57
+ end
58
+ # rubocop:enable Metrics/MethodLength
59
+
60
+ # Send a Passwordless Session via email.
61
+ #
62
+ # @param [String] session_id The unique identifier of the Passwordless
63
+ # Session to send an email for.
64
+ #
65
+ # @return Hash
66
+ sig do
67
+ params(
68
+ session_id: String,
69
+ ).returns(T::Hash[String, T::Boolean])
70
+ end
71
+
72
+ def send_session(session_id)
73
+ response = execute_request(
74
+ request: post_request(
75
+ path: "/passwordless/sessions/#{session_id}/send",
76
+ auth: true,
77
+ ),
78
+ )
79
+
80
+ JSON.parse(response.body)
81
+ end
82
+ end
83
+ end
84
+ end
@@ -103,8 +103,12 @@ module WorkOS
103
103
 
104
104
  parsed_response = JSON.parse(response.body)
105
105
 
106
+ organizations = parsed_response['data'].map do |organization|
107
+ ::WorkOS::Organization.new(organization.to_json)
108
+ end
109
+
106
110
  WorkOS::Types::ListStruct.new(
107
- data: parsed_response['data'],
111
+ data: organizations,
108
112
  list_metadata: parsed_response['listMetadata'],
109
113
  )
110
114
  end
@@ -13,9 +13,9 @@ module WorkOS
13
13
  extend T::Sig
14
14
 
15
15
  sig { returns(String) }
16
- attr_accessor :id, :email, :first_name, :last_name,
16
+ attr_accessor :id, :email, :first_name, :last_name, :connection_id,
17
17
  :connection_type, :idp_id, :raw_attributes
18
-
18
+ # rubocop:disable Metrics/AbcSize
19
19
  sig { params(profile_json: String).void }
20
20
  def initialize(profile_json)
21
21
  raw = parse_json(profile_json)
@@ -24,10 +24,12 @@ module WorkOS
24
24
  @email = T.let(raw.email, String)
25
25
  @first_name = raw.first_name
26
26
  @last_name = raw.last_name
27
+ @connection_id = T.let(raw.connection_id, String)
27
28
  @connection_type = T.let(raw.connection_type, String)
28
29
  @idp_id = raw.idp_id
29
30
  @raw_attributes = raw.raw_attributes
30
31
  end
32
+ # rubocop:enable Metrics/AbcSize
31
33
 
32
34
  sig { returns(String) }
33
35
  def full_name
@@ -40,6 +42,7 @@ module WorkOS
40
42
  email: email,
41
43
  first_name: first_name,
42
44
  last_name: last_name,
45
+ connection_id: connection_id,
43
46
  connection_type: connection_type,
44
47
  idp_id: idp_id,
45
48
  raw_attributes: raw_attributes,
@@ -48,7 +51,7 @@ module WorkOS
48
51
 
49
52
  private
50
53
 
51
- # rubocop:disable Metrics/AbcSize
54
+ # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
52
55
  sig { params(json_string: String).returns(WorkOS::Types::ProfileStruct) }
53
56
  def parse_json(json_string)
54
57
  hash = JSON.parse(json_string, symbolize_names: true)
@@ -58,11 +61,12 @@ module WorkOS
58
61
  email: hash[:profile][:email],
59
62
  first_name: hash[:profile][:first_name],
60
63
  last_name: hash[:profile][:last_name],
64
+ connection_id: hash[:profile][:connection_id],
61
65
  connection_type: hash[:profile][:connection_type],
62
66
  idp_id: hash[:profile][:idp_id],
63
67
  raw_attributes: hash[:profile][:raw_attributes],
64
68
  )
65
69
  end
66
- # rubocop:enable Metrics/AbcSize
70
+ # rubocop:enable Metrics/AbcSize, Metrics/MethodLength
67
71
  end
68
72
  end
@@ -9,6 +9,7 @@ module WorkOS
9
9
  require_relative 'types/intent_enum'
10
10
  require_relative 'types/list_struct'
11
11
  require_relative 'types/organization_struct'
12
+ require_relative 'types/passwordless_session_struct'
12
13
  require_relative 'types/profile_struct'
13
14
  require_relative 'types/provider_enum'
14
15
  end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+ # typed: strict
3
+
4
+ module WorkOS
5
+ module Types
6
+ # This PasswordlessSessionStruct acts as a typed interface
7
+ # for the Passwordless class
8
+ class PasswordlessSessionStruct < T::Struct
9
+ const :id, String
10
+ const :email, String
11
+ const :expires_at, Date
12
+ const :link, String
13
+ end
14
+ end
15
+ end
@@ -10,6 +10,7 @@ module WorkOS
10
10
  const :email, String
11
11
  const :first_name, T.nilable(String)
12
12
  const :last_name, T.nilable(String)
13
+ const :connection_id, String
13
14
  const :connection_type, String
14
15
  const :idp_id, T.nilable(String)
15
16
  const :raw_attributes, T::Hash[Symbol, Object]
@@ -2,5 +2,5 @@
2
2
  # typed: strong
3
3
 
4
4
  module WorkOS
5
- VERSION = '0.6.0'
5
+ VERSION = '0.9.1'
6
6
  end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+ # typed: false
3
+
4
+ describe WorkOS::Passwordless do
5
+ before(:all) do
6
+ WorkOS.key = 'key'
7
+ end
8
+
9
+ after(:all) do
10
+ WorkOS.key = nil
11
+ end
12
+
13
+ describe '.create_session' do
14
+ context 'with valid options payload' do
15
+ let(:valid_options) do
16
+ {
17
+ email: 'demo@workos-okta.com',
18
+ type: 'MagicLink',
19
+ redirect_uri: 'foo.com/auth/callback',
20
+ }
21
+ end
22
+
23
+ it 'creates a session' do
24
+ VCR.use_cassette('passwordless/create_session') do
25
+ response = described_class.create_session(valid_options)
26
+
27
+ expect(response.email).to eq 'demo@workos-okta.com'
28
+ end
29
+ end
30
+ end
31
+
32
+ context 'with invalid event payload' do
33
+ let(:invalid_options) do
34
+ {}
35
+ end
36
+
37
+ it 'raises an error' do
38
+ VCR.use_cassette('passwordless/create_session_invalid') do
39
+ expect do
40
+ described_class.create_session(invalid_options)
41
+ end.to raise_error(
42
+ WorkOS::InvalidRequestError,
43
+ /Status 422, Validation failed \(email: email must be a string; type: type must be a valid enum value\)/,
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ describe '.send_session' do
51
+ context 'with valid session id' do
52
+ let(:valid_options) do
53
+ {
54
+ email: 'demo@workos-okta.com',
55
+ type: 'MagicLink',
56
+ }
57
+ end
58
+
59
+ it 'send a session' do
60
+ VCR.use_cassette('passwordless/send_session') do
61
+ response = described_class.send_session(
62
+ 'passwordless_session_01EJC0F4KH42T11Y2DHPEB09BM',
63
+ )
64
+
65
+ expect(response['success']).to eq true
66
+ end
67
+ end
68
+ end
69
+
70
+ context 'with invalid session id' do
71
+ it 'raises an error' do
72
+ VCR.use_cassette('passwordless/send_session_invalid') do
73
+ expect do
74
+ described_class.send_session('session_123')
75
+ end.to raise_error(
76
+ WorkOS::InvalidRequestError,
77
+ /Status 422, The passwordless session 'session_123' has expired or is invalid./,
78
+ )
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
@@ -163,6 +163,7 @@ describe WorkOS::SSO do
163
163
  expect(profile).to be_a(WorkOS::Profile)
164
164
 
165
165
  expectation = {
166
+ connection_id: 'conn_01EMH8WAK20T42N2NBMNBCYHAG',
166
167
  connection_type: 'OktaSAML',
167
168
  email: 'demo@workos-okta.com',
168
169
  first_name: 'WorkOS',
@@ -0,0 +1,72 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.workos.com/passwordless/sessions
6
+ body:
7
+ encoding: UTF-8
8
+ string: '{"email":"demo@workos-okta.com","type":"MagicLink"}'
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/2.7.1; x86_64-darwin19; v0.7.0
18
+ Authorization:
19
+ - Bearer <API_KEY>
20
+ response:
21
+ status:
22
+ code: 201
23
+ message: Created
24
+ headers:
25
+ Server:
26
+ - Cowboy
27
+ Connection:
28
+ - keep-alive
29
+ Vary:
30
+ - Origin, Accept-Encoding
31
+ Access-Control-Allow-Credentials:
32
+ - 'true'
33
+ Content-Security-Policy:
34
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
35
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
36
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
37
+ X-Dns-Prefetch-Control:
38
+ - 'off'
39
+ Expect-Ct:
40
+ - max-age=0
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ Strict-Transport-Security:
44
+ - max-age=15552000; includeSubDomains
45
+ X-Download-Options:
46
+ - noopen
47
+ X-Content-Type-Options:
48
+ - nosniff
49
+ X-Permitted-Cross-Domain-Policies:
50
+ - none
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Xss-Protection:
54
+ - '0'
55
+ X-Request-Id:
56
+ - 611c2a85-84e1-4bad-a2ec-43cf8371f134
57
+ Content-Type:
58
+ - application/json; charset=utf-8
59
+ Content-Length:
60
+ - '238'
61
+ Etag:
62
+ - W/"ee-6KkIusxSXraxKqTLP+31C0PeHDU"
63
+ Date:
64
+ - Wed, 16 Sep 2020 15:39:08 GMT
65
+ Via:
66
+ - 1.1 vegur
67
+ body:
68
+ encoding: UTF-8
69
+ string: '{"object":"passwordless_session","id":"passwordless_session_01EJBS3JSXFE2DP6JC6ZVBZ095","email":"demo@workos-okta.com","expires_at":"2020-09-16T15:44:08.475Z","link":"https://api.workos.com/passwordless/ZBxkn2ZTUYqa82ky6QEYecemI/confirm"}'
70
+ http_version:
71
+ recorded_at: Wed, 16 Sep 2020 15:39:08 GMT
72
+ recorded_with: VCR 5.0.0
@@ -0,0 +1,73 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.workos.com/passwordless/sessions
6
+ body:
7
+ encoding: UTF-8
8
+ string: "{}"
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/2.7.1; x86_64-darwin19; v0.7.0
18
+ Authorization:
19
+ - Bearer sk_4q5ka3d9bx0XJiZhkKmUIOG87
20
+ response:
21
+ status:
22
+ code: 422
23
+ message: Unprocessable Entity
24
+ headers:
25
+ Server:
26
+ - Cowboy
27
+ Connection:
28
+ - keep-alive
29
+ Vary:
30
+ - Origin, Accept-Encoding
31
+ Access-Control-Allow-Credentials:
32
+ - 'true'
33
+ Content-Security-Policy:
34
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
35
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
36
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
37
+ X-Dns-Prefetch-Control:
38
+ - 'off'
39
+ Expect-Ct:
40
+ - max-age=0
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ Strict-Transport-Security:
44
+ - max-age=15552000; includeSubDomains
45
+ X-Download-Options:
46
+ - noopen
47
+ X-Content-Type-Options:
48
+ - nosniff
49
+ X-Permitted-Cross-Domain-Policies:
50
+ - none
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Xss-Protection:
54
+ - '0'
55
+ X-Request-Id:
56
+ - e3ca7215-2b2d-45cf-a04f-90279225f27e
57
+ Content-Type:
58
+ - application/json; charset=utf-8
59
+ Content-Length:
60
+ - '150'
61
+ Etag:
62
+ - W/"96-O5ltHaJ3rEQ8+dqFwhN+Lhmgdb0"
63
+ Date:
64
+ - Wed, 16 Sep 2020 17:34:07 GMT
65
+ Via:
66
+ - 1.1 vegur
67
+ body:
68
+ encoding: UTF-8
69
+ string: '{"message":"Validation failed","errors":[{"field":"email","code":"email
70
+ must be a string"},{"field":"type","code":"type must be a valid enum value"}]}'
71
+ http_version:
72
+ recorded_at: Wed, 16 Sep 2020 17:34:07 GMT
73
+ recorded_with: VCR 5.0.0
@@ -0,0 +1,72 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.workos.com/passwordless/sessions/passwordless_session_01EJC0F4KH42T11Y2DHPEB09BM/send
6
+ body:
7
+ encoding: UTF-8
8
+ string: ''
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/2.7.1; x86_64-darwin19; v0.7.0
18
+ Authorization:
19
+ - Bearer sk_4q5ka3d9bx0XJiZhkKmUIOG87
20
+ response:
21
+ status:
22
+ code: 201
23
+ message: Created
24
+ headers:
25
+ Server:
26
+ - Cowboy
27
+ Connection:
28
+ - keep-alive
29
+ Vary:
30
+ - Origin, Accept-Encoding
31
+ Access-Control-Allow-Credentials:
32
+ - 'true'
33
+ Content-Security-Policy:
34
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
35
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
36
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
37
+ X-Dns-Prefetch-Control:
38
+ - 'off'
39
+ Expect-Ct:
40
+ - max-age=0
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ Strict-Transport-Security:
44
+ - max-age=15552000; includeSubDomains
45
+ X-Download-Options:
46
+ - noopen
47
+ X-Content-Type-Options:
48
+ - nosniff
49
+ X-Permitted-Cross-Domain-Policies:
50
+ - none
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Xss-Protection:
54
+ - '0'
55
+ X-Request-Id:
56
+ - d7d72520-9223-4145-b34e-df5e80a776d6
57
+ Content-Type:
58
+ - application/json; charset=utf-8
59
+ Content-Length:
60
+ - '16'
61
+ Etag:
62
+ - W/"10-oV4hJxRVSENxc/wX8+mA4/Pe4tA"
63
+ Date:
64
+ - Wed, 16 Sep 2020 17:47:47 GMT
65
+ Via:
66
+ - 1.1 vegur
67
+ body:
68
+ encoding: UTF-8
69
+ string: '{"success":true}'
70
+ http_version:
71
+ recorded_at: Wed, 16 Sep 2020 17:47:47 GMT
72
+ recorded_with: VCR 5.0.0
@@ -0,0 +1,73 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: post
5
+ uri: https://api.workos.com/passwordless/sessions/session_123/send
6
+ body:
7
+ encoding: UTF-8
8
+ string: ''
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/2.7.1; x86_64-darwin19; v0.7.0
18
+ Authorization:
19
+ - Bearer sk_4q5ka3d9bx0XJiZhkKmUIOG87
20
+ response:
21
+ status:
22
+ code: 422
23
+ message: Unprocessable Entity
24
+ headers:
25
+ Server:
26
+ - Cowboy
27
+ Connection:
28
+ - keep-alive
29
+ Vary:
30
+ - Origin, Accept-Encoding
31
+ Access-Control-Allow-Credentials:
32
+ - 'true'
33
+ Content-Security-Policy:
34
+ - 'default-src ''self'';base-uri ''self'';block-all-mixed-content;font-src ''self''
35
+ https: data:;frame-ancestors ''self'';img-src ''self'' data:;object-src ''none'';script-src
36
+ ''self'';script-src-attr ''none'';style-src ''self'' https: ''unsafe-inline'';upgrade-insecure-requests'
37
+ X-Dns-Prefetch-Control:
38
+ - 'off'
39
+ Expect-Ct:
40
+ - max-age=0
41
+ X-Frame-Options:
42
+ - SAMEORIGIN
43
+ Strict-Transport-Security:
44
+ - max-age=15552000; includeSubDomains
45
+ X-Download-Options:
46
+ - noopen
47
+ X-Content-Type-Options:
48
+ - nosniff
49
+ X-Permitted-Cross-Domain-Policies:
50
+ - none
51
+ Referrer-Policy:
52
+ - no-referrer
53
+ X-Xss-Protection:
54
+ - '0'
55
+ X-Request-Id:
56
+ - 6c22578f-9d49-4118-a7bd-18014d447aad
57
+ Content-Type:
58
+ - application/json; charset=utf-8
59
+ Content-Length:
60
+ - '79'
61
+ Etag:
62
+ - W/"4f-NjqaLicbRDM9SfS5gYKHlSgozt0"
63
+ Date:
64
+ - Wed, 16 Sep 2020 17:52:24 GMT
65
+ Via:
66
+ - 1.1 vegur
67
+ body:
68
+ encoding: UTF-8
69
+ string: '{"message":"The passwordless session ''session_123'' has expired or
70
+ is invalid."}'
71
+ http_version:
72
+ recorded_at: Wed, 16 Sep 2020 17:52:24 GMT
73
+ recorded_with: VCR 5.0.0
@@ -1 +1 @@
1
- {"profile":{"object":"profile","id":"prof_01DRA1XNSJDZ19A31F183ECQW5","email":"demo@workos-okta.com","first_name":"WorkOS","connection_type":"OktaSAML","last_name":"Demo","idp_id":"00u1klkowm8EGah2H357","raw_attributes":{"id":"prof_01DRA1XNSJDZ19A31F183ECQW5","email":"demo@workos-okta.com","first_name":"WorkOS","last_name":"Demo","idp_id":"00u1klkowm8EGah2H357"}},"access_token":"01DVX6QBS3EG6FHY2ESAA5Q65X"}
1
+ {"profile":{"object":"profile","id":"prof_01DRA1XNSJDZ19A31F183ECQW5","email":"demo@workos-okta.com","first_name":"WorkOS","connection_id":"conn_01EMH8WAK20T42N2NBMNBCYHAG","connection_type":"OktaSAML","last_name":"Demo","idp_id":"00u1klkowm8EGah2H357","raw_attributes":{"id":"prof_01DRA1XNSJDZ19A31F183ECQW5","email":"demo@workos-okta.com","first_name":"WorkOS","last_name":"Demo","idp_id":"00u1klkowm8EGah2H357"}},"access_token":"01DVX6QBS3EG6FHY2ESAA5Q65X"}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: workos
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.0
4
+ version: 0.9.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - WorkOS
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-09-14 00:00:00.000000000 Z
11
+ date: 2020-12-07 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sorbet-runtime
@@ -161,6 +161,7 @@ executables:
161
161
  extensions: []
162
162
  extra_rdoc_files: []
163
163
  files:
164
+ - ".github/CODEOWNERS"
164
165
  - ".github/renovate.json"
165
166
  - ".gitignore"
166
167
  - ".rspec"
@@ -168,7 +169,6 @@ files:
168
169
  - ".ruby-version"
169
170
  - ".semaphore/rubygems.yml"
170
171
  - ".semaphore/semaphore.yml"
171
- - CODEOWNERS
172
172
  - Gemfile
173
173
  - Gemfile.lock
174
174
  - LICENSE
@@ -214,6 +214,7 @@ files:
214
214
  - lib/workos/directory_sync.rb
215
215
  - lib/workos/errors.rb
216
216
  - lib/workos/organization.rb
217
+ - lib/workos/passwordless.rb
217
218
  - lib/workos/portal.rb
218
219
  - lib/workos/profile.rb
219
220
  - lib/workos/sso.rb
@@ -222,6 +223,7 @@ files:
222
223
  - lib/workos/types/intent_enum.rb
223
224
  - lib/workos/types/list_struct.rb
224
225
  - lib/workos/types/organization_struct.rb
226
+ - lib/workos/types/passwordless_session_struct.rb
225
227
  - lib/workos/types/profile_struct.rb
226
228
  - lib/workos/types/provider_enum.rb
227
229
  - lib/workos/version.rb
@@ -237,6 +239,7 @@ files:
237
239
  - spec/lib/workos/audit_trail_spec.rb
238
240
  - spec/lib/workos/base_spec.rb
239
241
  - spec/lib/workos/directory_sync_spec.rb
242
+ - spec/lib/workos/passwordless_spec.rb
240
243
  - spec/lib/workos/portal_spec.rb
241
244
  - spec/lib/workos/sso_spec.rb
242
245
  - spec/spec_helper.rb
@@ -260,6 +263,10 @@ files:
260
263
  - spec/support/fixtures/vcr_cassettes/organization/create.yml
261
264
  - spec/support/fixtures/vcr_cassettes/organization/create_invalid.yml
262
265
  - spec/support/fixtures/vcr_cassettes/organization/list.yml
266
+ - spec/support/fixtures/vcr_cassettes/passwordless/create_session.yml
267
+ - spec/support/fixtures/vcr_cassettes/passwordless/create_session_invalid.yml
268
+ - spec/support/fixtures/vcr_cassettes/passwordless/send_session.yml
269
+ - spec/support/fixtures/vcr_cassettes/passwordless/send_session_invalid.yml
263
270
  - spec/support/fixtures/vcr_cassettes/portal/generate_link.yml
264
271
  - spec/support/fixtures/vcr_cassettes/portal/generate_link_invalid.yml
265
272
  - spec/support/fixtures/vcr_cassettes/sso/create_connection_with_invalid_source.yml
@@ -294,6 +301,7 @@ test_files:
294
301
  - spec/lib/workos/audit_trail_spec.rb
295
302
  - spec/lib/workos/base_spec.rb
296
303
  - spec/lib/workos/directory_sync_spec.rb
304
+ - spec/lib/workos/passwordless_spec.rb
297
305
  - spec/lib/workos/portal_spec.rb
298
306
  - spec/lib/workos/sso_spec.rb
299
307
  - spec/spec_helper.rb
@@ -317,6 +325,10 @@ test_files:
317
325
  - spec/support/fixtures/vcr_cassettes/organization/create.yml
318
326
  - spec/support/fixtures/vcr_cassettes/organization/create_invalid.yml
319
327
  - spec/support/fixtures/vcr_cassettes/organization/list.yml
328
+ - spec/support/fixtures/vcr_cassettes/passwordless/create_session.yml
329
+ - spec/support/fixtures/vcr_cassettes/passwordless/create_session_invalid.yml
330
+ - spec/support/fixtures/vcr_cassettes/passwordless/send_session.yml
331
+ - spec/support/fixtures/vcr_cassettes/passwordless/send_session_invalid.yml
320
332
  - spec/support/fixtures/vcr_cassettes/portal/generate_link.yml
321
333
  - spec/support/fixtures/vcr_cassettes/portal/generate_link_invalid.yml
322
334
  - spec/support/fixtures/vcr_cassettes/sso/create_connection_with_invalid_source.yml
data/CODEOWNERS DELETED
@@ -1 +0,0 @@
1
- @marktran