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.
- checksums.yaml +4 -4
- data/.github/workflows/ci.yml +37 -0
- data/.github/workflows/release.yml +43 -0
- data/.rubocop.yml +8 -1
- data/Gemfile.lock +22 -69
- data/lib/workos/audit_log_export.rb +8 -31
- data/lib/workos/audit_logs.rb +0 -26
- data/lib/workos/authentication_factor_and_challenge.rb +0 -3
- data/lib/workos/authentication_response.rb +12 -5
- data/lib/workos/challenge.rb +9 -28
- data/lib/workos/client.rb +0 -41
- data/lib/workos/configuration.rb +0 -1
- data/lib/workos/connection.rb +11 -35
- data/lib/workos/directory.rb +10 -37
- data/lib/workos/directory_group.rb +9 -36
- data/lib/workos/directory_sync.rb +0 -21
- data/lib/workos/directory_user.rb +17 -51
- data/lib/workos/errors.rb +0 -16
- data/lib/workos/event.rb +5 -26
- data/lib/workos/events.rb +0 -7
- data/lib/workos/factor.rb +9 -28
- data/lib/workos/hash_provider.rb +0 -1
- data/lib/workos/impersonator.rb +23 -0
- data/lib/workos/invitation.rb +12 -37
- data/lib/workos/mfa.rb +0 -42
- data/lib/workos/organization.rb +8 -31
- data/lib/workos/organization_membership.rb +8 -27
- data/lib/workos/organizations.rb +0 -26
- data/lib/workos/passwordless.rb +0 -14
- data/lib/workos/portal.rb +1 -13
- data/lib/workos/profile.rb +12 -39
- data/lib/workos/profile_and_token.rb +1 -4
- data/lib/workos/refresh_authentication_response.rb +24 -0
- data/lib/workos/sso.rb +1 -43
- data/lib/workos/types/intent.rb +16 -0
- data/lib/workos/types/list_struct.rb +8 -5
- data/lib/workos/types/passwordless_session_struct.rb +10 -9
- data/lib/workos/types/provider.rb +15 -0
- data/lib/workos/types.rb +5 -23
- data/lib/workos/user.rb +10 -31
- data/lib/workos/user_and_token.rb +1 -4
- data/lib/workos/user_management.rb +108 -219
- data/lib/workos/user_response.rb +0 -3
- data/lib/workos/verify_challenge.rb +4 -18
- data/lib/workos/version.rb +1 -2
- data/lib/workos/webhook.rb +5 -26
- data/lib/workos/webhooks.rb +1 -38
- data/lib/workos.rb +2 -2
- data/spec/lib/workos/audit_logs_spec.rb +2 -3
- data/spec/lib/workos/configuration_spec.rb +0 -1
- data/spec/lib/workos/directory_sync_spec.rb +0 -1
- data/spec/lib/workos/directory_user_spec.rb +0 -1
- data/spec/lib/workos/event_spec.rb +0 -1
- data/spec/lib/workos/mfa_spec.rb +0 -1
- data/spec/lib/workos/organizations_spec.rb +0 -1
- data/spec/lib/workos/passwordless_spec.rb +0 -1
- data/spec/lib/workos/portal_spec.rb +0 -1
- data/spec/lib/workos/sso_spec.rb +0 -1
- data/spec/lib/workos/user_management_spec.rb +59 -10
- data/spec/lib/workos/webhooks_spec.rb +0 -1
- data/spec/spec_helper.rb +6 -9
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_code/valid.yml +1 -1
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_code/valid_with_impersonator.yml +80 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_email_verification/valid.yml +1 -1
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_magic_auth/valid.yml +1 -1
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_organization_selection/valid.yml +1 -1
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_password/valid.yml +1 -1
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_refresh_code/invalid.yml +81 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_refresh_token/valid.yml +81 -0
- data/spec/support/fixtures/vcr_cassettes/user_management/authenticate_with_totp/valid.yml +1 -1
- data/spec/support/shared_examples/client_spec.rb +0 -1
- data/workos.gemspec +1 -6
- metadata +19 -129
- data/.semaphore/rubygems.yml +0 -24
- data/.semaphore/semaphore.yml +0 -51
- data/bin/tapioca +0 -29
- data/codecov.yml +0 -12
- data/devbox.json +0 -18
- data/devbox.lock +0 -11
- data/lib/workos/types/audit_log_export_struct.rb +0 -17
- data/lib/workos/types/challenge_struct.rb +0 -18
- data/lib/workos/types/connection_struct.rb +0 -20
- data/lib/workos/types/directory_group_struct.rb +0 -19
- data/lib/workos/types/directory_struct.rb +0 -19
- data/lib/workos/types/directory_user_struct.rb +0 -26
- data/lib/workos/types/event_struct.rb +0 -15
- data/lib/workos/types/factor_struct.rb +0 -18
- data/lib/workos/types/intent_enum.rb +0 -17
- data/lib/workos/types/invitation_struct.rb +0 -20
- data/lib/workos/types/magic_auth_challenge_struct.rb +0 -12
- data/lib/workos/types/organization_membership_struct.rb +0 -16
- data/lib/workos/types/organization_struct.rb +0 -17
- data/lib/workos/types/profile_struct.rb +0 -21
- data/lib/workos/types/provider_enum.rb +0 -16
- data/lib/workos/types/user_struct.rb +0 -18
- data/lib/workos/types/verify_challenge_struct.rb +0 -13
- data/lib/workos/types/webhook_struct.rb +0 -15
- data/sorbet/config +0 -2
- data/sorbet/rbi/gems/addressable@2.8.0.rbi +0 -290
- data/sorbet/rbi/gems/ast@2.4.2.rbi +0 -54
- data/sorbet/rbi/gems/codecov@0.2.12.rbi +0 -55
- data/sorbet/rbi/gems/coderay@1.1.3.rbi +0 -8
- data/sorbet/rbi/gems/crack@0.4.5.rbi +0 -57
- data/sorbet/rbi/gems/diff-lcs@1.4.4.rbi +0 -185
- data/sorbet/rbi/gems/docile@1.3.5.rbi +0 -54
- data/sorbet/rbi/gems/hashdiff@1.0.1.rbi +0 -82
- data/sorbet/rbi/gems/json@2.5.1.rbi +0 -109
- data/sorbet/rbi/gems/method_source@1.0.0.rbi +0 -8
- data/sorbet/rbi/gems/parallel@1.20.1.rbi +0 -113
- data/sorbet/rbi/gems/parser@3.0.1.0.rbi +0 -1187
- data/sorbet/rbi/gems/pry@0.14.2.rbi +0 -8
- data/sorbet/rbi/gems/public_suffix@4.0.6.rbi +0 -146
- data/sorbet/rbi/gems/rainbow@3.0.0.rbi +0 -153
- data/sorbet/rbi/gems/rake@13.0.3.rbi +0 -807
- data/sorbet/rbi/gems/rbi@0.0.16.rbi +0 -2118
- data/sorbet/rbi/gems/regexp_parser@2.1.1.rbi +0 -1117
- data/sorbet/rbi/gems/rexml@3.2.5.rbi +0 -709
- data/sorbet/rbi/gems/rspec-core@3.9.3.rbi +0 -2467
- data/sorbet/rbi/gems/rspec-expectations@3.9.4.rbi +0 -1569
- data/sorbet/rbi/gems/rspec-mocks@3.9.1.rbi +0 -1493
- data/sorbet/rbi/gems/rspec-support@3.9.4.rbi +0 -511
- data/sorbet/rbi/gems/rspec@3.9.0.rbi +0 -38
- data/sorbet/rbi/gems/rubocop-ast@1.4.1.rbi +0 -1881
- data/sorbet/rbi/gems/rubocop@0.93.1.rbi +0 -11497
- data/sorbet/rbi/gems/ruby-progressbar@1.11.0.rbi +0 -405
- data/sorbet/rbi/gems/simplecov-html@0.12.3.rbi +0 -89
- data/sorbet/rbi/gems/simplecov@0.21.2.rbi +0 -577
- data/sorbet/rbi/gems/simplecov_json_formatter@0.1.2.rbi +0 -8
- data/sorbet/rbi/gems/spoom@1.1.15.rbi +0 -1549
- data/sorbet/rbi/gems/tapioca@0.7.3.rbi +0 -1718
- data/sorbet/rbi/gems/thor@1.2.1.rbi +0 -844
- data/sorbet/rbi/gems/unicode-display_width@1.7.0.rbi +0 -22
- data/sorbet/rbi/gems/unparser@0.6.2.rbi +0 -8
- data/sorbet/rbi/gems/vcr@5.0.0.rbi +0 -699
- data/sorbet/rbi/gems/webmock@3.12.2.rbi +0 -662
- data/sorbet/rbi/gems/yard-sorbet@0.8.0.rbi +0 -268
- data/sorbet/rbi/gems/yard@0.9.26.rbi +0 -4048
- data/sorbet/tapioca/config.yml +0 -13
- data/sorbet/tapioca/require.rb +0 -4
data/lib/workos/organization.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: true
|
|
3
2
|
|
|
4
3
|
module WorkOS
|
|
5
4
|
# The Organization class provides a lightweight wrapper around
|
|
@@ -7,20 +6,18 @@ module WorkOS
|
|
|
7
6
|
# in user space, and is instantiated internally but exposed.
|
|
8
7
|
class Organization
|
|
9
8
|
include HashProvider
|
|
10
|
-
extend T::Sig
|
|
11
9
|
|
|
12
10
|
attr_accessor :id, :domains, :name, :allow_profiles_outside_organization, :created_at, :updated_at
|
|
13
11
|
|
|
14
|
-
sig { params(json: String).void }
|
|
15
12
|
def initialize(json)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@id =
|
|
19
|
-
@name =
|
|
20
|
-
@allow_profiles_outside_organization =
|
|
21
|
-
@domains =
|
|
22
|
-
@created_at =
|
|
23
|
-
@updated_at =
|
|
13
|
+
hash = JSON.parse(json, symbolize_names: true)
|
|
14
|
+
|
|
15
|
+
@id = hash[:id]
|
|
16
|
+
@name = hash[:name]
|
|
17
|
+
@allow_profiles_outside_organization = hash[:allow_profiles_outside_organization]
|
|
18
|
+
@domains = hash[:domains]
|
|
19
|
+
@created_at = hash[:created_at]
|
|
20
|
+
@updated_at = hash[:updated_at]
|
|
24
21
|
end
|
|
25
22
|
|
|
26
23
|
def to_json(*)
|
|
@@ -33,25 +30,5 @@ module WorkOS
|
|
|
33
30
|
updated_at: updated_at,
|
|
34
31
|
}
|
|
35
32
|
end
|
|
36
|
-
|
|
37
|
-
private
|
|
38
|
-
|
|
39
|
-
sig do
|
|
40
|
-
params(
|
|
41
|
-
json_string: String,
|
|
42
|
-
).returns(WorkOS::Types::OrganizationStruct)
|
|
43
|
-
end
|
|
44
|
-
def parse_json(json_string)
|
|
45
|
-
hash = JSON.parse(json_string, symbolize_names: true)
|
|
46
|
-
|
|
47
|
-
WorkOS::Types::OrganizationStruct.new(
|
|
48
|
-
id: hash[:id],
|
|
49
|
-
name: hash[:name],
|
|
50
|
-
allow_profiles_outside_organization: hash[:allow_profiles_outside_organization],
|
|
51
|
-
domains: hash[:domains],
|
|
52
|
-
created_at: hash[:created_at],
|
|
53
|
-
updated_at: hash[:updated_at],
|
|
54
|
-
)
|
|
55
|
-
end
|
|
56
33
|
end
|
|
57
34
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: true
|
|
3
2
|
|
|
4
3
|
module WorkOS
|
|
5
4
|
# The OrganizationMembership class provides a lightweight wrapper around a WorkOS OrganizationMembership
|
|
@@ -7,20 +6,18 @@ module WorkOS
|
|
|
7
6
|
# and is instantiated internally but exposed.
|
|
8
7
|
class OrganizationMembership
|
|
9
8
|
include HashProvider
|
|
10
|
-
extend T::Sig
|
|
11
9
|
|
|
12
10
|
attr_accessor :id, :user_id, :organization_id, :status, :created_at, :updated_at
|
|
13
11
|
|
|
14
|
-
sig { params(json: String).void }
|
|
15
12
|
def initialize(json)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@id =
|
|
19
|
-
@user_id =
|
|
20
|
-
@organization_id =
|
|
21
|
-
@status =
|
|
22
|
-
@created_at =
|
|
23
|
-
@updated_at =
|
|
13
|
+
hash = JSON.parse(json, symbolize_names: true)
|
|
14
|
+
|
|
15
|
+
@id = hash[:id]
|
|
16
|
+
@user_id = hash[:user_id]
|
|
17
|
+
@organization_id = hash[:organization_id]
|
|
18
|
+
@status = hash[:status]
|
|
19
|
+
@created_at = hash[:created_at]
|
|
20
|
+
@updated_at = hash[:updated_at]
|
|
24
21
|
end
|
|
25
22
|
|
|
26
23
|
def to_json(*)
|
|
@@ -33,21 +30,5 @@ module WorkOS
|
|
|
33
30
|
updated_at: updated_at,
|
|
34
31
|
}
|
|
35
32
|
end
|
|
36
|
-
|
|
37
|
-
private
|
|
38
|
-
|
|
39
|
-
sig { params(json_string: String).returns(WorkOS::Types::OrganizationMembershipStruct) }
|
|
40
|
-
def parse_json(json_string)
|
|
41
|
-
hash = JSON.parse(json_string, symbolize_names: true)
|
|
42
|
-
|
|
43
|
-
WorkOS::Types::OrganizationMembershipStruct.new(
|
|
44
|
-
id: hash[:id],
|
|
45
|
-
user_id: hash[:user_id],
|
|
46
|
-
organization_id: hash[:organization_id],
|
|
47
|
-
status: hash[:status],
|
|
48
|
-
created_at: hash[:created_at],
|
|
49
|
-
updated_at: hash[:updated_at],
|
|
50
|
-
)
|
|
51
|
-
end
|
|
52
33
|
end
|
|
53
34
|
end
|
data/lib/workos/organizations.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: true
|
|
3
2
|
|
|
4
3
|
require 'net/http'
|
|
5
4
|
|
|
@@ -7,7 +6,6 @@ module WorkOS
|
|
|
7
6
|
# The Organizations module provides resource methods for working with Organizations
|
|
8
7
|
module Organizations
|
|
9
8
|
class << self
|
|
10
|
-
extend T::Sig
|
|
11
9
|
include Client
|
|
12
10
|
|
|
13
11
|
# Retrieve a list of organizations that have connections configured
|
|
@@ -22,11 +20,6 @@ module WorkOS
|
|
|
22
20
|
# @param [Integer] limit A pagination argument used to limit the number
|
|
23
21
|
# @param [String] order The order in which to paginate records
|
|
24
22
|
# of listed Organizations that are returned.
|
|
25
|
-
sig do
|
|
26
|
-
params(
|
|
27
|
-
options: T::Hash[Symbol, String],
|
|
28
|
-
).returns(WorkOS::Types::ListStruct)
|
|
29
|
-
end
|
|
30
23
|
def list_organizations(options = {})
|
|
31
24
|
options[:order] ||= 'desc'
|
|
32
25
|
response = execute_request(
|
|
@@ -64,7 +57,6 @@ module WorkOS
|
|
|
64
57
|
# :domain=>"foo-corp.com"}]>
|
|
65
58
|
#
|
|
66
59
|
# @return [WorkOS::Organization]
|
|
67
|
-
sig { params(id: String).returns(WorkOS::Organization) }
|
|
68
60
|
def get_organization(id:)
|
|
69
61
|
request = get_request(
|
|
70
62
|
auth: true,
|
|
@@ -84,14 +76,6 @@ module WorkOS
|
|
|
84
76
|
# @param [Boolean, nil] allow_profiles_outside_organization Whether Connections
|
|
85
77
|
# within the Organization allow profiles that are outside of the Organization's configured User Email Domains.
|
|
86
78
|
# @param [String] idempotency_key An idempotency key
|
|
87
|
-
sig do
|
|
88
|
-
params(
|
|
89
|
-
domains: T::Array[String],
|
|
90
|
-
name: String,
|
|
91
|
-
allow_profiles_outside_organization: T.nilable(T::Boolean),
|
|
92
|
-
idempotency_key: T.nilable(String),
|
|
93
|
-
).returns(WorkOS::Organization)
|
|
94
|
-
end
|
|
95
79
|
def create_organization(domains:, name:, allow_profiles_outside_organization: nil, idempotency_key: nil)
|
|
96
80
|
request = post_request(
|
|
97
81
|
auth: true,
|
|
@@ -118,14 +102,6 @@ module WorkOS
|
|
|
118
102
|
# @param [String] name A unique, descriptive name for the organization
|
|
119
103
|
# @param [Boolean, nil] allow_profiles_outside_organization Whether Connections
|
|
120
104
|
# within the Organization allow profiles that are outside of the Organization's configured User Email Domains.
|
|
121
|
-
sig do
|
|
122
|
-
params(
|
|
123
|
-
organization: String,
|
|
124
|
-
domains: T::Array[String],
|
|
125
|
-
name: String,
|
|
126
|
-
allow_profiles_outside_organization: T.nilable(T::Boolean),
|
|
127
|
-
).returns(WorkOS::Organization)
|
|
128
|
-
end
|
|
129
105
|
def update_organization(organization:, domains:, name:, allow_profiles_outside_organization: nil)
|
|
130
106
|
request = put_request(
|
|
131
107
|
auth: true,
|
|
@@ -152,7 +128,6 @@ module WorkOS
|
|
|
152
128
|
# => true
|
|
153
129
|
#
|
|
154
130
|
# @return [Bool] - returns `true` if successful
|
|
155
|
-
sig { params(id: String).returns(T::Boolean) }
|
|
156
131
|
def delete_organization(id:)
|
|
157
132
|
request = delete_request(
|
|
158
133
|
auth: true,
|
|
@@ -166,7 +141,6 @@ module WorkOS
|
|
|
166
141
|
|
|
167
142
|
private
|
|
168
143
|
|
|
169
|
-
sig { params(response: Net::HTTPResponse).void }
|
|
170
144
|
def check_and_raise_organization_error(response:)
|
|
171
145
|
begin
|
|
172
146
|
body = JSON.parse(response.body)
|
data/lib/workos/passwordless.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: true
|
|
3
2
|
|
|
4
3
|
require 'net/http'
|
|
5
4
|
|
|
@@ -11,7 +10,6 @@ module WorkOS
|
|
|
11
10
|
# @see https://workos.com/docs/sso/configuring-magic-link
|
|
12
11
|
module Passwordless
|
|
13
12
|
class << self
|
|
14
|
-
extend T::Sig
|
|
15
13
|
include Client
|
|
16
14
|
|
|
17
15
|
# Create a Passwordless Session.
|
|
@@ -33,12 +31,6 @@ module WorkOS
|
|
|
33
31
|
# configured redirect URI on your WorkOS dashboard.
|
|
34
32
|
#
|
|
35
33
|
# @return Hash
|
|
36
|
-
sig do
|
|
37
|
-
params(
|
|
38
|
-
options: Hash,
|
|
39
|
-
).returns(WorkOS::Types::PasswordlessSessionStruct)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
34
|
def create_session(options)
|
|
43
35
|
response = execute_request(
|
|
44
36
|
request: post_request(
|
|
@@ -64,12 +56,6 @@ module WorkOS
|
|
|
64
56
|
# Session to send an email for.
|
|
65
57
|
#
|
|
66
58
|
# @return Hash
|
|
67
|
-
sig do
|
|
68
|
-
params(
|
|
69
|
-
session_id: String,
|
|
70
|
-
).returns(T::Hash[String, T::Boolean])
|
|
71
|
-
end
|
|
72
|
-
|
|
73
59
|
def send_session(session_id)
|
|
74
60
|
response = execute_request(
|
|
75
61
|
request: post_request(
|
data/lib/workos/portal.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: true
|
|
3
2
|
|
|
4
3
|
require 'net/http'
|
|
5
4
|
|
|
@@ -8,11 +7,9 @@ module WorkOS
|
|
|
8
7
|
# Portal product
|
|
9
8
|
module Portal
|
|
10
9
|
class << self
|
|
11
|
-
extend T::Sig
|
|
12
10
|
include Client
|
|
13
11
|
|
|
14
|
-
GENERATE_LINK_INTENTS = WorkOS::Types::Intent
|
|
15
|
-
freeze
|
|
12
|
+
GENERATE_LINK_INTENTS = WorkOS::Types::Intent::ALL
|
|
16
13
|
|
|
17
14
|
# Generate a link to grant access to an organization's Admin Portal
|
|
18
15
|
#
|
|
@@ -25,14 +22,6 @@ module WorkOS
|
|
|
25
22
|
# redirect link set in your WorkOS Dashboard will be used.
|
|
26
23
|
# @param [String] The URL to which WorkOS will redirect users to upon
|
|
27
24
|
# successfully setting up Single Sign On or Directory Sync.
|
|
28
|
-
sig do
|
|
29
|
-
params(
|
|
30
|
-
intent: String,
|
|
31
|
-
organization: String,
|
|
32
|
-
return_url: T.nilable(String),
|
|
33
|
-
success_url: T.nilable(String),
|
|
34
|
-
).returns(String)
|
|
35
|
-
end
|
|
36
25
|
def generate_link(intent:, organization:, return_url: nil, success_url: nil)
|
|
37
26
|
validate_intent(intent)
|
|
38
27
|
|
|
@@ -54,7 +43,6 @@ module WorkOS
|
|
|
54
43
|
|
|
55
44
|
private
|
|
56
45
|
|
|
57
|
-
sig { params(intent: String).void }
|
|
58
46
|
def validate_intent(intent)
|
|
59
47
|
return if GENERATE_LINK_INTENTS.include?(intent)
|
|
60
48
|
|
data/lib/workos/profile.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: true
|
|
3
2
|
|
|
4
3
|
module WorkOS
|
|
5
4
|
# The Profile class provides a lighweight wrapper around
|
|
@@ -9,31 +8,25 @@ module WorkOS
|
|
|
9
8
|
# is instantiated internally but exposed.
|
|
10
9
|
class Profile
|
|
11
10
|
include HashProvider
|
|
12
|
-
extend T::Sig
|
|
13
11
|
|
|
14
|
-
sig { returns(String) }
|
|
15
12
|
attr_accessor :id, :email, :first_name, :last_name, :groups, :organization_id,
|
|
16
13
|
:connection_id, :connection_type, :idp_id, :raw_attributes
|
|
17
14
|
|
|
18
|
-
# rubocop:disable Metrics/AbcSize
|
|
19
|
-
sig { params(profile_json: String).void }
|
|
20
15
|
def initialize(profile_json)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@id =
|
|
24
|
-
@email =
|
|
25
|
-
@first_name =
|
|
26
|
-
@last_name =
|
|
27
|
-
@groups =
|
|
28
|
-
@organization_id =
|
|
29
|
-
@connection_id =
|
|
30
|
-
@connection_type =
|
|
31
|
-
@idp_id =
|
|
32
|
-
@raw_attributes =
|
|
16
|
+
hash = JSON.parse(profile_json, symbolize_names: true)
|
|
17
|
+
|
|
18
|
+
@id = hash[:id]
|
|
19
|
+
@email = hash[:email]
|
|
20
|
+
@first_name = hash[:first_name]
|
|
21
|
+
@last_name = hash[:last_name]
|
|
22
|
+
@groups = hash[:groups]
|
|
23
|
+
@organization_id = hash[:organization_id]
|
|
24
|
+
@connection_id = hash[:connection_id]
|
|
25
|
+
@connection_type = hash[:connection_type]
|
|
26
|
+
@idp_id = hash[:idp_id]
|
|
27
|
+
@raw_attributes = hash[:raw_attributes]
|
|
33
28
|
end
|
|
34
|
-
# rubocop:enable Metrics/AbcSize
|
|
35
29
|
|
|
36
|
-
sig { returns(String) }
|
|
37
30
|
def full_name
|
|
38
31
|
[first_name, last_name].compact.join(' ')
|
|
39
32
|
end
|
|
@@ -52,25 +45,5 @@ module WorkOS
|
|
|
52
45
|
raw_attributes: raw_attributes,
|
|
53
46
|
}
|
|
54
47
|
end
|
|
55
|
-
|
|
56
|
-
private
|
|
57
|
-
|
|
58
|
-
sig { params(json_string: String).returns(WorkOS::Types::ProfileStruct) }
|
|
59
|
-
def parse_json(json_string)
|
|
60
|
-
hash = JSON.parse(json_string, symbolize_names: true)
|
|
61
|
-
|
|
62
|
-
WorkOS::Types::ProfileStruct.new(
|
|
63
|
-
id: hash[:id],
|
|
64
|
-
email: hash[:email],
|
|
65
|
-
first_name: hash[:first_name],
|
|
66
|
-
last_name: hash[:last_name],
|
|
67
|
-
groups: hash[:groups],
|
|
68
|
-
organization_id: hash[:organization_id],
|
|
69
|
-
connection_id: hash[:connection_id],
|
|
70
|
-
connection_type: hash[:connection_type],
|
|
71
|
-
idp_id: hash[:idp_id],
|
|
72
|
-
raw_attributes: hash[:raw_attributes],
|
|
73
|
-
)
|
|
74
|
-
end
|
|
75
48
|
end
|
|
76
49
|
end
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: true
|
|
3
2
|
|
|
4
3
|
module WorkOS
|
|
5
4
|
# The ProfileAndToken class represents a Profile and a corresponding
|
|
@@ -7,15 +6,13 @@ module WorkOS
|
|
|
7
6
|
# is instantiated internally but exposed.
|
|
8
7
|
class ProfileAndToken
|
|
9
8
|
include HashProvider
|
|
10
|
-
extend T::Sig
|
|
11
9
|
|
|
12
10
|
attr_accessor :access_token, :profile
|
|
13
11
|
|
|
14
|
-
sig { params(profile_and_token_json: String).void }
|
|
15
12
|
def initialize(profile_and_token_json)
|
|
16
13
|
json = JSON.parse(profile_and_token_json, symbolize_names: true)
|
|
17
14
|
|
|
18
|
-
@access_token =
|
|
15
|
+
@access_token = json[:access_token]
|
|
19
16
|
@profile = WorkOS::Profile.new(json[:profile].to_json)
|
|
20
17
|
end
|
|
21
18
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WorkOS
|
|
4
|
+
# The RefreshAuthenticationResponse contains response data from a successful
|
|
5
|
+
# `UserManagement.authenticate_with_refresh_token` call
|
|
6
|
+
class RefreshAuthenticationResponse
|
|
7
|
+
include HashProvider
|
|
8
|
+
|
|
9
|
+
attr_accessor :access_token, :refresh_token
|
|
10
|
+
|
|
11
|
+
def initialize(authentication_response_json)
|
|
12
|
+
json = JSON.parse(authentication_response_json, symbolize_names: true)
|
|
13
|
+
@access_token = json[:access_token]
|
|
14
|
+
@refresh_token = json[:refresh_token]
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def to_json(*)
|
|
18
|
+
{
|
|
19
|
+
access_token: access_token,
|
|
20
|
+
refresh_token: refresh_token,
|
|
21
|
+
}
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
data/lib/workos/sso.rb
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: true
|
|
3
2
|
|
|
4
3
|
require 'net/http'
|
|
5
4
|
require 'uri'
|
|
@@ -12,10 +11,9 @@ module WorkOS
|
|
|
12
11
|
# @see https://docs.workos.com/sso/overview
|
|
13
12
|
module SSO
|
|
14
13
|
class << self
|
|
15
|
-
extend T::Sig
|
|
16
14
|
include Client
|
|
17
15
|
|
|
18
|
-
PROVIDERS = WorkOS::Types::Provider
|
|
16
|
+
PROVIDERS = WorkOS::Types::Provider::ALL
|
|
19
17
|
|
|
20
18
|
# Generate an Oauth2 authorization URL where your users will
|
|
21
19
|
# authenticate using the configured SSO Identity Provider.
|
|
@@ -55,19 +53,6 @@ module WorkOS
|
|
|
55
53
|
#
|
|
56
54
|
# @return [String]
|
|
57
55
|
# rubocop:disable Metrics/ParameterLists
|
|
58
|
-
sig do
|
|
59
|
-
params(
|
|
60
|
-
redirect_uri: String,
|
|
61
|
-
client_id: T.nilable(String),
|
|
62
|
-
domain: T.nilable(String),
|
|
63
|
-
domain_hint: T.nilable(String),
|
|
64
|
-
login_hint: T.nilable(String),
|
|
65
|
-
provider: T.nilable(String),
|
|
66
|
-
connection: T.nilable(String),
|
|
67
|
-
organization: T.nilable(String),
|
|
68
|
-
state: T.nilable(String),
|
|
69
|
-
).returns(String)
|
|
70
|
-
end
|
|
71
56
|
def authorization_url(
|
|
72
57
|
redirect_uri:,
|
|
73
58
|
client_id: nil,
|
|
@@ -108,11 +93,6 @@ module WorkOS
|
|
|
108
93
|
end
|
|
109
94
|
# rubocop:enable Metrics/ParameterLists
|
|
110
95
|
|
|
111
|
-
sig do
|
|
112
|
-
params(
|
|
113
|
-
access_token: String,
|
|
114
|
-
).returns(WorkOS::Profile)
|
|
115
|
-
end
|
|
116
96
|
def get_profile(access_token:)
|
|
117
97
|
response = execute_request(
|
|
118
98
|
request: get_request(
|
|
@@ -132,12 +112,6 @@ module WorkOS
|
|
|
132
112
|
# where you've configured your SSO connection
|
|
133
113
|
#
|
|
134
114
|
# @return [WorkOS::ProfileAndToken]
|
|
135
|
-
sig do
|
|
136
|
-
params(
|
|
137
|
-
code: String,
|
|
138
|
-
client_id: T.nilable(String),
|
|
139
|
-
).returns(WorkOS::ProfileAndToken)
|
|
140
|
-
end
|
|
141
115
|
def profile_and_token(code:, client_id: nil)
|
|
142
116
|
body = {
|
|
143
117
|
client_id: client_id,
|
|
@@ -169,11 +143,6 @@ module WorkOS
|
|
|
169
143
|
# before a provided Connection ID.
|
|
170
144
|
#
|
|
171
145
|
# @return [Hash]
|
|
172
|
-
sig do
|
|
173
|
-
params(
|
|
174
|
-
options: T::Hash[Symbol, String],
|
|
175
|
-
).returns(WorkOS::Types::ListStruct)
|
|
176
|
-
end
|
|
177
146
|
def list_connections(options = {})
|
|
178
147
|
options[:order] ||= 'desc'
|
|
179
148
|
response = execute_request(
|
|
@@ -211,7 +180,6 @@ module WorkOS
|
|
|
211
180
|
# :domain=>"example.com"}]>
|
|
212
181
|
#
|
|
213
182
|
# @return [WorkOS::Connection]
|
|
214
|
-
sig { params(id: String).returns(WorkOS::Connection) }
|
|
215
183
|
def get_connection(id:)
|
|
216
184
|
request = get_request(
|
|
217
185
|
auth: true,
|
|
@@ -232,7 +200,6 @@ module WorkOS
|
|
|
232
200
|
# => true
|
|
233
201
|
#
|
|
234
202
|
# @return [Bool] - returns `true` if successful
|
|
235
|
-
sig { params(id: String).returns(T::Boolean) }
|
|
236
203
|
def delete_connection(id:)
|
|
237
204
|
request = delete_request(
|
|
238
205
|
auth: true,
|
|
@@ -246,14 +213,6 @@ module WorkOS
|
|
|
246
213
|
|
|
247
214
|
private
|
|
248
215
|
|
|
249
|
-
sig do
|
|
250
|
-
params(
|
|
251
|
-
domain: T.nilable(String),
|
|
252
|
-
provider: T.nilable(String),
|
|
253
|
-
connection: T.nilable(String),
|
|
254
|
-
organization: T.nilable(String),
|
|
255
|
-
).void
|
|
256
|
-
end
|
|
257
216
|
def validate_authorization_url_arguments(
|
|
258
217
|
domain:,
|
|
259
218
|
provider:,
|
|
@@ -271,7 +230,6 @@ module WorkOS
|
|
|
271
230
|
" `provider` must be in #{PROVIDERS}"
|
|
272
231
|
end
|
|
273
232
|
|
|
274
|
-
sig { params(response: Net::HTTPResponse).void }
|
|
275
233
|
def check_and_raise_profile_and_token_error(response:)
|
|
276
234
|
begin
|
|
277
235
|
body = JSON.parse(response.body)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WorkOS
|
|
4
|
+
module Types
|
|
5
|
+
# The Intent constants are declarations of a fixed set of values for
|
|
6
|
+
# intents while generating an Admin Portal link.
|
|
7
|
+
module Intent
|
|
8
|
+
AUDIT_LOGS = 'audit_logs'
|
|
9
|
+
DSYNC = 'dsync'
|
|
10
|
+
LOG_STREAMS = 'log_streams'
|
|
11
|
+
SSO = 'sso'
|
|
12
|
+
|
|
13
|
+
ALL = [AUDIT_LOGS, DSYNC, LOG_STREAMS, SSO].freeze
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
@@ -1,13 +1,16 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: strict
|
|
3
2
|
|
|
4
3
|
module WorkOS
|
|
5
4
|
module Types
|
|
6
|
-
# ListStruct acts as
|
|
5
|
+
# ListStruct acts as an interface to expose lists of data and related
|
|
7
6
|
# metadata
|
|
8
|
-
class ListStruct
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
class ListStruct
|
|
8
|
+
attr_accessor :data, :list_metadata
|
|
9
|
+
|
|
10
|
+
def initialize(data:, list_metadata:)
|
|
11
|
+
@data = data
|
|
12
|
+
@list_metadata = list_metadata
|
|
13
|
+
end
|
|
11
14
|
end
|
|
12
15
|
end
|
|
13
16
|
end
|
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: strict
|
|
3
|
-
|
|
4
|
-
require 'date'
|
|
5
2
|
|
|
6
3
|
module WorkOS
|
|
7
4
|
module Types
|
|
8
|
-
# This PasswordlessSessionStruct acts as
|
|
5
|
+
# This PasswordlessSessionStruct acts as an interface
|
|
9
6
|
# for the Passwordless class
|
|
10
|
-
class PasswordlessSessionStruct
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
class PasswordlessSessionStruct
|
|
8
|
+
attr_accessor :id, :email, :expires_at, :link
|
|
9
|
+
|
|
10
|
+
def initialize(id:, email:, expires_at:, link:)
|
|
11
|
+
@id = id
|
|
12
|
+
@email = email
|
|
13
|
+
@expires_at = expires_at
|
|
14
|
+
@link = link
|
|
15
|
+
end
|
|
15
16
|
end
|
|
16
17
|
end
|
|
17
18
|
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WorkOS
|
|
4
|
+
module Types
|
|
5
|
+
# The Provider constants are declarations of a
|
|
6
|
+
# fixed set of values for SSO Providers.
|
|
7
|
+
module Provider
|
|
8
|
+
GitHub = 'GitHubOAuth'
|
|
9
|
+
Google = 'GoogleOAuth'
|
|
10
|
+
Microsoft = 'MicrosoftOAuth'
|
|
11
|
+
|
|
12
|
+
ALL = [GitHub, Google, Microsoft].freeze
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
data/lib/workos/types.rb
CHANGED
|
@@ -1,29 +1,11 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
|
-
# typed: strong
|
|
3
2
|
|
|
4
3
|
module WorkOS
|
|
5
|
-
#
|
|
6
|
-
# so we're using Sorbet throughout this Ruby gem.
|
|
4
|
+
# Types contains a few structs wrapping up common data structures.
|
|
7
5
|
module Types
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
require_relative 'types/directory_struct'
|
|
13
|
-
require_relative 'types/directory_user_struct'
|
|
14
|
-
require_relative 'types/event_struct'
|
|
15
|
-
require_relative 'types/factor_struct'
|
|
16
|
-
require_relative 'types/intent_enum'
|
|
17
|
-
require_relative 'types/invitation_struct'
|
|
18
|
-
require_relative 'types/list_struct'
|
|
19
|
-
require_relative 'types/magic_auth_challenge_struct'
|
|
20
|
-
require_relative 'types/organization_struct'
|
|
21
|
-
require_relative 'types/organization_membership_struct'
|
|
22
|
-
require_relative 'types/passwordless_session_struct'
|
|
23
|
-
require_relative 'types/profile_struct'
|
|
24
|
-
require_relative 'types/provider_enum'
|
|
25
|
-
require_relative 'types/user_struct'
|
|
26
|
-
require_relative 'types/verify_challenge_struct'
|
|
27
|
-
require_relative 'types/webhook_struct'
|
|
6
|
+
autoload :Provider, 'workos/types/provider'
|
|
7
|
+
autoload :Intent, 'workos/types/intent'
|
|
8
|
+
autoload :ListStruct, 'workos/types/list_struct'
|
|
9
|
+
autoload :PasswordlessSessionStruct, 'workos/types/passwordless_session_struct'
|
|
28
10
|
end
|
|
29
11
|
end
|