From 925013622e55f14138164fa36648f1026830c3aa Mon Sep 17 00:00:00 2001 From: "workos-sdk-automation[bot]" <255426317+workos-sdk-automation[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 15:36:46 +0000 Subject: [PATCH 1/2] chore(generated): regenerate shared files for UserManagement, Radar --- .last-synced-sha | 2 +- .oagen-manifest.json | 9 +- lib/workos/user_management.rb | 99 ++++++++++++++++++- ...end_magic_auth_code_and_return_response.rb | 27 ++++- .../user_management/user_create_response.rb | 56 ++++++++++- ...nd_magic_auth_code_and_return_response.rbi | 48 +++++++++ rbi/workos/user_create_response.rbi | 84 ++++++++++++++++ test/workos/test_user_management.rb | 30 ++++++ .../test_user_management_model_round_trip.rb | 39 ++++++++ 9 files changed, 387 insertions(+), 7 deletions(-) diff --git a/.last-synced-sha b/.last-synced-sha index 639e2e87..509956d7 100644 --- a/.last-synced-sha +++ b/.last-synced-sha @@ -1 +1 @@ -4b4e0618779460dbebc1cf5e0f02197c21796d1f +23faa38318d596e581656934ed72c4a18476d742 diff --git a/.oagen-manifest.json b/.oagen-manifest.json index f351ee7a..834b96ec 100644 --- a/.oagen-manifest.json +++ b/.oagen-manifest.json @@ -1,7 +1,6 @@ { "version": 2, "language": "ruby", - "generatedAt": "2026-07-02T17:29:49.181Z", "files": [ "lib/workos.rb", "lib/workos/admin_portal.rb", @@ -2057,6 +2056,14 @@ "PUT /user_management/users/{user_id}/connected_accounts/{slug}": { "sdkMethod": "update_user_connected_account", "service": "pipes" + }, + "POST /user_management/authenticate#RadarEmailChallengeCodeSessionAuthenticateRequest": { + "sdkMethod": "authenticate_with_radar_email_challenge", + "service": "user_management" + }, + "POST /user_management/authenticate#RadarSmsChallengeCodeSessionAuthenticateRequest": { + "sdkMethod": "authenticate_with_radar_sms_challenge", + "service": "user_management" } } } diff --git a/lib/workos/user_management.rb b/lib/workos/user_management.rb index 6f6705f9..43b467c8 100644 --- a/lib/workos/user_management.rb +++ b/lib/workos/user_management.rb @@ -133,6 +133,8 @@ def create_authenticate( # @param ip_address [String, nil] # @param device_id [String, nil] # @param user_agent [String, nil] + # @param signals_id [String, nil] + # @param radar_auth_attempt_id [String, nil] # @param request_options [Hash] Per-request overrides. # @return [WorkOS::AuthenticateResponse] def authenticate_with_password( @@ -142,6 +144,8 @@ def authenticate_with_password( ip_address: nil, device_id: nil, user_agent: nil, + signals_id: nil, + radar_auth_attempt_id: nil, request_options: {} ) body = { @@ -153,7 +157,9 @@ def authenticate_with_password( "invitation_token" => invitation_token, "ip_address" => ip_address, "device_id" => device_id, - "user_agent" => user_agent + "user_agent" => user_agent, + "signals_id" => signals_id, + "radar_auth_attempt_id" => radar_auth_attempt_id }.compact response = @client.request( method: :post, @@ -172,6 +178,7 @@ def authenticate_with_password( # @param ip_address [String, nil] # @param device_id [String, nil] # @param user_agent [String, nil] + # @param signals_id [String, nil] # @param request_options [Hash] Per-request overrides. # @return [WorkOS::AuthenticateResponse] def authenticate_with_code( @@ -181,6 +188,7 @@ def authenticate_with_code( ip_address: nil, device_id: nil, user_agent: nil, + signals_id: nil, request_options: {} ) body = { @@ -192,7 +200,8 @@ def authenticate_with_code( "invitation_token" => invitation_token, "ip_address" => ip_address, "device_id" => device_id, - "user_agent" => user_agent + "user_agent" => user_agent, + "signals_id" => signals_id }.compact response = @client.request( method: :post, @@ -247,6 +256,7 @@ def authenticate_with_refresh_token( # @param ip_address [String, nil] # @param device_id [String, nil] # @param user_agent [String, nil] + # @param radar_auth_attempt_id [String, nil] # @param request_options [Hash] Per-request overrides. # @return [WorkOS::AuthenticateResponse] def authenticate_with_magic_auth( @@ -256,6 +266,7 @@ def authenticate_with_magic_auth( ip_address: nil, device_id: nil, user_agent: nil, + radar_auth_attempt_id: nil, request_options: {} ) body = { @@ -267,7 +278,8 @@ def authenticate_with_magic_auth( "invitation_token" => invitation_token, "ip_address" => ip_address, "device_id" => device_id, - "user_agent" => user_agent + "user_agent" => user_agent, + "radar_auth_attempt_id" => radar_auth_attempt_id }.compact response = @client.request( method: :post, @@ -422,6 +434,87 @@ def authenticate_with_device_code( WorkOS::AuthenticateResponse.new(response.body) end + # Authenticate with radar email challenge. + # @param code [String] + # @param radar_challenge_id [String] + # @param pending_authentication_token [String] + # @param ip_address [String, nil] + # @param device_id [String, nil] + # @param user_agent [String, nil] + # @param request_options [Hash] Per-request overrides. + # @return [WorkOS::AuthenticateResponse] + def authenticate_with_radar_email_challenge( + code:, + radar_challenge_id:, + pending_authentication_token:, + ip_address: nil, + device_id: nil, + user_agent: nil, + request_options: {} + ) + body = { + "grant_type" => "urn:workos:oauth:grant-type:radar-email-challenge:code", + "client_id" => @client.client_id, + "client_secret" => @client.api_key, + "code" => code, + "radar_challenge_id" => radar_challenge_id, + "pending_authentication_token" => pending_authentication_token, + "ip_address" => ip_address, + "device_id" => device_id, + "user_agent" => user_agent + }.compact + response = @client.request( + method: :post, + path: "/user_management/authenticate", + auth: true, + body: body, + request_options: request_options + ) + WorkOS::AuthenticateResponse.new(response.body) + end + + # Authenticate with radar sms challenge. + # @param code [String] + # @param verification_id [String] + # @param phone_number [String] + # @param pending_authentication_token [String] + # @param ip_address [String, nil] + # @param device_id [String, nil] + # @param user_agent [String, nil] + # @param request_options [Hash] Per-request overrides. + # @return [WorkOS::AuthenticateResponse] + def authenticate_with_radar_sms_challenge( + code:, + verification_id:, + phone_number:, + pending_authentication_token:, + ip_address: nil, + device_id: nil, + user_agent: nil, + request_options: {} + ) + body = { + "grant_type" => "urn:workos:oauth:grant-type:radar-sms-challenge:code", + "client_id" => @client.client_id, + "client_secret" => @client.api_key, + "code" => code, + "verification_id" => verification_id, + "phone_number" => phone_number, + "pending_authentication_token" => pending_authentication_token, + "ip_address" => ip_address, + "device_id" => device_id, + "user_agent" => user_agent + }.compact + response = @client.request( + method: :post, + path: "/user_management/authenticate", + auth: true, + body: body, + request_options: request_options + ) + WorkOS::AuthenticateResponse.new(response.body) + end + # Get device authorization URL # @param client_id [String] The WorkOS client ID for your application. # @param request_options [Hash] (see WorkOS::Types::RequestOptions) diff --git a/lib/workos/user_management/magic_auth_send_magic_auth_code_and_return_response.rb b/lib/workos/user_management/magic_auth_send_magic_auth_code_and_return_response.rb index c721a1e6..6695cfa6 100644 --- a/lib/workos/user_management/magic_auth_send_magic_auth_code_and_return_response.rb +++ b/lib/workos/user_management/magic_auth_send_magic_auth_code_and_return_response.rb @@ -5,13 +5,38 @@ module WorkOS class MagicAuthSendMagicAuthCodeAndReturnResponse < WorkOS::Types::BaseModel HASH_ATTRS = { + object: :object, + id: :id, + user_id: :user_id, + email: :email, + expires_at: :expires_at, + created_at: :created_at, + updated_at: :updated_at, + code: :code, radar_auth_attempt_id: :radar_auth_attempt_id }.freeze - attr_accessor :radar_auth_attempt_id + attr_accessor \ + :object, + :id, + :user_id, + :email, + :expires_at, + :created_at, + :updated_at, + :code, + :radar_auth_attempt_id def initialize(json) hash = self.class.normalize(json) + @object = hash[:object] + @id = hash[:id] + @user_id = hash[:user_id] + @email = hash[:email] + @expires_at = hash[:expires_at] + @created_at = hash[:created_at] + @updated_at = hash[:updated_at] + @code = hash[:code] @radar_auth_attempt_id = hash[:radar_auth_attempt_id] end end diff --git a/lib/workos/user_management/user_create_response.rb b/lib/workos/user_management/user_create_response.rb index 83c97def..46d229b4 100644 --- a/lib/workos/user_management/user_create_response.rb +++ b/lib/workos/user_management/user_create_response.rb @@ -3,5 +3,59 @@ # This file is auto-generated by oagen. Do not edit. module WorkOS - UserCreateResponse = MagicAuthSendMagicAuthCodeAndReturnResponse + class UserCreateResponse < WorkOS::Types::BaseModel + HASH_ATTRS = { + object: :object, + id: :id, + first_name: :first_name, + last_name: :last_name, + name: :name, + profile_picture_url: :profile_picture_url, + email: :email, + email_verified: :email_verified, + external_id: :external_id, + metadata: :metadata, + last_sign_in_at: :last_sign_in_at, + locale: :locale, + created_at: :created_at, + updated_at: :updated_at, + radar_auth_attempt_id: :radar_auth_attempt_id + }.freeze + + attr_accessor \ + :object, + :id, + :first_name, + :last_name, + :name, + :profile_picture_url, + :email, + :email_verified, + :external_id, + :metadata, + :last_sign_in_at, + :locale, + :created_at, + :updated_at, + :radar_auth_attempt_id + + def initialize(json) + hash = self.class.normalize(json) + @object = hash[:object] + @id = hash[:id] + @first_name = hash[:first_name] + @last_name = hash[:last_name] + @name = hash[:name] + @profile_picture_url = hash[:profile_picture_url] + @email = hash[:email] + @email_verified = hash[:email_verified] + @external_id = hash[:external_id] + @metadata = hash[:metadata] || {} + @last_sign_in_at = hash[:last_sign_in_at] + @locale = hash[:locale] + @created_at = hash[:created_at] + @updated_at = hash[:updated_at] + @radar_auth_attempt_id = hash[:radar_auth_attempt_id] + end + end end diff --git a/rbi/workos/magic_auth_send_magic_auth_code_and_return_response.rbi b/rbi/workos/magic_auth_send_magic_auth_code_and_return_response.rbi index 8b746ee1..8260b82d 100644 --- a/rbi/workos/magic_auth_send_magic_auth_code_and_return_response.rbi +++ b/rbi/workos/magic_auth_send_magic_auth_code_and_return_response.rbi @@ -9,6 +9,54 @@ module WorkOS sig { params(json: T.any(String, T::Hash[Symbol, T.untyped])).void } def initialize(json); end + sig { returns(String) } + def object; end + + sig { params(value: String).returns(String) } + def object=(value); end + + sig { returns(String) } + def id; end + + sig { params(value: String).returns(String) } + def id=(value); end + + sig { returns(String) } + def user_id; end + + sig { params(value: String).returns(String) } + def user_id=(value); end + + sig { returns(String) } + def email; end + + sig { params(value: String).returns(String) } + def email=(value); end + + sig { returns(String) } + def expires_at; end + + sig { params(value: String).returns(String) } + def expires_at=(value); end + + sig { returns(String) } + def created_at; end + + sig { params(value: String).returns(String) } + def created_at=(value); end + + sig { returns(String) } + def updated_at; end + + sig { params(value: String).returns(String) } + def updated_at=(value); end + + sig { returns(String) } + def code; end + + sig { params(value: String).returns(String) } + def code=(value); end + sig { returns(T.nilable(String)) } def radar_auth_attempt_id; end diff --git a/rbi/workos/user_create_response.rbi b/rbi/workos/user_create_response.rbi index 727fd387..629461ab 100644 --- a/rbi/workos/user_create_response.rbi +++ b/rbi/workos/user_create_response.rbi @@ -9,6 +9,90 @@ module WorkOS sig { params(json: T.any(String, T::Hash[Symbol, T.untyped])).void } def initialize(json); end + sig { returns(String) } + def object; end + + sig { params(value: String).returns(String) } + def object=(value); end + + sig { returns(String) } + def id; end + + sig { params(value: String).returns(String) } + def id=(value); end + + sig { returns(T.nilable(String)) } + def first_name; end + + sig { params(value: T.nilable(String)).returns(T.nilable(String)) } + def first_name=(value); end + + sig { returns(T.nilable(String)) } + def last_name; end + + sig { params(value: T.nilable(String)).returns(T.nilable(String)) } + def last_name=(value); end + + sig { returns(T.nilable(String)) } + def name; end + + sig { params(value: T.nilable(String)).returns(T.nilable(String)) } + def name=(value); end + + sig { returns(T.nilable(String)) } + def profile_picture_url; end + + sig { params(value: T.nilable(String)).returns(T.nilable(String)) } + def profile_picture_url=(value); end + + sig { returns(String) } + def email; end + + sig { params(value: String).returns(String) } + def email=(value); end + + sig { returns(T::Boolean) } + def email_verified; end + + sig { params(value: T::Boolean).returns(T::Boolean) } + def email_verified=(value); end + + sig { returns(T.nilable(String)) } + def external_id; end + + sig { params(value: T.nilable(String)).returns(T.nilable(String)) } + def external_id=(value); end + + sig { returns(T.nilable(T::Hash[String, String])) } + def metadata; end + + sig { params(value: T.nilable(T::Hash[String, String])).returns(T.nilable(T::Hash[String, String])) } + def metadata=(value); end + + sig { returns(T.nilable(String)) } + def last_sign_in_at; end + + sig { params(value: T.nilable(String)).returns(T.nilable(String)) } + def last_sign_in_at=(value); end + + sig { returns(T.nilable(String)) } + def locale; end + + sig { params(value: T.nilable(String)).returns(T.nilable(String)) } + def locale=(value); end + + sig { returns(String) } + def created_at; end + + sig { params(value: String).returns(String) } + def created_at=(value); end + + sig { returns(String) } + def updated_at; end + + sig { params(value: String).returns(String) } + def updated_at=(value); end + sig { returns(T.nilable(String)) } def radar_auth_attempt_id; end diff --git a/test/workos/test_user_management.rb b/test/workos/test_user_management.rb index f5cef36b..4cefa80a 100644 --- a/test/workos/test_user_management.rb +++ b/test/workos/test_user_management.rb @@ -145,6 +145,36 @@ def test_authenticate_with_device_code_raises_authentication_error_on_401 end end + def test_authenticate_with_radar_email_challenge_returns_expected_result + stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/authenticate(\?|\z)}) + .to_return(body: "{}", status: 200) + result = @client.user_management.authenticate_with_radar_email_challenge(code: "stub", radar_challenge_id: "stub", pending_authentication_token: "stub") + refute_nil result + end + + def test_authenticate_with_radar_email_challenge_raises_authentication_error_on_401 + stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/authenticate(\?|\z)}) + .to_return(body: '{"message": "Unauthorized"}', status: 401) + assert_raises(WorkOS::AuthenticationError) do + @client.user_management.authenticate_with_radar_email_challenge(code: "stub", radar_challenge_id: "stub", pending_authentication_token: "stub") + end + end + + def test_authenticate_with_radar_sms_challenge_returns_expected_result + stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/authenticate(\?|\z)}) + .to_return(body: "{}", status: 200) + result = @client.user_management.authenticate_with_radar_sms_challenge(code: "stub", verification_id: "stub", phone_number: "stub", pending_authentication_token: "stub") + refute_nil result + end + + def test_authenticate_with_radar_sms_challenge_raises_authentication_error_on_401 + stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/authenticate(\?|\z)}) + .to_return(body: '{"message": "Unauthorized"}', status: 401) + assert_raises(WorkOS::AuthenticationError) do + @client.user_management.authenticate_with_radar_sms_challenge(code: "stub", verification_id: "stub", phone_number: "stub", pending_authentication_token: "stub") + end + end + def test_create_device_returns_expected_result stub_request(:post, %r{\Ahttps://api\.workos\.com/user_management/authorize/device(\?|\z)}) .to_return(body: "{}", status: 200) diff --git a/test/workos/test_user_management_model_round_trip.rb b/test/workos/test_user_management_model_round_trip.rb index fdcb6a21..4d1eb3da 100644 --- a/test/workos/test_user_management_model_round_trip.rb +++ b/test/workos/test_user_management_model_round_trip.rb @@ -928,21 +928,60 @@ def test_invitation_round_trip def test_magic_auth_send_magic_auth_code_and_return_response_round_trip fixture = { + "object" => "magic_auth", + "id" => "stub", + "user_id" => "stub", + "email" => "stub", + "expires_at" => "stub", + "created_at" => "stub", + "updated_at" => "stub", + "code" => "stub", "radar_auth_attempt_id" => "stub" } model = WorkOS::MagicAuthSendMagicAuthCodeAndReturnResponse.new(fixture.to_json) json = model.to_h assert_kind_of Hash, json + assert_equal fixture["id"], json[:id] + assert_equal fixture["user_id"], json[:user_id] + assert_equal fixture["email"], json[:email] + assert_equal fixture["expires_at"], json[:expires_at] + assert_equal fixture["created_at"], json[:created_at] + assert_equal fixture["updated_at"], json[:updated_at] + assert_equal fixture["code"], json[:code] fixture.each_key { |k| assert json.key?(k.to_sym) || json.key?(k), "Expected to_h to include key #{k}" } end def test_user_create_response_round_trip fixture = { + "object" => "user", + "id" => "stub", + "first_name" => nil, + "last_name" => nil, + "name" => nil, + "profile_picture_url" => nil, + "email" => "stub", + "email_verified" => true, + "external_id" => nil, + "metadata" => {}, + "last_sign_in_at" => nil, + "locale" => nil, + "created_at" => "stub", + "updated_at" => "stub", "radar_auth_attempt_id" => "stub" } model = WorkOS::UserCreateResponse.new(fixture.to_json) json = model.to_h assert_kind_of Hash, json + assert_equal fixture["id"], json[:id] + assert_nil json[:first_name] + assert_nil json[:last_name] + assert_nil json[:profile_picture_url] + assert_equal fixture["email"], json[:email] + assert_equal fixture["email_verified"], json[:email_verified] + assert_nil json[:external_id] + assert_nil json[:last_sign_in_at] + assert_equal fixture["created_at"], json[:created_at] + assert_equal fixture["updated_at"], json[:updated_at] fixture.each_key { |k| assert json.key?(k.to_sym) || json.key?(k), "Expected to_h to include key #{k}" } end From 33f83dc08fec77b0fdba999d1ea45ed33be8adc7 Mon Sep 17 00:00:00 2001 From: "workos-sdk-automation[bot]" <255426317+workos-sdk-automation[bot]@users.noreply.github.com> Date: Mon, 6 Jul 2026 15:36:50 +0000 Subject: [PATCH 2/2] chore(generated): add release notes fragment --- ...6-50-a2c464df57c9c25ad289cf11417e5df4ada5c726.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .changelog-pending/2026-07-06T15-36-50-a2c464df57c9c25ad289cf11417e5df4ada5c726.md diff --git a/.changelog-pending/2026-07-06T15-36-50-a2c464df57c9c25ad289cf11417e5df4ada5c726.md b/.changelog-pending/2026-07-06T15-36-50-a2c464df57c9c25ad289cf11417e5df4ada5c726.md new file mode 100644 index 00000000..e8865202 --- /dev/null +++ b/.changelog-pending/2026-07-06T15-36-50-a2c464df57c9c25ad289cf11417e5df4ada5c726.md @@ -0,0 +1,13 @@ +* [#514](https://github.com/workos/workos-ruby/pull/514) fix(generated): regenerate from spec + + **Features** + * **[user_management](https://workos.com/docs/reference/authkit/user)**: + * Added model `UserRoleAssignmentSource` + * Added `source` to `UserRoleAssignment` + * Added enum `UserRoleAssignmentSourceType` + * Added parameter `UserManagementAuthentication.authorize.max_age` + * Added endpoint `GET /user_management/cors_origins` + * Added endpoint `GET /user_management/redirect_uris` + + **Fixes** + * Restore mistakenly removed CreateMagicAuth logic from previous release