descope 1.0.4
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 +7 -0
- data/.github/workflows/ci.yaml +54 -0
- data/.gitignore +59 -0
- data/.release-please-manifest.json +3 -0
- data/.rubocop.yml +10 -0
- data/.rubocop_todo.yml +10 -0
- data/.ruby-version +1 -0
- data/CHANGELOG.md +90 -0
- data/Gemfile +22 -0
- data/Gemfile.lock +204 -0
- data/LICENSE +21 -0
- data/README.md +1171 -0
- data/Rakefile +31 -0
- data/descope.gemspec +34 -0
- data/examples/ruby/Gemfile +4 -0
- data/examples/ruby/Gemfile.lock +41 -0
- data/examples/ruby/access_key_app.rb +45 -0
- data/examples/ruby/enchantedlink_app.rb +65 -0
- data/examples/ruby/magiclink_app.rb +81 -0
- data/examples/ruby/management/Gemfile +5 -0
- data/examples/ruby/management/Gemfile.lock +38 -0
- data/examples/ruby/management/access_key_app.rb +71 -0
- data/examples/ruby/management/audit_app.rb +25 -0
- data/examples/ruby/management/authz_app.rb +135 -0
- data/examples/ruby/management/authz_files.json +229 -0
- data/examples/ruby/management/flow_app.rb +57 -0
- data/examples/ruby/management/permission_app.rb +56 -0
- data/examples/ruby/management/role_app.rb +58 -0
- data/examples/ruby/management/tenant_app.rb +60 -0
- data/examples/ruby/management/user_app.rb +60 -0
- data/examples/ruby/oauth_app.rb +39 -0
- data/examples/ruby/otp_app.rb +50 -0
- data/examples/ruby/password_app.rb +76 -0
- data/examples/ruby/saml_app.rb +38 -0
- data/examples/ruby-on-rails-api/descope/.dockerignore +37 -0
- data/examples/ruby-on-rails-api/descope/.gitattributes +9 -0
- data/examples/ruby-on-rails-api/descope/.gitignore +40 -0
- data/examples/ruby-on-rails-api/descope/.node-version +1 -0
- data/examples/ruby-on-rails-api/descope/.ruby-version +1 -0
- data/examples/ruby-on-rails-api/descope/Dockerfile +75 -0
- data/examples/ruby-on-rails-api/descope/Gemfile +67 -0
- data/examples/ruby-on-rails-api/descope/Gemfile.lock +284 -0
- data/examples/ruby-on-rails-api/descope/Procfile.dev +3 -0
- data/examples/ruby-on-rails-api/descope/README.md +54 -0
- data/examples/ruby-on-rails-api/descope/Rakefile +6 -0
- data/examples/ruby-on-rails-api/descope/app/assets/builds/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/app/assets/config/manifest.js +3 -0
- data/examples/ruby-on-rails-api/descope/app/assets/images/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/app/assets/images/descope.jpeg +0 -0
- data/examples/ruby-on-rails-api/descope/app/assets/images/favicon.ico +0 -0
- data/examples/ruby-on-rails-api/descope/app/assets/images/logo192.png +0 -0
- data/examples/ruby-on-rails-api/descope/app/assets/images/logo512.png +0 -0
- data/examples/ruby-on-rails-api/descope/app/assets/stylesheets/application.bootstrap.scss +67 -0
- data/examples/ruby-on-rails-api/descope/app/channels/application_cable/channel.rb +4 -0
- data/examples/ruby-on-rails-api/descope/app/channels/application_cable/connection.rb +4 -0
- data/examples/ruby-on-rails-api/descope/app/controllers/application_controller.rb +2 -0
- data/examples/ruby-on-rails-api/descope/app/controllers/concerns/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/app/controllers/homepage_controller.rb +4 -0
- data/examples/ruby-on-rails-api/descope/app/controllers/session_controller.rb +66 -0
- data/examples/ruby-on-rails-api/descope/app/helpers/application_helper.rb +2 -0
- data/examples/ruby-on-rails-api/descope/app/helpers/homepage_helper.rb +2 -0
- data/examples/ruby-on-rails-api/descope/app/helpers/session_helper.rb +2 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/App.css +53 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/application.js +5 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/components/App.jsx +4 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/components/Dashboard.jsx +60 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/components/Home.jsx +27 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/components/Login.jsx +45 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/components/Profile.jsx +81 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/components/index.html +11 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/components/index.jsx +24 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/controllers/application.js +9 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/controllers/index.js +5 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/reportWebVitals.js +13 -0
- data/examples/ruby-on-rails-api/descope/app/javascript/routes/index.jsx +17 -0
- data/examples/ruby-on-rails-api/descope/app/jobs/application_job.rb +7 -0
- data/examples/ruby-on-rails-api/descope/app/mailers/application_mailer.rb +4 -0
- data/examples/ruby-on-rails-api/descope/app/models/application_record.rb +3 -0
- data/examples/ruby-on-rails-api/descope/app/models/concerns/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/app/views/homepage/index.html.erb +2 -0
- data/examples/ruby-on-rails-api/descope/app/views/layouts/application.html.erb +16 -0
- data/examples/ruby-on-rails-api/descope/app/views/layouts/mailer.html.erb +13 -0
- data/examples/ruby-on-rails-api/descope/app/views/layouts/mailer.text.erb +1 -0
- data/examples/ruby-on-rails-api/descope/app/views/session/index.html.erb +2 -0
- data/examples/ruby-on-rails-api/descope/bin/bundle +109 -0
- data/examples/ruby-on-rails-api/descope/bin/dev +11 -0
- data/examples/ruby-on-rails-api/descope/bin/docker-entrypoint +8 -0
- data/examples/ruby-on-rails-api/descope/bin/rails +4 -0
- data/examples/ruby-on-rails-api/descope/bin/rake +4 -0
- data/examples/ruby-on-rails-api/descope/bin/setup +36 -0
- data/examples/ruby-on-rails-api/descope/build.js +30 -0
- data/examples/ruby-on-rails-api/descope/config/application.rb +42 -0
- data/examples/ruby-on-rails-api/descope/config/boot.rb +4 -0
- data/examples/ruby-on-rails-api/descope/config/cable.yml +10 -0
- data/examples/ruby-on-rails-api/descope/config/config.yml +9 -0
- data/examples/ruby-on-rails-api/descope/config/credentials.yml.enc +1 -0
- data/examples/ruby-on-rails-api/descope/config/database.yml +25 -0
- data/examples/ruby-on-rails-api/descope/config/environment.rb +5 -0
- data/examples/ruby-on-rails-api/descope/config/environments/development.rb +76 -0
- data/examples/ruby-on-rails-api/descope/config/environments/production.rb +97 -0
- data/examples/ruby-on-rails-api/descope/config/environments/test.rb +64 -0
- data/examples/ruby-on-rails-api/descope/config/initializers/assets.rb +13 -0
- data/examples/ruby-on-rails-api/descope/config/initializers/content_security_policy.rb +25 -0
- data/examples/ruby-on-rails-api/descope/config/initializers/filter_parameter_logging.rb +8 -0
- data/examples/ruby-on-rails-api/descope/config/initializers/inflections.rb +16 -0
- data/examples/ruby-on-rails-api/descope/config/initializers/load_config.rb +12 -0
- data/examples/ruby-on-rails-api/descope/config/initializers/permissions_policy.rb +13 -0
- data/examples/ruby-on-rails-api/descope/config/locales/en.yml +31 -0
- data/examples/ruby-on-rails-api/descope/config/puma.rb +35 -0
- data/examples/ruby-on-rails-api/descope/config/routes.rb +18 -0
- data/examples/ruby-on-rails-api/descope/config/storage.yml +34 -0
- data/examples/ruby-on-rails-api/descope/config.ru +6 -0
- data/examples/ruby-on-rails-api/descope/db/seeds.rb +9 -0
- data/examples/ruby-on-rails-api/descope/lib/assets/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/lib/tasks/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/log/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/package-lock.json +19680 -0
- data/examples/ruby-on-rails-api/descope/package.json +51 -0
- data/examples/ruby-on-rails-api/descope/public/404.html +67 -0
- data/examples/ruby-on-rails-api/descope/public/422.html +67 -0
- data/examples/ruby-on-rails-api/descope/public/500.html +66 -0
- data/examples/ruby-on-rails-api/descope/public/apple-touch-icon-precomposed.png +0 -0
- data/examples/ruby-on-rails-api/descope/public/apple-touch-icon.png +0 -0
- data/examples/ruby-on-rails-api/descope/public/favicon.ico +0 -0
- data/examples/ruby-on-rails-api/descope/public/robots.txt +1 -0
- data/examples/ruby-on-rails-api/descope/storage/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/tmp/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/tmp/pids/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/tmp/storage/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/vendor/.keep +0 -0
- data/examples/ruby-on-rails-api/descope/yarn.lock +10780 -0
- data/lib/descope/api/v1/auth/enchantedlink.rb +156 -0
- data/lib/descope/api/v1/auth/magiclink.rb +170 -0
- data/lib/descope/api/v1/auth/oauth.rb +72 -0
- data/lib/descope/api/v1/auth/otp.rb +186 -0
- data/lib/descope/api/v1/auth/password.rb +100 -0
- data/lib/descope/api/v1/auth/saml.rb +48 -0
- data/lib/descope/api/v1/auth/totp.rb +72 -0
- data/lib/descope/api/v1/auth.rb +452 -0
- data/lib/descope/api/v1/management/access_key.rb +81 -0
- data/lib/descope/api/v1/management/audit.rb +82 -0
- data/lib/descope/api/v1/management/authz.rb +165 -0
- data/lib/descope/api/v1/management/common.rb +147 -0
- data/lib/descope/api/v1/management/flow.rb +55 -0
- data/lib/descope/api/v1/management/password.rb +58 -0
- data/lib/descope/api/v1/management/permission.rb +48 -0
- data/lib/descope/api/v1/management/project.rb +53 -0
- data/lib/descope/api/v1/management/role.rb +48 -0
- data/lib/descope/api/v1/management/scim.rb +206 -0
- data/lib/descope/api/v1/management/sso_settings.rb +153 -0
- data/lib/descope/api/v1/management/tenant.rb +71 -0
- data/lib/descope/api/v1/management/user.rb +619 -0
- data/lib/descope/api/v1/management.rb +38 -0
- data/lib/descope/api/v1/session.rb +84 -0
- data/lib/descope/api/v1.rb +13 -0
- data/lib/descope/client.rb +6 -0
- data/lib/descope/exception.rb +50 -0
- data/lib/descope/mixins/common.rb +129 -0
- data/lib/descope/mixins/headers.rb +15 -0
- data/lib/descope/mixins/http.rb +133 -0
- data/lib/descope/mixins/initializer.rb +80 -0
- data/lib/descope/mixins/logging.rb +30 -0
- data/lib/descope/mixins/validation.rb +79 -0
- data/lib/descope/mixins.rb +22 -0
- data/lib/descope/version.rb +7 -0
- data/lib/descope.rb +9 -0
- data/lib/descope_client.rb +5 -0
- data/release-please-config.json +18 -0
- data/renovate.json +6 -0
- data/spec/factories/user.rb +16 -0
- data/spec/lib.descope/api/v1/auth/enchantedlink_spec.rb +159 -0
- data/spec/lib.descope/api/v1/auth/magiclink_spec.rb +282 -0
- data/spec/lib.descope/api/v1/auth/oauth_spec.rb +117 -0
- data/spec/lib.descope/api/v1/auth/otp_spec.rb +285 -0
- data/spec/lib.descope/api/v1/auth/password_spec.rb +124 -0
- data/spec/lib.descope/api/v1/auth/saml_spec.rb +55 -0
- data/spec/lib.descope/api/v1/auth/totp_spec.rb +70 -0
- data/spec/lib.descope/api/v1/auth_spec.rb +372 -0
- data/spec/lib.descope/api/v1/management/access_key_spec.rb +118 -0
- data/spec/lib.descope/api/v1/management/audit_spec.rb +78 -0
- data/spec/lib.descope/api/v1/management/authz_spec.rb +336 -0
- data/spec/lib.descope/api/v1/management/flow_spec.rb +78 -0
- data/spec/lib.descope/api/v1/management/password_spec.rb +25 -0
- data/spec/lib.descope/api/v1/management/permission_spec.rb +81 -0
- data/spec/lib.descope/api/v1/management/project_spec.rb +63 -0
- data/spec/lib.descope/api/v1/management/role_spec.rb +85 -0
- data/spec/lib.descope/api/v1/management/scim_spec.rb +312 -0
- data/spec/lib.descope/api/v1/management/sso_settings_spec.rb +172 -0
- data/spec/lib.descope/api/v1/management/tenant_spec.rb +141 -0
- data/spec/lib.descope/api/v1/management/user_spec.rb +667 -0
- data/spec/lib.descope/api/v1/session_spec.rb +117 -0
- data/spec/lib.descope/client_spec.rb +40 -0
- data/spec/spec_helper.rb +72 -0
- data/spec/support/client_config.rb +14 -0
- data/spec/support/dummy_class.rb +36 -0
- data/spec/support/utils.rb +32 -0
- metadata +420 -0
|
@@ -0,0 +1,619 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Descope
|
|
4
|
+
module Api
|
|
5
|
+
module V1
|
|
6
|
+
module Management
|
|
7
|
+
# Management API calls
|
|
8
|
+
module User
|
|
9
|
+
include Descope::Api::V1::Management::Common
|
|
10
|
+
|
|
11
|
+
# Create a new user, using a valid management key.
|
|
12
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/CreateUser/
|
|
13
|
+
# Once the user is created, the user can then login utilizing any sign-in api supported. This will then switch the user from invited to active.
|
|
14
|
+
def create_user(**args)
|
|
15
|
+
@logger.debug("Creating user with args: #{args}")
|
|
16
|
+
user_create(**args)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# Batch Create Users, using a valid management key.
|
|
20
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/CreateUsers/
|
|
21
|
+
def create_batch_users(users = [])
|
|
22
|
+
users_params = []
|
|
23
|
+
users.each do |user|
|
|
24
|
+
users_params.append(user_create(**user.merge(skip_create: true)))
|
|
25
|
+
end
|
|
26
|
+
path = Common::USER_CREATE_BATCH_PATH
|
|
27
|
+
request_params = {
|
|
28
|
+
users: users_params
|
|
29
|
+
}
|
|
30
|
+
post(path, request_params)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Create a new test user.
|
|
34
|
+
# The login_id is required and will determine what the user will use to sign in.
|
|
35
|
+
# Make sure the login id is unique for test. All other fields are optional.
|
|
36
|
+
# @see https://docs.descope.com/api/testusermanagement/
|
|
37
|
+
# Test User Management:
|
|
38
|
+
# 1. Create test Users
|
|
39
|
+
# 2. Generate OTP (sms/email) for test users
|
|
40
|
+
# 3. Generate Magic Link (sms/email) for test users
|
|
41
|
+
# 4. Generate Enchanted Link (email) for test users
|
|
42
|
+
# 5. Delete Test Users
|
|
43
|
+
def create_test_user(**args)
|
|
44
|
+
args[:test] = true
|
|
45
|
+
user_create(**args)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# Create a new user and invite them via an email message.
|
|
49
|
+
#
|
|
50
|
+
# Functions exactly the same as the `create` function with the additional invitation
|
|
51
|
+
# behavior. See the documentation above for the general creation behavior.
|
|
52
|
+
#
|
|
53
|
+
# IMPORTANT: Since the invitation is sent by email, make sure either
|
|
54
|
+
# the email is explicitly set, or the login_id itself is an email address.
|
|
55
|
+
# You must configure the invitation URL in the Descope console prior to
|
|
56
|
+
# calling the method.
|
|
57
|
+
def invite_user(**args)
|
|
58
|
+
args[:invite] = true
|
|
59
|
+
user_create(**args)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Updates a user's details, using a valid management key.
|
|
63
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/UpdateUser/
|
|
64
|
+
def update_user(
|
|
65
|
+
login_id: nil,
|
|
66
|
+
email: nil,
|
|
67
|
+
phone: nil,
|
|
68
|
+
name: nil,
|
|
69
|
+
given_name: nil,
|
|
70
|
+
middle_name: nil,
|
|
71
|
+
family_name: nil,
|
|
72
|
+
role_names: [],
|
|
73
|
+
user_tenants: [],
|
|
74
|
+
picture: nil,
|
|
75
|
+
custom_attributes: nil,
|
|
76
|
+
verified_email: nil,
|
|
77
|
+
verified_phone: nil,
|
|
78
|
+
additional_identifiers: [],
|
|
79
|
+
password: nil,
|
|
80
|
+
hashed_password: {},
|
|
81
|
+
sso_app_ids: []
|
|
82
|
+
)
|
|
83
|
+
role_names ||= []
|
|
84
|
+
user_tenants ||= []
|
|
85
|
+
path = Common::USER_UPDATE_PATH
|
|
86
|
+
request_params = user_compose_update_body(
|
|
87
|
+
login_id:,
|
|
88
|
+
email:,
|
|
89
|
+
phone:,
|
|
90
|
+
name:,
|
|
91
|
+
given_name:,
|
|
92
|
+
middle_name:,
|
|
93
|
+
family_name:,
|
|
94
|
+
role_names:,
|
|
95
|
+
user_tenants:,
|
|
96
|
+
picture:,
|
|
97
|
+
custom_attributes:,
|
|
98
|
+
verified_email:,
|
|
99
|
+
verified_phone:,
|
|
100
|
+
additional_identifiers:,
|
|
101
|
+
password:,
|
|
102
|
+
hashed_password:,
|
|
103
|
+
sso_app_ids:
|
|
104
|
+
)
|
|
105
|
+
post(path, request_params)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
# Delete a user, using a valid management key.
|
|
109
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/DeleteUser/
|
|
110
|
+
def delete_user(login_id = nil)
|
|
111
|
+
validate_login_id(login_id)
|
|
112
|
+
path = Common::USER_DELETE_PATH
|
|
113
|
+
request_params = {
|
|
114
|
+
loginId: login_id
|
|
115
|
+
}
|
|
116
|
+
post(path, request_params)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def delete_all_test_users
|
|
120
|
+
path = Common::USER_DELETE_ALL_TEST_USERS_PATH
|
|
121
|
+
delete(path)
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
# Load a user's data, using a valid management key.
|
|
125
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/LoadUser/
|
|
126
|
+
def load_user(login_id)
|
|
127
|
+
@logger.debug("Loading user with login_id: #{login_id}")
|
|
128
|
+
# Retrieve user information based on the provided Login ID
|
|
129
|
+
validate_login_id(login_id)
|
|
130
|
+
|
|
131
|
+
request_params = {
|
|
132
|
+
loginId: login_id
|
|
133
|
+
}
|
|
134
|
+
path = Common::USER_LOAD_PATH
|
|
135
|
+
get(path, request_params)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# Load a user's data, using a valid management key by user id.
|
|
139
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/LoadUser/
|
|
140
|
+
def load_by_user_id(user_id)
|
|
141
|
+
# Retrieve user information based on the provided user ID
|
|
142
|
+
# The user ID can be found on the user's JWT.
|
|
143
|
+
validate_user_id(user_id)
|
|
144
|
+
|
|
145
|
+
path = Common::USER_LOAD_PATH
|
|
146
|
+
request_params = {
|
|
147
|
+
userId: user_id
|
|
148
|
+
}
|
|
149
|
+
get(path, request_params)
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
# Log a user out of all sessions, using a valid management key.
|
|
153
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/LogoutAllUserDevices/
|
|
154
|
+
def logout_user(login_id)
|
|
155
|
+
validate_login_id(login_id)
|
|
156
|
+
path = Common::USER_LOGOUT_PATH
|
|
157
|
+
request_params = {
|
|
158
|
+
loginId: login_id
|
|
159
|
+
}
|
|
160
|
+
post(path, request_params)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def logout_user_by_id(user_id)
|
|
164
|
+
validate_user_id(user_id)
|
|
165
|
+
path = Common::USER_LOGOUT_PATH
|
|
166
|
+
request_params = {
|
|
167
|
+
userId: user_id
|
|
168
|
+
}
|
|
169
|
+
post(path, request_params)
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
# Search for users, using a valid management key.
|
|
173
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/SearchUsers/
|
|
174
|
+
def search_all_users(
|
|
175
|
+
login_id: nil,
|
|
176
|
+
tenant_ids: [],
|
|
177
|
+
role_names: [],
|
|
178
|
+
text: nil,
|
|
179
|
+
limit: 0,
|
|
180
|
+
page: 0,
|
|
181
|
+
sso_only: false,
|
|
182
|
+
test_users_only: false,
|
|
183
|
+
with_test_user: false,
|
|
184
|
+
custom_attributes: {},
|
|
185
|
+
statuses: [],
|
|
186
|
+
emails: [],
|
|
187
|
+
phones: [],
|
|
188
|
+
sso_app_ids: []
|
|
189
|
+
)
|
|
190
|
+
body = {
|
|
191
|
+
loginId: login_id,
|
|
192
|
+
tenantIds: tenant_ids,
|
|
193
|
+
roleNames: role_names,
|
|
194
|
+
ssoOnly: sso_only,
|
|
195
|
+
limit:,
|
|
196
|
+
page:,
|
|
197
|
+
text:,
|
|
198
|
+
testUsersOnly: test_users_only,
|
|
199
|
+
withTestUser: with_test_user,
|
|
200
|
+
ssoAppIds: sso_app_ids,
|
|
201
|
+
}
|
|
202
|
+
body[:statuses] = statuses unless statuses.empty?
|
|
203
|
+
body[:emails] = emails unless emails.empty?
|
|
204
|
+
body[:phones] = phones unless phones.empty?
|
|
205
|
+
body[:customAttributes] = custom_attributes unless custom_attributes.empty?
|
|
206
|
+
body[:limit] = limit unless limit.zero?
|
|
207
|
+
body[:page] = page unless page.zero?
|
|
208
|
+
body[:text] = text unless text.nil?
|
|
209
|
+
body[:testUsersOnly] = test_users_only unless test_users_only.nil?
|
|
210
|
+
body[:withTestUser] = with_test_user unless with_test_user.nil?
|
|
211
|
+
body[:ssoOnly] = sso_only unless sso_only.nil?
|
|
212
|
+
body[:ssoAppIds] = sso_app_ids unless sso_app_ids.empty?
|
|
213
|
+
body[:tenantIds] = tenant_ids unless tenant_ids.empty?
|
|
214
|
+
body[:roleNames] = role_names unless role_names.empty?
|
|
215
|
+
post(Common::USERS_SEARCH_PATH, body)
|
|
216
|
+
end
|
|
217
|
+
|
|
218
|
+
# Get an existing user's provider token, using a valid management key.
|
|
219
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/GetUserProviderToken/
|
|
220
|
+
def get_provider_token(login_id: nil, provider: nil)
|
|
221
|
+
path = Common::USER_GET_PROVIDER_TOKEN
|
|
222
|
+
request_params = {
|
|
223
|
+
loginId: login_id,
|
|
224
|
+
provider: provider
|
|
225
|
+
}
|
|
226
|
+
get(path, request_params)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
# Updates an existing user's status, using a valid management key.
|
|
230
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/UpdateUserStatus/
|
|
231
|
+
def activate(login_id)
|
|
232
|
+
validate_login_id(login_id)
|
|
233
|
+
path = Common::USER_UPDATE_STATUS_PATH
|
|
234
|
+
request_params = {
|
|
235
|
+
loginId: login_id,
|
|
236
|
+
status: 'enabled'
|
|
237
|
+
}
|
|
238
|
+
post(path, request_params)
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
def deactivate(login_id)
|
|
242
|
+
validate_login_id(login_id)
|
|
243
|
+
path = Common::USER_UPDATE_STATUS_PATH
|
|
244
|
+
request_params = {
|
|
245
|
+
loginId: login_id,
|
|
246
|
+
status: 'disabled'
|
|
247
|
+
}
|
|
248
|
+
post(path, request_params)
|
|
249
|
+
end
|
|
250
|
+
|
|
251
|
+
# Updates an existing user's login ID, using a valid management key.
|
|
252
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/UpdateUserLoginID/
|
|
253
|
+
def update_login_id(login_id: nil, new_login_id: nil)
|
|
254
|
+
validate_login_id(login_id)
|
|
255
|
+
path = Common::USER_UPDATE_LOGIN_ID_PATH
|
|
256
|
+
request_params = {
|
|
257
|
+
loginId: login_id,
|
|
258
|
+
newLoginId: new_login_id
|
|
259
|
+
}
|
|
260
|
+
post(path, request_params)
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Updates an existing user's email, using a valid management key.
|
|
264
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/UpdateUserEmail/
|
|
265
|
+
def update_email(login_id: nil, email: nil, verified: true)
|
|
266
|
+
@logger.debug("Updating user's email with login_id: #{login_id} to #{email} verified: #{verified}")
|
|
267
|
+
path = Common::USER_UPDATE_EMAIL_PATH
|
|
268
|
+
request_params = {
|
|
269
|
+
loginId: login_id,
|
|
270
|
+
email:,
|
|
271
|
+
verified:
|
|
272
|
+
}
|
|
273
|
+
post(path, request_params)
|
|
274
|
+
end
|
|
275
|
+
|
|
276
|
+
# Updates an existing user's phone number, using a valid management key.
|
|
277
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/UpdateUserPhone/
|
|
278
|
+
def update_phone(login_id: nil, phone: nil, verified: true)
|
|
279
|
+
path = Common::USER_UPDATE_PHONE_PATH
|
|
280
|
+
request_params = {
|
|
281
|
+
loginId: login_id,
|
|
282
|
+
phone:,
|
|
283
|
+
verified:
|
|
284
|
+
}
|
|
285
|
+
post(path, request_params)
|
|
286
|
+
end
|
|
287
|
+
|
|
288
|
+
# Updates an existing user's display name, using a valid management key.
|
|
289
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/UpdateUserDisplayName/
|
|
290
|
+
def update_display_name(
|
|
291
|
+
login_id: nil,
|
|
292
|
+
name: nil,
|
|
293
|
+
given_name: nil,
|
|
294
|
+
middle_name: nil,
|
|
295
|
+
family_name: nil
|
|
296
|
+
)
|
|
297
|
+
body = { loginId: login_id }
|
|
298
|
+
body[:name] = name unless name.nil?
|
|
299
|
+
body[:givenName] = given_name unless given_name.nil?
|
|
300
|
+
body[:middleName] = middle_name unless middle_name.nil?
|
|
301
|
+
body[:familyName] = family_name unless family_name.nil?
|
|
302
|
+
post(Common::USER_UPDATE_NAME_PATH, body)
|
|
303
|
+
end
|
|
304
|
+
|
|
305
|
+
# Update an existing user's profile picture, using a valid management key.
|
|
306
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/UpdateUserPicture/
|
|
307
|
+
def update_picture(login_id: nil, picture: nil)
|
|
308
|
+
body = {
|
|
309
|
+
loginId: login_id,
|
|
310
|
+
picture: picture
|
|
311
|
+
}
|
|
312
|
+
post(Common::USER_UPDATE_PICTURE_PATH, body)
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# Update an existing user's custom attributes, using a valid management key.
|
|
316
|
+
# @see https://docs.descope.com/api/openapi/usermanagement/operation/UpdateUserCustomAttribute/
|
|
317
|
+
def update_custom_attribute(login_id: nil, attribute_key: nil, attribute_value: nil)
|
|
318
|
+
@logger.debug("Updating user's custom attribute with login_id: #{login_id} to #{attribute_key}: #{attribute_value}")
|
|
319
|
+
body = {
|
|
320
|
+
loginId: login_id,
|
|
321
|
+
attributeKey: attribute_key,
|
|
322
|
+
attributeValue: attribute_value
|
|
323
|
+
}
|
|
324
|
+
post(Common::USER_UPDATE_CUSTOM_ATTRIBUTE_PATH, body)
|
|
325
|
+
end
|
|
326
|
+
|
|
327
|
+
def update_jwt(jwt: nil, custom_claims: nil)
|
|
328
|
+
body = {
|
|
329
|
+
jwt:,
|
|
330
|
+
customClaims: custom_claims,
|
|
331
|
+
}
|
|
332
|
+
post(Common::UPDATE_JWT_PATH, body)
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
#
|
|
336
|
+
def user_add_roles(login_id: nil, tenant_id: nil, role_names: [])
|
|
337
|
+
body = {
|
|
338
|
+
loginId: login_id,
|
|
339
|
+
roleNames: role_names,
|
|
340
|
+
tenantId: tenant_id
|
|
341
|
+
}
|
|
342
|
+
post(Common::USER_ADD_ROLE_PATH, body)
|
|
343
|
+
end
|
|
344
|
+
|
|
345
|
+
def user_remove_roles(login_id: nil, tenant_id:nil, role_names: [])
|
|
346
|
+
body = {
|
|
347
|
+
loginId: login_id,
|
|
348
|
+
roleNames: role_names,
|
|
349
|
+
tenantId: tenant_id
|
|
350
|
+
}
|
|
351
|
+
post(Common::USER_REMOVE_ROLE_PATH, body)
|
|
352
|
+
end
|
|
353
|
+
|
|
354
|
+
def user_add_tenant(login_id: nil, tenant_id: nil)
|
|
355
|
+
body = {
|
|
356
|
+
loginId: login_id,
|
|
357
|
+
tenantId: tenant_id
|
|
358
|
+
}
|
|
359
|
+
post(Common::USER_ADD_TENANT_PATH, body)
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
def user_remove_tenant(login_id: nil, tenant_id: nil)
|
|
363
|
+
body = {
|
|
364
|
+
loginId: login_id,
|
|
365
|
+
tenantId: tenant_id
|
|
366
|
+
}
|
|
367
|
+
post(Common::USER_REMOVE_TENANT_PATH, body)
|
|
368
|
+
end
|
|
369
|
+
|
|
370
|
+
def add_tenant_role(login_id: nil, tenant_id: nil, role_names: [])
|
|
371
|
+
body = {
|
|
372
|
+
loginId: login_id,
|
|
373
|
+
tenantId: tenant_id,
|
|
374
|
+
roleNames: role_names
|
|
375
|
+
}
|
|
376
|
+
post(Common::USER_ADD_TENANT_PATH, body)
|
|
377
|
+
end
|
|
378
|
+
|
|
379
|
+
def user_remove_tenant_roles(login_id: nil, tenant_id: nil, role_names: [])
|
|
380
|
+
body = {
|
|
381
|
+
loginId: login_id,
|
|
382
|
+
tenantId: tenant_id,
|
|
383
|
+
roleNames: role_names
|
|
384
|
+
}
|
|
385
|
+
post(Common::USER_REMOVE_TENANT_PATH, body)
|
|
386
|
+
end
|
|
387
|
+
|
|
388
|
+
def set_password(login_id: nil, password: nil)
|
|
389
|
+
body = {
|
|
390
|
+
loginId: login_id,
|
|
391
|
+
password:
|
|
392
|
+
}
|
|
393
|
+
post(Common::USER_SET_PASSWORD_PATH, body)
|
|
394
|
+
end
|
|
395
|
+
|
|
396
|
+
def expire_password(login_id)
|
|
397
|
+
validate_login_id(login_id)
|
|
398
|
+
body = {
|
|
399
|
+
loginId: login_id
|
|
400
|
+
}
|
|
401
|
+
post(Common::USER_EXPIRE_PASSWORD_PATH, body)
|
|
402
|
+
end
|
|
403
|
+
|
|
404
|
+
def generate_otp_for_test_user(method: nil, login_id: nil)
|
|
405
|
+
body = {
|
|
406
|
+
loginId: login_id,
|
|
407
|
+
deliveryMethod: get_method_string(method)
|
|
408
|
+
}
|
|
409
|
+
post(Common::USER_GENERATE_OTP_FOR_TEST_PATH, body)
|
|
410
|
+
end
|
|
411
|
+
|
|
412
|
+
def generate_magic_link_for_test_user(method: nil, login_id: nil, uri: nil)
|
|
413
|
+
body = {
|
|
414
|
+
loginId: login_id,
|
|
415
|
+
deliveryMethod: get_method_string(method),
|
|
416
|
+
URI: uri
|
|
417
|
+
}
|
|
418
|
+
post(Common::USER_GENERATE_MAGIC_LINK_FOR_TEST_PATH, body)
|
|
419
|
+
end
|
|
420
|
+
|
|
421
|
+
def generate_enchanted_link_for_test_user(login_id: nil, uri: nil)
|
|
422
|
+
body = {
|
|
423
|
+
loginId: login_id,
|
|
424
|
+
URI: uri
|
|
425
|
+
}
|
|
426
|
+
post(Common::USER_GENERATE_ENCHANTED_LINK_FOR_TEST_PATH, body)
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
def generate_embedded_link(login_id: nil, custom_claims: nil)
|
|
430
|
+
custom_claims ||= {}
|
|
431
|
+
unless custom_claims.is_a?(Hash)
|
|
432
|
+
raise Descope::ArgumentException.new(
|
|
433
|
+
'Unable to read custom_claims, not a Hash',
|
|
434
|
+
code: 400
|
|
435
|
+
)
|
|
436
|
+
end
|
|
437
|
+
|
|
438
|
+
validate_login_id(login_id)
|
|
439
|
+
request_params = {
|
|
440
|
+
loginId: login_id,
|
|
441
|
+
customClaims: custom_claims.to_h
|
|
442
|
+
}
|
|
443
|
+
post(USER_GENERATE_EMBEDDED_LINK_PATH, request_params)
|
|
444
|
+
end
|
|
445
|
+
|
|
446
|
+
|
|
447
|
+
private
|
|
448
|
+
|
|
449
|
+
def user_create(
|
|
450
|
+
login_id: nil,
|
|
451
|
+
email: nil,
|
|
452
|
+
phone: nil,
|
|
453
|
+
verified_email: nil,
|
|
454
|
+
verified_phone: nil,
|
|
455
|
+
name: nil,
|
|
456
|
+
role_names: [],
|
|
457
|
+
user_tenants: [],
|
|
458
|
+
invite: false,
|
|
459
|
+
test: false,
|
|
460
|
+
custom_attributes: nil,
|
|
461
|
+
picture: nil,
|
|
462
|
+
send_mail: nil,
|
|
463
|
+
send_sms: nil,
|
|
464
|
+
additional_identifiers: [],
|
|
465
|
+
invite_url: nil,
|
|
466
|
+
password: nil,
|
|
467
|
+
hashed_password: {},
|
|
468
|
+
given_name: nil,
|
|
469
|
+
middle_name: nil,
|
|
470
|
+
family_name: nil,
|
|
471
|
+
sso_app_ids: [],
|
|
472
|
+
skip_create: false
|
|
473
|
+
)
|
|
474
|
+
role_names ||= []
|
|
475
|
+
user_tenants ||= []
|
|
476
|
+
path = Common::USER_CREATE_PATH
|
|
477
|
+
request_params = user_compose_create_body(
|
|
478
|
+
login_id:,
|
|
479
|
+
email:,
|
|
480
|
+
phone:,
|
|
481
|
+
name:,
|
|
482
|
+
given_name:,
|
|
483
|
+
middle_name:,
|
|
484
|
+
family_name:,
|
|
485
|
+
role_names:,
|
|
486
|
+
user_tenants:,
|
|
487
|
+
invite:,
|
|
488
|
+
test:,
|
|
489
|
+
picture:,
|
|
490
|
+
custom_attributes:,
|
|
491
|
+
verified_email:,
|
|
492
|
+
verified_phone:,
|
|
493
|
+
invite_url:,
|
|
494
|
+
send_mail:,
|
|
495
|
+
send_sms:,
|
|
496
|
+
additional_identifiers:,
|
|
497
|
+
password:,
|
|
498
|
+
hashed_password:,
|
|
499
|
+
sso_app_ids:
|
|
500
|
+
)
|
|
501
|
+
return request_params if skip_create
|
|
502
|
+
|
|
503
|
+
post(path, request_params)
|
|
504
|
+
end
|
|
505
|
+
|
|
506
|
+
def user_compose_create_body(
|
|
507
|
+
login_id: nil,
|
|
508
|
+
email: nil,
|
|
509
|
+
phone: nil,
|
|
510
|
+
name: nil,
|
|
511
|
+
given_name: nil,
|
|
512
|
+
middle_name: nil,
|
|
513
|
+
family_name: nil,
|
|
514
|
+
role_names: nil,
|
|
515
|
+
user_tenants: nil,
|
|
516
|
+
invite: false,
|
|
517
|
+
test: false,
|
|
518
|
+
picture: nil,
|
|
519
|
+
custom_attributes: nil,
|
|
520
|
+
verified_email: nil,
|
|
521
|
+
verified_phone: nil,
|
|
522
|
+
invite_url: nil,
|
|
523
|
+
send_mail: nil,
|
|
524
|
+
send_sms: nil,
|
|
525
|
+
additional_identifiers: [],
|
|
526
|
+
password: nil,
|
|
527
|
+
hashed_password: {},
|
|
528
|
+
sso_app_ids: []
|
|
529
|
+
)
|
|
530
|
+
body = user_compose_update_body(
|
|
531
|
+
login_id:,
|
|
532
|
+
email:,
|
|
533
|
+
phone:,
|
|
534
|
+
name:,
|
|
535
|
+
given_name:,
|
|
536
|
+
middle_name:,
|
|
537
|
+
family_name:,
|
|
538
|
+
role_names:,
|
|
539
|
+
user_tenants:,
|
|
540
|
+
test:,
|
|
541
|
+
invite:,
|
|
542
|
+
picture:,
|
|
543
|
+
custom_attributes:,
|
|
544
|
+
additional_identifiers:,
|
|
545
|
+
password:,
|
|
546
|
+
hashed_password:,
|
|
547
|
+
sso_app_ids:
|
|
548
|
+
)
|
|
549
|
+
body[:invite] = invite
|
|
550
|
+
body[:verifiedEmail] = verified_email unless verified_email.nil? || !verified_email.empty?
|
|
551
|
+
body[:verifiedPhone] = verified_phone unless verified_phone.nil? || !verified_phone.empty?
|
|
552
|
+
body[:inviteUrl] = invite_url unless invite_url.nil? || !invite_url.empty?
|
|
553
|
+
body[:sendMail] = send_mail unless send_mail.nil? || !send_mail.empty?
|
|
554
|
+
body[:sendSMS] = send_sms unless send_sms.nil? || !send_sms.empty?
|
|
555
|
+
|
|
556
|
+
body
|
|
557
|
+
end
|
|
558
|
+
|
|
559
|
+
def user_compose_update_body(
|
|
560
|
+
login_id: nil,
|
|
561
|
+
email: nil,
|
|
562
|
+
phone: nil,
|
|
563
|
+
name: nil,
|
|
564
|
+
given_name: nil,
|
|
565
|
+
middle_name: nil,
|
|
566
|
+
family_name: nil,
|
|
567
|
+
role_names: nil,
|
|
568
|
+
user_tenants: nil,
|
|
569
|
+
test: false,
|
|
570
|
+
invite: false,
|
|
571
|
+
picture: nil,
|
|
572
|
+
custom_attributes: nil,
|
|
573
|
+
verified_email: nil,
|
|
574
|
+
verified_phone: nil,
|
|
575
|
+
additional_identifiers: [],
|
|
576
|
+
password: nil,
|
|
577
|
+
hashed_password: {},
|
|
578
|
+
sso_app_ids: []
|
|
579
|
+
)
|
|
580
|
+
body = {
|
|
581
|
+
loginId: login_id,
|
|
582
|
+
}
|
|
583
|
+
if (hashed_password.nil? || hashed_password.empty?) && (!password.nil? && !password.empty?)
|
|
584
|
+
body[:password] = password
|
|
585
|
+
end
|
|
586
|
+
|
|
587
|
+
if password.nil? && (!hashed_password.nil? && !hashed_password.empty?)
|
|
588
|
+
unless hashed_password.is_a?(Hash)
|
|
589
|
+
raise Descope::ArgumentException.new(
|
|
590
|
+
'Invalid password hash', code: 400
|
|
591
|
+
)
|
|
592
|
+
end
|
|
593
|
+
|
|
594
|
+
body[:hashedPassword] = hashed_password.to_hash
|
|
595
|
+
end
|
|
596
|
+
|
|
597
|
+
body[:email] = email unless email.nil? || email.empty?
|
|
598
|
+
body[:phone] = phone unless phone.nil? || phone.empty?
|
|
599
|
+
body[:name] = name unless name.nil? || name.empty?
|
|
600
|
+
body[:roleNames] = role_names unless role_names.nil? || role_names.empty?
|
|
601
|
+
body[:userTenants] = associated_tenants_to_hash_array(user_tenants) unless user_tenants.nil? || user_tenants.empty?
|
|
602
|
+
body[:test] = test unless test.nil?
|
|
603
|
+
body[:invite] = invite unless invite.nil?
|
|
604
|
+
body[:picture] = picture unless picture.nil? || picture.empty?
|
|
605
|
+
body[:customAttributes] = custom_attributes unless custom_attributes.nil? || custom_attributes.empty?
|
|
606
|
+
body[:additionalIdentifiers] = additional_identifiers unless additional_identifiers.nil? || additional_identifiers.empty?
|
|
607
|
+
body[:ssoAppIds] = sso_app_ids unless sso_app_ids.nil? || sso_app_ids.empty?
|
|
608
|
+
body[:verifiedEmail] = verified_email unless verified_email.nil? || !verified_email.to_s.empty?
|
|
609
|
+
body[:givenName] = given_name unless given_name.nil?
|
|
610
|
+
body[:middleName] = middle_name unless middle_name.nil?
|
|
611
|
+
body[:familyName] = family_name unless family_name.nil?
|
|
612
|
+
body[:verifiedPhone] = verified_phone unless verified_phone.nil?
|
|
613
|
+
body
|
|
614
|
+
end
|
|
615
|
+
end
|
|
616
|
+
end
|
|
617
|
+
end
|
|
618
|
+
end
|
|
619
|
+
end
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'descope/api/v1/management/common'
|
|
4
|
+
require 'descope/api/v1/management/user'
|
|
5
|
+
require 'descope/api/v1/management/flow'
|
|
6
|
+
require 'descope/api/v1/management/access_key'
|
|
7
|
+
require 'descope/api/v1/management/tenant'
|
|
8
|
+
require 'descope/api/v1/management/permission'
|
|
9
|
+
require 'descope/api/v1/management/role'
|
|
10
|
+
require 'descope/api/v1/management/project'
|
|
11
|
+
require 'descope/api/v1/management/authz'
|
|
12
|
+
require 'descope/api/v1/management/audit'
|
|
13
|
+
require 'descope/api/v1/management/sso_settings'
|
|
14
|
+
require 'descope/api/v1/management/scim'
|
|
15
|
+
require 'descope/api/v1/management/password'
|
|
16
|
+
|
|
17
|
+
module Descope
|
|
18
|
+
module Api
|
|
19
|
+
module V1
|
|
20
|
+
# Holds all the management API calls
|
|
21
|
+
module Management
|
|
22
|
+
include Descope::Api::V1::Management::Common
|
|
23
|
+
include Descope::Api::V1::Management::User
|
|
24
|
+
include Descope::Api::V1::Management::Flow
|
|
25
|
+
include Descope::Api::V1::Management::AccessKey
|
|
26
|
+
include Descope::Api::V1::Management::Tenant
|
|
27
|
+
include Descope::Api::V1::Management::Permission
|
|
28
|
+
include Descope::Api::V1::Management::Role
|
|
29
|
+
include Descope::Api::V1::Management::Project
|
|
30
|
+
include Descope::Api::V1::Management::Authz
|
|
31
|
+
include Descope::Api::V1::Management::Audit
|
|
32
|
+
include Descope::Api::V1::Management::SSOSettings
|
|
33
|
+
include Descope::Api::V1::Management::SCIM
|
|
34
|
+
include Descope::Api::V1::Management::Password
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|