stytch 4.3.1 → 4.5.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f219fb6d4229d63ba1b65af614d31cae64ab44e139e17babd3063147a44d49e7
4
- data.tar.gz: 9d4180197e58f77c20019ea48178347f4f74b76c3260b1ba9d1cdb8df096abd3
3
+ metadata.gz: ee8240601c590ea9fac8e84fc7d93370c6244cbb028ea0cbf881794d9c78aad9
4
+ data.tar.gz: 531fd7ba0fd00397152083c2f99417e5fd0982c8ee53b9d578e207e530381bd6
5
5
  SHA512:
6
- metadata.gz: 686beb70fe69bf487b051a05a436c0dbd8b162a8b51423b3bdd05f20b32f11675568cc565526c974b5cd2437fe1b5ffb1c45def8ad92370ac99fabfc636e9ec4
7
- data.tar.gz: 1663b04992bd745b83413175819ee8adaa950e487a028846dd77bd23e5d994dc889daedb9882decb045c21263dd0b2a6cb578653bc0d44ca7add548e07352da7
6
+ metadata.gz: d352d1e8faf1fb38cc73cf30b8229cbb30cca0b9cf4fc2ee782e35fdad9e43343df1a6ea404261eca11012586b800a3dc3a856fada4e5ff52bc9371f0a285acd
7
+ data.tar.gz: 3e3199bfcf473eb6d19efe139a918dda570a42ace8fdfcd5a07af856107f4fa495cfd18a28e8c7a825791217ba25036a9bdbd541925180563c528b3411330767
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'b2b_magic_links'
4
+ require_relative 'b2b_organizations'
5
+ require_relative 'b2b_passwords'
6
+ require_relative 'b2b_sessions'
7
+ require_relative 'b2b_sso'
8
+
9
+ module StytchB2B
10
+ class Client
11
+ ENVIRONMENTS = %i[live test].freeze
12
+
13
+ attr_reader :magic_links, :organizations, :passwords, :sso, :sessions
14
+
15
+ def initialize(project_id:, secret:, env: nil, &block)
16
+ @api_host = api_host(env, project_id)
17
+ @project_id = project_id
18
+ @secret = secret
19
+
20
+ create_connection(&block)
21
+
22
+ @magic_links = StytchB2B::MagicLinks.new(@connection)
23
+ @organizations = StytchB2B::Organizations.new(@connection)
24
+ @passwords = StytchB2B::Passwords.new(@connection)
25
+ @sso = StytchB2B::SSO.new(@connection)
26
+ @sessions = StytchB2B::Sessions.new(@connection)
27
+ end
28
+
29
+ private
30
+
31
+ def api_host(env, project_id)
32
+ case env
33
+ when :live
34
+ 'https://api.stytch.com'
35
+ when :test
36
+ 'https://test.stytch.com'
37
+ when %r{\Ahttps?://}
38
+ # If this is a string that looks like a URL, assume it's an internal development URL.
39
+ env
40
+ else
41
+ if project_id.start_with? 'project-live-'
42
+ 'https://api.stytch.com'
43
+ else
44
+ 'https://test.stytch.com'
45
+ end
46
+ end
47
+ end
48
+
49
+ def create_connection
50
+ @connection = Faraday.new(url: @api_host) do |builder|
51
+ block_given? ? yield(builder) : build_default_connection(builder)
52
+ end
53
+ @connection.basic_auth(@project_id, @secret)
54
+ end
55
+
56
+ def build_default_connection(builder)
57
+ builder.options[:timeout] = Stytch::Middleware::NETWORK_TIMEOUT
58
+ builder.headers = Stytch::Middleware::NETWORK_HEADERS
59
+ builder.request :json
60
+ builder.use Stytch::Middleware
61
+ builder.response :json, content_type: /\bjson$/
62
+ builder.adapter Faraday.default_adapter
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'request_helper'
4
+
5
+ module StytchB2B
6
+ class Discovery
7
+ include Stytch::RequestHelper
8
+ attr_reader :intermediate_sessions, :organizations
9
+
10
+ def initialize(connection)
11
+ @connection = connection
12
+
13
+ @intermediate_sessions = StytchB2B::Discovery::IntermediateSessions.new(@connection)
14
+ @organizations = StytchB2B::Discovery::Organizations.new(@connection)
15
+ end
16
+
17
+ class IntermediateSessions
18
+ include Stytch::RequestHelper
19
+
20
+ def initialize(connection)
21
+ @connection = connection
22
+ end
23
+
24
+ def exchange(
25
+ intermediate_session_token:,
26
+ organization_id:,
27
+ session_duration_minutes: nil,
28
+ session_custom_claims: nil
29
+ )
30
+ request = {
31
+ intermediate_session_token: intermediate_session_token,
32
+ organization_id: organization_id
33
+ }
34
+ request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
35
+ request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
36
+
37
+ post_request('/v1/b2b/discovery/intermediate_sessions/exchange', request)
38
+ end
39
+ end
40
+
41
+ class Organizations
42
+ include Stytch::RequestHelper
43
+
44
+ def initialize(connection)
45
+ @connection = connection
46
+ end
47
+
48
+ def create(
49
+ intermediate_session_token:,
50
+ organization_name:,
51
+ organization_slug:,
52
+ session_duration_minutes: nil,
53
+ session_custom_claims: nil,
54
+ organization_logo_url: nil,
55
+ trusted_metadata: nil,
56
+ sso_jit_provisioning: nil,
57
+ email_allowed_domains: nil,
58
+ email_jit_provisioning: nil,
59
+ email_invites: nil,
60
+ auth_methods: nil,
61
+ allowed_auth_methods: nil
62
+ )
63
+ request = {
64
+ intermediate_session_token: intermediate_session_token,
65
+ organization_name: organization_name,
66
+ organization_slug: organization_slug
67
+ }
68
+ request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
69
+ request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
70
+ request[:organization_logo_url] = organization_logo_url unless organization_logo_url.nil?
71
+ request[:trusted_metadata] = trusted_metadata unless trusted_metadata.nil?
72
+ request[:sso_jit_provisioning] = sso_jit_provisioning unless sso_jit_provisioning.nil?
73
+ request[:email_allowed_domains] = email_allowed_domains unless email_allowed_domains.nil?
74
+ request[:email_jit_provisioning] = email_jit_provisioning unless email_jit_provisioning.nil?
75
+ request[:email_invites] = email_invites unless email_invites.nil?
76
+ request[:auth_methods] = auth_methods unless auth_methods.nil?
77
+ request[:allowed_auth_methods] = allowed_auth_methods unless allowed_auth_methods.nil?
78
+
79
+ post_request('/v1/b2b/discovery/organizations/create', request)
80
+ end
81
+
82
+ def list(
83
+ intermediate_session_token: nil,
84
+ session_token: nil,
85
+ session_jwt: nil
86
+ )
87
+ request = {}
88
+ request[:intermediate_session_token] = intermediate_session_token unless intermediate_session_token.nil?
89
+ request[:session_token] = session_token unless session_token.nil?
90
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
91
+
92
+ post_request('/v1/b2b/discovery/organizations', request)
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'request_helper'
4
+
5
+ module StytchB2B
6
+ class MagicLinks
7
+ include Stytch::RequestHelper
8
+ attr_reader :email, :discovery
9
+
10
+ def initialize(connection)
11
+ @connection = connection
12
+
13
+ @email = StytchB2B::MagicLinks::Email.new(@connection)
14
+ @discovery = StytchB2B::MagicLinks::Discovery.new(@connection)
15
+ end
16
+
17
+ def authenticate(
18
+ magic_links_token:,
19
+ pkce_code_verifier: nil,
20
+ session_token: nil,
21
+ session_jwt: nil,
22
+ session_duration_minutes: nil,
23
+ session_custom_claims: nil
24
+ )
25
+ request = {
26
+ magic_links_token: magic_links_token
27
+ }
28
+ request[:pkce_code_verifier] = pkce_code_verifier unless pkce_code_verifier.nil?
29
+ request[:session_token] = session_token unless session_token.nil?
30
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
31
+ request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
32
+ request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
33
+
34
+ post_request('/v1/b2b/magic_links/authenticate', request)
35
+ end
36
+
37
+ class Email
38
+ include Stytch::RequestHelper
39
+ attr_reader :discovery
40
+
41
+ def initialize(connection)
42
+ @connection = connection
43
+
44
+ @discovery = StytchB2B::MagicLinks::Email::Discovery.new(@connection)
45
+ end
46
+
47
+ def login_or_signup(
48
+ organization_id:,
49
+ email_address:,
50
+ login_redirect_url: nil,
51
+ signup_redirect_url: nil,
52
+ pkce_code_challenge: nil,
53
+ login_template_id: nil,
54
+ signup_template_id: nil,
55
+ locale: nil
56
+ )
57
+ request = {
58
+ organization_id: organization_id,
59
+ email_address: email_address
60
+ }
61
+ request[:login_redirect_url] = login_redirect_url unless login_redirect_url.nil?
62
+ request[:signup_redirect_url] = signup_redirect_url unless signup_redirect_url.nil?
63
+ request[:pkce_code_challenge] = pkce_code_challenge unless pkce_code_challenge.nil?
64
+ request[:login_template_id] = login_template_id unless login_template_id.nil?
65
+ request[:signup_template_id] = signup_template_id unless signup_template_id.nil?
66
+ request[:locale] = locale unless locale.nil?
67
+
68
+ post_request('/v1/b2b/magic_links/email/login_or_signup', request)
69
+ end
70
+
71
+ def invite(
72
+ organization_id:,
73
+ email_address:,
74
+ invite_redirect_url: nil,
75
+ invited_by_member_id: nil,
76
+ name: nil,
77
+ trusted_metadata: nil,
78
+ untrusted_metadata: nil,
79
+ invite_template_id: nil,
80
+ locale: nil
81
+ )
82
+ request = {
83
+ organization_id: organization_id,
84
+ email_address: email_address
85
+ }
86
+ request[:invite_redirect_url] = invite_redirect_url unless invite_redirect_url.nil?
87
+ request[:invited_by_member_id] = invited_by_member_id unless invited_by_member_id.nil?
88
+ request[:name] = name unless name.nil?
89
+ request[:trusted_metadata] = trusted_metadata unless trusted_metadata.nil?
90
+ request[:untrusted_metadata] = untrusted_metadata unless untrusted_metadata.nil?
91
+ request[:invite_template_id] = invite_template_id unless invite_template_id.nil?
92
+ request[:locale] = locale unless locale.nil?
93
+
94
+ post_request('/v1/b2b/magic_links/email/invite', request)
95
+ end
96
+
97
+ class Discovery
98
+ include Stytch::RequestHelper
99
+
100
+ def initialize(connection)
101
+ @connection = connection
102
+ end
103
+
104
+ def send(
105
+ email_address:,
106
+ discovery_redirect_url: nil,
107
+ pkce_code_challenge: nil,
108
+ login_template_id: nil,
109
+ locale: nil
110
+ )
111
+ request = {
112
+ email_address: email_address
113
+ }
114
+ request[:discovery_redirect_url] = discovery_redirect_url unless discovery_redirect_url.nil?
115
+ request[:pkce_code_challenge] = pkce_code_challenge unless pkce_code_challenge.nil?
116
+ request[:login_template_id] = login_template_id unless login_template_id.nil?
117
+ request[:locale] = locale unless locale.nil?
118
+
119
+ post_request('/v1/b2b/magic_links/email/discovery/send', request)
120
+ end
121
+ end
122
+ end
123
+
124
+ class Discovery
125
+ include Stytch::RequestHelper
126
+
127
+ def initialize(connection)
128
+ @connection = connection
129
+ end
130
+
131
+ def authenticate(
132
+ discovery_magic_links_token:,
133
+ pkce_code_verifier: nil
134
+ )
135
+ request = {
136
+ discovery_magic_links_token: discovery_magic_links_token
137
+ }
138
+ request[:pkce_code_verifier] = pkce_code_verifier unless pkce_code_verifier.nil?
139
+
140
+ post_request('/v1/b2b/magic_links/discovery/authenticate', request)
141
+ end
142
+ end
143
+ end
144
+ end
@@ -0,0 +1,204 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'request_helper'
4
+
5
+ module StytchB2B
6
+ class Organizations
7
+ include Stytch::RequestHelper
8
+ attr_reader :members
9
+
10
+ def initialize(connection)
11
+ @connection = connection
12
+
13
+ @members = StytchB2B::Organizations::Members.new(@connection)
14
+ end
15
+
16
+ def create(
17
+ organization_name:,
18
+ organization_slug:,
19
+ organization_logo_url: nil,
20
+ trusted_metadata: nil,
21
+ sso_jit_provisioning: nil,
22
+ email_allowed_domains: nil,
23
+ email_jit_provisioning: nil,
24
+ email_invites: nil,
25
+ auth_methods: nil,
26
+ allowed_auth_methods: nil
27
+ )
28
+ request = {
29
+ organization_name: organization_name,
30
+ organization_slug: organization_slug
31
+ }
32
+ request[:organization_logo_url] = organization_logo_url unless organization_logo_url.nil?
33
+ request[:trusted_metadata] = trusted_metadata unless trusted_metadata.nil?
34
+ request[:sso_jit_provisioning] = sso_jit_provisioning unless sso_jit_provisioning.nil?
35
+ request[:email_allowed_domains] = email_allowed_domains unless email_allowed_domains.nil?
36
+ request[:email_jit_provisioning] = email_jit_provisioning unless email_jit_provisioning.nil?
37
+ request[:email_invites] = email_invites unless email_invites.nil?
38
+ request[:auth_methods] = auth_methods unless auth_methods.nil?
39
+ request[:allowed_auth_methods] = allowed_auth_methods unless allowed_auth_methods.nil?
40
+
41
+ post_request('/v1/b2b/organizations', request)
42
+ end
43
+
44
+ def get(
45
+ organization_id:
46
+ )
47
+ query_params = {
48
+ organization_id: organization_id
49
+ }
50
+ request = request_with_query_params("/v1/b2b/organizations/#{organization_id}", query_params)
51
+ get_request(request)
52
+ end
53
+
54
+ def update(
55
+ organization_id:,
56
+ organization_name: nil,
57
+ organization_slug: nil,
58
+ organization_logo_url: nil,
59
+ trusted_metadata: nil,
60
+ sso_default_connection_id: nil,
61
+ sso_jit_provisioning: nil,
62
+ sso_jit_provisioning_allowed_connections: nil,
63
+ email_allowed_domains: nil,
64
+ email_jit_provisioning: nil,
65
+ email_invites: nil,
66
+ auth_methods: nil,
67
+ allowed_auth_methods: nil
68
+ )
69
+ request = {
70
+ organization_id: organization_id
71
+ }
72
+ request[:organization_name] = organization_name unless organization_name.nil?
73
+ request[:organization_slug] = organization_slug unless organization_slug.nil?
74
+ request[:organization_logo_url] = organization_logo_url unless organization_logo_url.nil?
75
+ request[:trusted_metadata] = trusted_metadata unless trusted_metadata.nil?
76
+ request[:sso_default_connection_id] = sso_default_connection_id unless sso_default_connection_id.nil?
77
+ request[:sso_jit_provisioning] = sso_jit_provisioning unless sso_jit_provisioning.nil?
78
+ unless sso_jit_provisioning_allowed_connections.nil?
79
+ request[:sso_jit_provisioning_allowed_connections] =
80
+ sso_jit_provisioning_allowed_connections
81
+ end
82
+ request[:email_allowed_domains] = email_allowed_domains unless email_allowed_domains.nil?
83
+ request[:email_jit_provisioning] = email_jit_provisioning unless email_jit_provisioning.nil?
84
+ request[:email_invites] = email_invites unless email_invites.nil?
85
+ request[:auth_methods] = auth_methods unless auth_methods.nil?
86
+ request[:allowed_auth_methods] = allowed_auth_methods unless allowed_auth_methods.nil?
87
+
88
+ put_request("/v1/b2b/organizations/#{organization_id}", request)
89
+ end
90
+
91
+ def delete(
92
+ organization_id:
93
+ )
94
+ delete_request("/v1/b2b/organizations/#{organization_id}")
95
+ end
96
+
97
+ def search(
98
+ cursor: nil,
99
+ limit: nil,
100
+ query: nil
101
+ )
102
+ request = {}
103
+ request[:cursor] = cursor unless cursor.nil?
104
+ request[:limit] = limit unless limit.nil?
105
+ request[:query] = query unless query.nil?
106
+
107
+ post_request('/v1/b2b/organizations/search', request)
108
+ end
109
+
110
+ class Members
111
+ include Stytch::RequestHelper
112
+
113
+ def initialize(connection)
114
+ @connection = connection
115
+ end
116
+
117
+ def create(
118
+ organization_id:,
119
+ email_address:,
120
+ name: nil,
121
+ trusted_metadata: nil,
122
+ untrusted_metadata: nil,
123
+ create_member_as_pending: nil,
124
+ is_breakglass: nil
125
+ )
126
+ request = {
127
+ organization_id: organization_id,
128
+ email_address: email_address
129
+ }
130
+ request[:name] = name unless name.nil?
131
+ request[:trusted_metadata] = trusted_metadata unless trusted_metadata.nil?
132
+ request[:untrusted_metadata] = untrusted_metadata unless untrusted_metadata.nil?
133
+ request[:create_member_as_pending] = create_member_as_pending unless create_member_as_pending.nil?
134
+ request[:is_breakglass] = is_breakglass unless is_breakglass.nil?
135
+
136
+ post_request("/v1/b2b/organizations/#{organization_id}/members", request)
137
+ end
138
+
139
+ def get(
140
+ organization_id:,
141
+ member_id: nil,
142
+ email_address: nil
143
+ )
144
+ query_params = {
145
+ organization_id: organization_id,
146
+ member_id: member_id,
147
+ email_address: email_address
148
+ }
149
+ request = request_with_query_params("/v1/b2b/organizations/#{organization_id}/member", query_params)
150
+ get_request(request)
151
+ end
152
+
153
+ def update(
154
+ organization_id:,
155
+ member_id:,
156
+ name: nil,
157
+ trusted_metadata: nil,
158
+ untrusted_metadata: nil,
159
+ is_breakglass: nil
160
+ )
161
+ request = {
162
+ organization_id: organization_id,
163
+ member_id: member_id
164
+ }
165
+ request[:name] = name unless name.nil?
166
+ request[:trusted_metadata] = trusted_metadata unless trusted_metadata.nil?
167
+ request[:untrusted_metadata] = untrusted_metadata unless untrusted_metadata.nil?
168
+ request[:is_breakglass] = is_breakglass unless is_breakglass.nil?
169
+
170
+ put_request("/v1/b2b/organizations/#{organization_id}/members/#{member_id}", request)
171
+ end
172
+
173
+ def delete(
174
+ organization_id:,
175
+ member_id:
176
+ )
177
+ delete_request("/v1/b2b/organizations/#{organization_id}/members/#{member_id}")
178
+ end
179
+
180
+ def search(
181
+ organization_ids:,
182
+ cursor: nil,
183
+ limit: nil,
184
+ query: nil
185
+ )
186
+ request = {
187
+ organization_ids: organization_ids
188
+ }
189
+ request[:cursor] = cursor unless cursor.nil?
190
+ request[:limit] = limit unless limit.nil?
191
+ request[:query] = query unless query.nil?
192
+
193
+ post_request('/v1/b2b/organizations/members/search', request)
194
+ end
195
+
196
+ def organizations_delete_password(
197
+ organization_id:,
198
+ member_password_id:
199
+ )
200
+ delete_request("/v1/b2b/organizations/#{organization_id}/members/passwords/#{member_password_id}")
201
+ end
202
+ end
203
+ end
204
+ end
@@ -0,0 +1,195 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'request_helper'
4
+
5
+ module StytchB2B
6
+ class Passwords
7
+ include Stytch::RequestHelper
8
+ attr_reader :email, :sessions, :existing_password
9
+
10
+ def initialize(connection)
11
+ @connection = connection
12
+
13
+ @email = StytchB2B::Passwords::Email.new(@connection)
14
+ @sessions = StytchB2B::Passwords::Sessions.new(@connection)
15
+ @existing_password = StytchB2B::Passwords::ExistingPassword.new(@connection)
16
+ end
17
+
18
+ def strength_check(
19
+ password:,
20
+ email_address: nil
21
+ )
22
+ request = {
23
+ password: password
24
+ }
25
+ request[:email_address] = email_address unless email_address.nil?
26
+
27
+ post_request('/v1/b2b/passwords/strength_check', request)
28
+ end
29
+
30
+ def migrate(
31
+ email_address:,
32
+ hash:,
33
+ hash_type:,
34
+ organization_id:,
35
+ md_5_config: nil,
36
+ argon_2_config: nil,
37
+ sha_1_config: nil,
38
+ scrypt_config: nil,
39
+ name: nil,
40
+ trusted_metadata: nil,
41
+ untrusted_metadata: nil
42
+ )
43
+ request = {
44
+ email_address: email_address,
45
+ hash: hash,
46
+ hash_type: hash_type,
47
+ organization_id: organization_id
48
+ }
49
+ request[:md_5_config] = md_5_config unless md_5_config.nil?
50
+ request[:argon_2_config] = argon_2_config unless argon_2_config.nil?
51
+ request[:sha_1_config] = sha_1_config unless sha_1_config.nil?
52
+ request[:scrypt_config] = scrypt_config unless scrypt_config.nil?
53
+ request[:name] = name unless name.nil?
54
+ request[:trusted_metadata] = trusted_metadata unless trusted_metadata.nil?
55
+ request[:untrusted_metadata] = untrusted_metadata unless untrusted_metadata.nil?
56
+
57
+ post_request('/v1/b2b/passwords/migrate', request)
58
+ end
59
+
60
+ def authenticate(
61
+ organization_id:,
62
+ email_address:,
63
+ password:,
64
+ session_token: nil,
65
+ session_duration_minutes: nil,
66
+ session_jwt: nil,
67
+ session_custom_claims: nil
68
+ )
69
+ request = {
70
+ organization_id: organization_id,
71
+ email_address: email_address,
72
+ password: password
73
+ }
74
+ request[:session_token] = session_token unless session_token.nil?
75
+ request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
76
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
77
+ request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
78
+
79
+ post_request('/v1/b2b/passwords/authenticate', request)
80
+ end
81
+
82
+ class Email
83
+ include Stytch::RequestHelper
84
+
85
+ def initialize(connection)
86
+ @connection = connection
87
+ end
88
+
89
+ def reset_start(
90
+ organization_id:,
91
+ email_address:,
92
+ reset_password_redirect_url: nil,
93
+ reset_password_expiration_minutes: nil,
94
+ code_challenge: nil,
95
+ login_redirect_url: nil,
96
+ locale: nil,
97
+ reset_password_template_id: nil
98
+ )
99
+ request = {
100
+ organization_id: organization_id,
101
+ email_address: email_address
102
+ }
103
+ request[:reset_password_redirect_url] = reset_password_redirect_url unless reset_password_redirect_url.nil?
104
+ unless reset_password_expiration_minutes.nil?
105
+ request[:reset_password_expiration_minutes] =
106
+ reset_password_expiration_minutes
107
+ end
108
+ request[:code_challenge] = code_challenge unless code_challenge.nil?
109
+ request[:login_redirect_url] = login_redirect_url unless login_redirect_url.nil?
110
+ request[:locale] = locale unless locale.nil?
111
+ request[:reset_password_template_id] = reset_password_template_id unless reset_password_template_id.nil?
112
+
113
+ post_request('/v1/b2b/passwords/email/reset/start', request)
114
+ end
115
+
116
+ def reset(
117
+ password_reset_token:,
118
+ password:,
119
+ session_token: nil,
120
+ session_duration_minutes: nil,
121
+ session_jwt: nil,
122
+ code_verifier: nil,
123
+ session_custom_claims: nil
124
+ )
125
+ request = {
126
+ password_reset_token: password_reset_token,
127
+ password: password
128
+ }
129
+ request[:session_token] = session_token unless session_token.nil?
130
+ request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
131
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
132
+ request[:code_verifier] = code_verifier unless code_verifier.nil?
133
+ request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
134
+
135
+ post_request('/v1/b2b/passwords/email/reset', request)
136
+ end
137
+ end
138
+
139
+ class Sessions
140
+ include Stytch::RequestHelper
141
+
142
+ def initialize(connection)
143
+ @connection = connection
144
+ end
145
+
146
+ def reset(
147
+ organization_id:,
148
+ password:,
149
+ session_token: nil,
150
+ session_jwt: nil
151
+ )
152
+ request = {
153
+ organization_id: organization_id,
154
+ password: password
155
+ }
156
+ request[:session_token] = session_token unless session_token.nil?
157
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
158
+
159
+ post_request('/v1/b2b/passwords/session/reset', request)
160
+ end
161
+ end
162
+
163
+ class ExistingPassword
164
+ include Stytch::RequestHelper
165
+
166
+ def initialize(connection)
167
+ @connection = connection
168
+ end
169
+
170
+ def reset(
171
+ email_address:,
172
+ existing_password:,
173
+ new_password:,
174
+ organization_id:,
175
+ session_token: nil,
176
+ session_duration_minutes: nil,
177
+ session_jwt: nil,
178
+ session_custom_claims: nil
179
+ )
180
+ request = {
181
+ email_address: email_address,
182
+ existing_password: existing_password,
183
+ new_password: new_password,
184
+ organization_id: organization_id
185
+ }
186
+ request[:session_token] = session_token unless session_token.nil?
187
+ request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
188
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
189
+ request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
190
+
191
+ post_request('/v1/b2b/passwords/existing_password/reset', request)
192
+ end
193
+ end
194
+ end
195
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'request_helper'
4
+
5
+ module StytchB2B
6
+ class Sessions
7
+ include Stytch::RequestHelper
8
+
9
+ def initialize(connection)
10
+ @connection = connection
11
+ end
12
+
13
+ def get(
14
+ organization_id:,
15
+ member_id:
16
+ )
17
+ query_params = {
18
+ organization_id: organization_id,
19
+ member_id: member_id
20
+ }
21
+ request = request_with_query_params('/v1/b2b/sessions', query_params)
22
+ get_request(request)
23
+ end
24
+
25
+ def authenticate(
26
+ session_token: nil,
27
+ session_duration_minutes: nil,
28
+ session_jwt: nil,
29
+ session_custom_claims: nil
30
+ )
31
+ request = {}
32
+ request[:session_token] = session_token unless session_token.nil?
33
+ request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
34
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
35
+ request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
36
+
37
+ post_request('/v1/b2b/sessions/authenticate', request)
38
+ end
39
+
40
+ def revoke(
41
+ member_session_id: nil,
42
+ session_token: nil,
43
+ session_jwt: nil,
44
+ member_id: nil
45
+ )
46
+ request = {}
47
+ request[:member_session_id] = member_session_id unless member_session_id.nil?
48
+ request[:session_token] = session_token unless session_token.nil?
49
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
50
+ request[:member_id] = member_id unless member_id.nil?
51
+
52
+ post_request('/v1/b2b/sessions/revoke', request)
53
+ end
54
+
55
+ def exchange(
56
+ organization_id:,
57
+ session_token: nil,
58
+ session_jwt: nil,
59
+ session_duration_minutes: nil,
60
+ session_custom_claims: nil
61
+ )
62
+ request = {
63
+ organization_id: organization_id
64
+ }
65
+ request[:session_token] = session_token unless session_token.nil?
66
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
67
+ request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
68
+ request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
69
+
70
+ post_request('/v1/b2b/sessions/exchange', request)
71
+ end
72
+
73
+ def jwks(
74
+ project_id:
75
+ )
76
+ query_params = {
77
+ project_id: project_id
78
+ }
79
+ request = request_with_query_params("/v1/b2b/sessions/jwks/#{project_id}", query_params)
80
+ get_request(request)
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,150 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'request_helper'
4
+
5
+ module StytchB2B
6
+ class SSO
7
+ include Stytch::RequestHelper
8
+ attr_reader :oidc, :saml
9
+
10
+ def initialize(connection)
11
+ @connection = connection
12
+
13
+ @oidc = StytchB2B::SSO::OIDC.new(@connection)
14
+ @saml = StytchB2B::SSO::SAML.new(@connection)
15
+ end
16
+
17
+ def get_connections(
18
+ organization_id:
19
+ )
20
+ query_params = {}
21
+ request = request_with_query_params("/v1/b2b/sso/#{organization_id}", query_params)
22
+ get_request(request)
23
+ end
24
+
25
+ def delete_connection(
26
+ organization_id:,
27
+ connection_id:
28
+ )
29
+ delete_request("/v1/b2b/sso/#{organization_id}/connections/#{connection_id}")
30
+ end
31
+
32
+ def authenticate(
33
+ sso_token:,
34
+ pkce_code_verifier: nil,
35
+ session_token: nil,
36
+ session_jwt: nil,
37
+ session_duration_minutes: nil,
38
+ session_custom_claims: nil
39
+ )
40
+ request = {
41
+ sso_token: sso_token
42
+ }
43
+ request[:pkce_code_verifier] = pkce_code_verifier unless pkce_code_verifier.nil?
44
+ request[:session_token] = session_token unless session_token.nil?
45
+ request[:session_jwt] = session_jwt unless session_jwt.nil?
46
+ request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
47
+ request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
48
+
49
+ post_request('/v1/b2b/sso/authenticate', request)
50
+ end
51
+
52
+ class OIDC
53
+ include Stytch::RequestHelper
54
+
55
+ def initialize(connection)
56
+ @connection = connection
57
+ end
58
+
59
+ def create_connection(
60
+ organization_id:,
61
+ display_name: nil
62
+ )
63
+ request = {
64
+ organization_id: organization_id
65
+ }
66
+ request[:display_name] = display_name unless display_name.nil?
67
+
68
+ post_request("/v1/b2b/sso/oidc/#{organization_id}", request)
69
+ end
70
+
71
+ def update_connection(
72
+ organization_id:,
73
+ connection_id:,
74
+ display_name: nil,
75
+ client_id: nil,
76
+ client_secret: nil,
77
+ issuer: nil,
78
+ authorization_url: nil,
79
+ token_url: nil,
80
+ userinfo_url: nil,
81
+ jwks_url: nil
82
+ )
83
+ request = {
84
+ organization_id: organization_id,
85
+ connection_id: connection_id
86
+ }
87
+ request[:display_name] = display_name unless display_name.nil?
88
+ request[:client_id] = client_id unless client_id.nil?
89
+ request[:client_secret] = client_secret unless client_secret.nil?
90
+ request[:issuer] = issuer unless issuer.nil?
91
+ request[:authorization_url] = authorization_url unless authorization_url.nil?
92
+ request[:token_url] = token_url unless token_url.nil?
93
+ request[:userinfo_url] = userinfo_url unless userinfo_url.nil?
94
+ request[:jwks_url] = jwks_url unless jwks_url.nil?
95
+
96
+ put_request("/v1/b2b/sso/oidc/#{organization_id}/connections/#{connection_id}", request)
97
+ end
98
+ end
99
+
100
+ class SAML
101
+ include Stytch::RequestHelper
102
+
103
+ def initialize(connection)
104
+ @connection = connection
105
+ end
106
+
107
+ def create_connection(
108
+ organization_id:,
109
+ display_name: nil
110
+ )
111
+ request = {
112
+ organization_id: organization_id
113
+ }
114
+ request[:display_name] = display_name unless display_name.nil?
115
+
116
+ post_request("/v1/b2b/sso/saml/#{organization_id}", request)
117
+ end
118
+
119
+ def update_connection(
120
+ organization_id:,
121
+ connection_id:,
122
+ idp_entity_id: nil,
123
+ display_name: nil,
124
+ attribute_mapping: nil,
125
+ x509_certificate: nil,
126
+ idp_sso_url: nil
127
+ )
128
+ request = {
129
+ organization_id: organization_id,
130
+ connection_id: connection_id
131
+ }
132
+ request[:idp_entity_id] = idp_entity_id unless idp_entity_id.nil?
133
+ request[:display_name] = display_name unless display_name.nil?
134
+ request[:attribute_mapping] = attribute_mapping unless attribute_mapping.nil?
135
+ request[:x509_certificate] = x509_certificate unless x509_certificate.nil?
136
+ request[:idp_sso_url] = idp_sso_url unless idp_sso_url.nil?
137
+
138
+ put_request("/v1/b2b/sso/saml/#{organization_id}/connections/#{connection_id}", request)
139
+ end
140
+
141
+ def delete_verification_certificate(
142
+ organization_id:,
143
+ connection_id:,
144
+ certificate_id:
145
+ )
146
+ delete_request("/v1/b2b/sso/saml/#{organization_id}/connections/#{connection_id}/verification_certificates/#{certificate_id}")
147
+ end
148
+ end
149
+ end
150
+ end
data/lib/stytch/client.rb CHANGED
@@ -16,8 +16,8 @@ module Stytch
16
16
 
17
17
  attr_reader :users, :magic_links, :oauth, :otps, :sessions, :totps, :webauthn, :crypto_wallets, :passwords
18
18
 
19
- def initialize(env:, project_id:, secret:, &block)
20
- @api_host = api_host(env)
19
+ def initialize(project_id:, secret:, env: nil, &block)
20
+ @api_host = api_host(env, project_id)
21
21
  @project_id = project_id
22
22
  @secret = secret
23
23
 
@@ -36,7 +36,7 @@ module Stytch
36
36
 
37
37
  private
38
38
 
39
- def api_host(env)
39
+ def api_host(env, project_id)
40
40
  case env
41
41
  when :live
42
42
  'https://api.stytch.com'
@@ -46,7 +46,11 @@ module Stytch
46
46
  # If this is a string that looks like a URL, assume it's an internal development URL.
47
47
  env
48
48
  else
49
- raise ArgumentError, "Invalid value for env (#{env}): should be :live or :test"
49
+ if project_id.start_with? 'project-live-'
50
+ 'https://api.stytch.com'
51
+ else
52
+ 'https://test.stytch.com'
53
+ end
50
54
  end
51
55
  end
52
56
 
@@ -21,16 +21,22 @@ module Stytch
21
21
  def create(
22
22
  email:,
23
23
  password:,
24
+ name: {},
24
25
  session_duration_minutes: nil,
25
- session_custom_claims: nil
26
+ session_custom_claims: nil,
27
+ trusted_metadata: {},
28
+ untrusted_metadata: {}
26
29
  )
27
30
  request = {
28
31
  email: email,
29
32
  password: password
30
33
  }
31
34
 
35
+ request[:name] = name if name != {}
32
36
  request[:session_duration_minutes] = session_duration_minutes unless session_duration_minutes.nil?
33
37
  request[:session_custom_claims] = session_custom_claims unless session_custom_claims.nil?
38
+ request[:trusted_metadata] = trusted_metadata if trusted_metadata != {}
39
+ request[:untrusted_metadata] = untrusted_metadata if untrusted_metadata != {}
34
40
 
35
41
  post_request(PATH.to_s, request)
36
42
  end
@@ -73,6 +79,9 @@ module Stytch
73
79
  email:,
74
80
  hash:,
75
81
  hash_type:,
82
+ name: {},
83
+ trusted_metadata: {},
84
+ untrusted_metadata: {},
76
85
  md_5_config: {},
77
86
  argon_2_config: {},
78
87
  sha_1_config: {},
@@ -84,6 +93,10 @@ module Stytch
84
93
  hash_type: hash_type
85
94
  }
86
95
 
96
+ request[:name] = name if name != {}
97
+ request[:trusted_metadata] = trusted_metadata if trusted_metadata != {}
98
+ request[:untrusted_metadata] = untrusted_metadata if untrusted_metadata != {}
99
+
87
100
  request[:md_5_config] = md_5_config unless md_5_config != {}
88
101
  request[:argon_2_config] = argon_2_config unless argon_2_config != {}
89
102
  request[:sha_1_config] = sha_1_config unless sha_1_config != {}
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Stytch
4
- VERSION = '4.3.1'
4
+ VERSION = '4.5.0'
5
5
  end
data/lib/stytch.rb CHANGED
@@ -3,8 +3,10 @@
3
3
  require 'faraday'
4
4
  require 'faraday_middleware'
5
5
 
6
+ require_relative 'stytch/b2b_client'
6
7
  require_relative 'stytch/client'
7
8
  require_relative 'stytch/middleware'
8
9
  require_relative 'stytch/version'
9
10
 
10
11
  module Stytch end
12
+ module StytchB2B end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: stytch
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.1
4
+ version: 4.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - stytch
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-03-13 00:00:00.000000000 Z
11
+ date: 2023-05-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -92,7 +92,7 @@ dependencies:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
94
  version: 3.11.0
95
- description:
95
+ description:
96
96
  email:
97
97
  - support@stytch.com
98
98
  executables: []
@@ -113,6 +113,13 @@ files:
113
113
  - bin/console
114
114
  - bin/setup
115
115
  - lib/stytch.rb
116
+ - lib/stytch/b2b_client.rb
117
+ - lib/stytch/b2b_discovery.rb
118
+ - lib/stytch/b2b_magic_links.rb
119
+ - lib/stytch/b2b_organizations.rb
120
+ - lib/stytch/b2b_passwords.rb
121
+ - lib/stytch/b2b_sessions.rb
122
+ - lib/stytch/b2b_sso.rb
116
123
  - lib/stytch/client.rb
117
124
  - lib/stytch/crypto_wallets.rb
118
125
  - lib/stytch/errors.rb
@@ -134,7 +141,7 @@ licenses:
134
141
  metadata:
135
142
  homepage_uri: https://stytch.com
136
143
  source_code_uri: https://github.com/stytchauth/stytch-ruby
137
- post_install_message:
144
+ post_install_message:
138
145
  rdoc_options: []
139
146
  require_paths:
140
147
  - lib
@@ -149,8 +156,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
149
156
  - !ruby/object:Gem::Version
150
157
  version: '0'
151
158
  requirements: []
152
- rubygems_version: 3.0.3.1
153
- signing_key:
159
+ rubygems_version: 3.2.3
160
+ signing_key:
154
161
  specification_version: 4
155
162
  summary: Stytch Ruby Gem
156
163
  test_files: []