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.
Files changed (197) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yaml +54 -0
  3. data/.gitignore +59 -0
  4. data/.release-please-manifest.json +3 -0
  5. data/.rubocop.yml +10 -0
  6. data/.rubocop_todo.yml +10 -0
  7. data/.ruby-version +1 -0
  8. data/CHANGELOG.md +90 -0
  9. data/Gemfile +22 -0
  10. data/Gemfile.lock +204 -0
  11. data/LICENSE +21 -0
  12. data/README.md +1171 -0
  13. data/Rakefile +31 -0
  14. data/descope.gemspec +34 -0
  15. data/examples/ruby/Gemfile +4 -0
  16. data/examples/ruby/Gemfile.lock +41 -0
  17. data/examples/ruby/access_key_app.rb +45 -0
  18. data/examples/ruby/enchantedlink_app.rb +65 -0
  19. data/examples/ruby/magiclink_app.rb +81 -0
  20. data/examples/ruby/management/Gemfile +5 -0
  21. data/examples/ruby/management/Gemfile.lock +38 -0
  22. data/examples/ruby/management/access_key_app.rb +71 -0
  23. data/examples/ruby/management/audit_app.rb +25 -0
  24. data/examples/ruby/management/authz_app.rb +135 -0
  25. data/examples/ruby/management/authz_files.json +229 -0
  26. data/examples/ruby/management/flow_app.rb +57 -0
  27. data/examples/ruby/management/permission_app.rb +56 -0
  28. data/examples/ruby/management/role_app.rb +58 -0
  29. data/examples/ruby/management/tenant_app.rb +60 -0
  30. data/examples/ruby/management/user_app.rb +60 -0
  31. data/examples/ruby/oauth_app.rb +39 -0
  32. data/examples/ruby/otp_app.rb +50 -0
  33. data/examples/ruby/password_app.rb +76 -0
  34. data/examples/ruby/saml_app.rb +38 -0
  35. data/examples/ruby-on-rails-api/descope/.dockerignore +37 -0
  36. data/examples/ruby-on-rails-api/descope/.gitattributes +9 -0
  37. data/examples/ruby-on-rails-api/descope/.gitignore +40 -0
  38. data/examples/ruby-on-rails-api/descope/.node-version +1 -0
  39. data/examples/ruby-on-rails-api/descope/.ruby-version +1 -0
  40. data/examples/ruby-on-rails-api/descope/Dockerfile +75 -0
  41. data/examples/ruby-on-rails-api/descope/Gemfile +67 -0
  42. data/examples/ruby-on-rails-api/descope/Gemfile.lock +284 -0
  43. data/examples/ruby-on-rails-api/descope/Procfile.dev +3 -0
  44. data/examples/ruby-on-rails-api/descope/README.md +54 -0
  45. data/examples/ruby-on-rails-api/descope/Rakefile +6 -0
  46. data/examples/ruby-on-rails-api/descope/app/assets/builds/.keep +0 -0
  47. data/examples/ruby-on-rails-api/descope/app/assets/config/manifest.js +3 -0
  48. data/examples/ruby-on-rails-api/descope/app/assets/images/.keep +0 -0
  49. data/examples/ruby-on-rails-api/descope/app/assets/images/descope.jpeg +0 -0
  50. data/examples/ruby-on-rails-api/descope/app/assets/images/favicon.ico +0 -0
  51. data/examples/ruby-on-rails-api/descope/app/assets/images/logo192.png +0 -0
  52. data/examples/ruby-on-rails-api/descope/app/assets/images/logo512.png +0 -0
  53. data/examples/ruby-on-rails-api/descope/app/assets/stylesheets/application.bootstrap.scss +67 -0
  54. data/examples/ruby-on-rails-api/descope/app/channels/application_cable/channel.rb +4 -0
  55. data/examples/ruby-on-rails-api/descope/app/channels/application_cable/connection.rb +4 -0
  56. data/examples/ruby-on-rails-api/descope/app/controllers/application_controller.rb +2 -0
  57. data/examples/ruby-on-rails-api/descope/app/controllers/concerns/.keep +0 -0
  58. data/examples/ruby-on-rails-api/descope/app/controllers/homepage_controller.rb +4 -0
  59. data/examples/ruby-on-rails-api/descope/app/controllers/session_controller.rb +66 -0
  60. data/examples/ruby-on-rails-api/descope/app/helpers/application_helper.rb +2 -0
  61. data/examples/ruby-on-rails-api/descope/app/helpers/homepage_helper.rb +2 -0
  62. data/examples/ruby-on-rails-api/descope/app/helpers/session_helper.rb +2 -0
  63. data/examples/ruby-on-rails-api/descope/app/javascript/App.css +53 -0
  64. data/examples/ruby-on-rails-api/descope/app/javascript/application.js +5 -0
  65. data/examples/ruby-on-rails-api/descope/app/javascript/components/App.jsx +4 -0
  66. data/examples/ruby-on-rails-api/descope/app/javascript/components/Dashboard.jsx +60 -0
  67. data/examples/ruby-on-rails-api/descope/app/javascript/components/Home.jsx +27 -0
  68. data/examples/ruby-on-rails-api/descope/app/javascript/components/Login.jsx +45 -0
  69. data/examples/ruby-on-rails-api/descope/app/javascript/components/Profile.jsx +81 -0
  70. data/examples/ruby-on-rails-api/descope/app/javascript/components/index.html +11 -0
  71. data/examples/ruby-on-rails-api/descope/app/javascript/components/index.jsx +24 -0
  72. data/examples/ruby-on-rails-api/descope/app/javascript/controllers/application.js +9 -0
  73. data/examples/ruby-on-rails-api/descope/app/javascript/controllers/index.js +5 -0
  74. data/examples/ruby-on-rails-api/descope/app/javascript/reportWebVitals.js +13 -0
  75. data/examples/ruby-on-rails-api/descope/app/javascript/routes/index.jsx +17 -0
  76. data/examples/ruby-on-rails-api/descope/app/jobs/application_job.rb +7 -0
  77. data/examples/ruby-on-rails-api/descope/app/mailers/application_mailer.rb +4 -0
  78. data/examples/ruby-on-rails-api/descope/app/models/application_record.rb +3 -0
  79. data/examples/ruby-on-rails-api/descope/app/models/concerns/.keep +0 -0
  80. data/examples/ruby-on-rails-api/descope/app/views/homepage/index.html.erb +2 -0
  81. data/examples/ruby-on-rails-api/descope/app/views/layouts/application.html.erb +16 -0
  82. data/examples/ruby-on-rails-api/descope/app/views/layouts/mailer.html.erb +13 -0
  83. data/examples/ruby-on-rails-api/descope/app/views/layouts/mailer.text.erb +1 -0
  84. data/examples/ruby-on-rails-api/descope/app/views/session/index.html.erb +2 -0
  85. data/examples/ruby-on-rails-api/descope/bin/bundle +109 -0
  86. data/examples/ruby-on-rails-api/descope/bin/dev +11 -0
  87. data/examples/ruby-on-rails-api/descope/bin/docker-entrypoint +8 -0
  88. data/examples/ruby-on-rails-api/descope/bin/rails +4 -0
  89. data/examples/ruby-on-rails-api/descope/bin/rake +4 -0
  90. data/examples/ruby-on-rails-api/descope/bin/setup +36 -0
  91. data/examples/ruby-on-rails-api/descope/build.js +30 -0
  92. data/examples/ruby-on-rails-api/descope/config/application.rb +42 -0
  93. data/examples/ruby-on-rails-api/descope/config/boot.rb +4 -0
  94. data/examples/ruby-on-rails-api/descope/config/cable.yml +10 -0
  95. data/examples/ruby-on-rails-api/descope/config/config.yml +9 -0
  96. data/examples/ruby-on-rails-api/descope/config/credentials.yml.enc +1 -0
  97. data/examples/ruby-on-rails-api/descope/config/database.yml +25 -0
  98. data/examples/ruby-on-rails-api/descope/config/environment.rb +5 -0
  99. data/examples/ruby-on-rails-api/descope/config/environments/development.rb +76 -0
  100. data/examples/ruby-on-rails-api/descope/config/environments/production.rb +97 -0
  101. data/examples/ruby-on-rails-api/descope/config/environments/test.rb +64 -0
  102. data/examples/ruby-on-rails-api/descope/config/initializers/assets.rb +13 -0
  103. data/examples/ruby-on-rails-api/descope/config/initializers/content_security_policy.rb +25 -0
  104. data/examples/ruby-on-rails-api/descope/config/initializers/filter_parameter_logging.rb +8 -0
  105. data/examples/ruby-on-rails-api/descope/config/initializers/inflections.rb +16 -0
  106. data/examples/ruby-on-rails-api/descope/config/initializers/load_config.rb +12 -0
  107. data/examples/ruby-on-rails-api/descope/config/initializers/permissions_policy.rb +13 -0
  108. data/examples/ruby-on-rails-api/descope/config/locales/en.yml +31 -0
  109. data/examples/ruby-on-rails-api/descope/config/puma.rb +35 -0
  110. data/examples/ruby-on-rails-api/descope/config/routes.rb +18 -0
  111. data/examples/ruby-on-rails-api/descope/config/storage.yml +34 -0
  112. data/examples/ruby-on-rails-api/descope/config.ru +6 -0
  113. data/examples/ruby-on-rails-api/descope/db/seeds.rb +9 -0
  114. data/examples/ruby-on-rails-api/descope/lib/assets/.keep +0 -0
  115. data/examples/ruby-on-rails-api/descope/lib/tasks/.keep +0 -0
  116. data/examples/ruby-on-rails-api/descope/log/.keep +0 -0
  117. data/examples/ruby-on-rails-api/descope/package-lock.json +19680 -0
  118. data/examples/ruby-on-rails-api/descope/package.json +51 -0
  119. data/examples/ruby-on-rails-api/descope/public/404.html +67 -0
  120. data/examples/ruby-on-rails-api/descope/public/422.html +67 -0
  121. data/examples/ruby-on-rails-api/descope/public/500.html +66 -0
  122. data/examples/ruby-on-rails-api/descope/public/apple-touch-icon-precomposed.png +0 -0
  123. data/examples/ruby-on-rails-api/descope/public/apple-touch-icon.png +0 -0
  124. data/examples/ruby-on-rails-api/descope/public/favicon.ico +0 -0
  125. data/examples/ruby-on-rails-api/descope/public/robots.txt +1 -0
  126. data/examples/ruby-on-rails-api/descope/storage/.keep +0 -0
  127. data/examples/ruby-on-rails-api/descope/tmp/.keep +0 -0
  128. data/examples/ruby-on-rails-api/descope/tmp/pids/.keep +0 -0
  129. data/examples/ruby-on-rails-api/descope/tmp/storage/.keep +0 -0
  130. data/examples/ruby-on-rails-api/descope/vendor/.keep +0 -0
  131. data/examples/ruby-on-rails-api/descope/yarn.lock +10780 -0
  132. data/lib/descope/api/v1/auth/enchantedlink.rb +156 -0
  133. data/lib/descope/api/v1/auth/magiclink.rb +170 -0
  134. data/lib/descope/api/v1/auth/oauth.rb +72 -0
  135. data/lib/descope/api/v1/auth/otp.rb +186 -0
  136. data/lib/descope/api/v1/auth/password.rb +100 -0
  137. data/lib/descope/api/v1/auth/saml.rb +48 -0
  138. data/lib/descope/api/v1/auth/totp.rb +72 -0
  139. data/lib/descope/api/v1/auth.rb +452 -0
  140. data/lib/descope/api/v1/management/access_key.rb +81 -0
  141. data/lib/descope/api/v1/management/audit.rb +82 -0
  142. data/lib/descope/api/v1/management/authz.rb +165 -0
  143. data/lib/descope/api/v1/management/common.rb +147 -0
  144. data/lib/descope/api/v1/management/flow.rb +55 -0
  145. data/lib/descope/api/v1/management/password.rb +58 -0
  146. data/lib/descope/api/v1/management/permission.rb +48 -0
  147. data/lib/descope/api/v1/management/project.rb +53 -0
  148. data/lib/descope/api/v1/management/role.rb +48 -0
  149. data/lib/descope/api/v1/management/scim.rb +206 -0
  150. data/lib/descope/api/v1/management/sso_settings.rb +153 -0
  151. data/lib/descope/api/v1/management/tenant.rb +71 -0
  152. data/lib/descope/api/v1/management/user.rb +619 -0
  153. data/lib/descope/api/v1/management.rb +38 -0
  154. data/lib/descope/api/v1/session.rb +84 -0
  155. data/lib/descope/api/v1.rb +13 -0
  156. data/lib/descope/client.rb +6 -0
  157. data/lib/descope/exception.rb +50 -0
  158. data/lib/descope/mixins/common.rb +129 -0
  159. data/lib/descope/mixins/headers.rb +15 -0
  160. data/lib/descope/mixins/http.rb +133 -0
  161. data/lib/descope/mixins/initializer.rb +80 -0
  162. data/lib/descope/mixins/logging.rb +30 -0
  163. data/lib/descope/mixins/validation.rb +79 -0
  164. data/lib/descope/mixins.rb +22 -0
  165. data/lib/descope/version.rb +7 -0
  166. data/lib/descope.rb +9 -0
  167. data/lib/descope_client.rb +5 -0
  168. data/release-please-config.json +18 -0
  169. data/renovate.json +6 -0
  170. data/spec/factories/user.rb +16 -0
  171. data/spec/lib.descope/api/v1/auth/enchantedlink_spec.rb +159 -0
  172. data/spec/lib.descope/api/v1/auth/magiclink_spec.rb +282 -0
  173. data/spec/lib.descope/api/v1/auth/oauth_spec.rb +117 -0
  174. data/spec/lib.descope/api/v1/auth/otp_spec.rb +285 -0
  175. data/spec/lib.descope/api/v1/auth/password_spec.rb +124 -0
  176. data/spec/lib.descope/api/v1/auth/saml_spec.rb +55 -0
  177. data/spec/lib.descope/api/v1/auth/totp_spec.rb +70 -0
  178. data/spec/lib.descope/api/v1/auth_spec.rb +372 -0
  179. data/spec/lib.descope/api/v1/management/access_key_spec.rb +118 -0
  180. data/spec/lib.descope/api/v1/management/audit_spec.rb +78 -0
  181. data/spec/lib.descope/api/v1/management/authz_spec.rb +336 -0
  182. data/spec/lib.descope/api/v1/management/flow_spec.rb +78 -0
  183. data/spec/lib.descope/api/v1/management/password_spec.rb +25 -0
  184. data/spec/lib.descope/api/v1/management/permission_spec.rb +81 -0
  185. data/spec/lib.descope/api/v1/management/project_spec.rb +63 -0
  186. data/spec/lib.descope/api/v1/management/role_spec.rb +85 -0
  187. data/spec/lib.descope/api/v1/management/scim_spec.rb +312 -0
  188. data/spec/lib.descope/api/v1/management/sso_settings_spec.rb +172 -0
  189. data/spec/lib.descope/api/v1/management/tenant_spec.rb +141 -0
  190. data/spec/lib.descope/api/v1/management/user_spec.rb +667 -0
  191. data/spec/lib.descope/api/v1/session_spec.rb +117 -0
  192. data/spec/lib.descope/client_spec.rb +40 -0
  193. data/spec/spec_helper.rb +72 -0
  194. data/spec/support/client_config.rb +14 -0
  195. data/spec/support/dummy_class.rb +36 -0
  196. data/spec/support/utils.rb +32 -0
  197. metadata +420 -0
data/Rakefile ADDED
@@ -0,0 +1,31 @@
1
+ #!/usr/bin/env rake
2
+ require 'bundler/gem_tasks'
3
+
4
+ begin
5
+ require 'rubocop/rake_task'
6
+
7
+ require 'rspec/core/rake_task'
8
+
9
+ desc 'Run Rubocop'
10
+ RuboCop::RakeTask.new(:rubocop)
11
+
12
+ desc 'Run Integration Tests'
13
+ RSpec::Core::RakeTask.new(:integration) do |t|
14
+ t.pattern = FileList["spec/integration/**/*#{ENV['PATTERN']}*_spec.rb"]
15
+ end
16
+
17
+ desc 'Run Unit Tests'
18
+ RSpec::Core::RakeTask.new(:spec) do |t|
19
+ t.pattern = FileList["spec/lib/descope/**/*#{ENV['PATTERN']}*_spec.rb"]
20
+ end
21
+
22
+ desc 'Run All Suites'
23
+ RSpec::Core::RakeTask.new(:all)
24
+
25
+ desc 'Run unit and integration tests'
26
+ task test: [:spec, :integration]
27
+
28
+ task default: [:rubocop, :test]
29
+ rescue LoadError
30
+ puts 'Load Error - No RSpec'
31
+ end
data/descope.gemspec ADDED
@@ -0,0 +1,34 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $LOAD_PATH.push File.expand_path('../lib', __FILE__)
3
+ require 'descope/version'
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = 'descope'
7
+ s.version = Descope::VERSION
8
+ s.authors = ['Descope']
9
+ s.email = ['support@descope.com']
10
+ s.homepage = 'https://github.com/descope/descope-ruby-sdk'
11
+ s.summary = 'Descope API Client'
12
+ s.description = 'Ruby API Client for Descope API https://descope.com'
13
+
14
+ s.files = `git ls-files`.split("\n")
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = `git ls-files -- bin/*`.split("\n").map { |f| File.basename(f) }
17
+ s.require_paths = ['lib']
18
+
19
+ s.add_runtime_dependency 'rest-client', '~> 2.1'
20
+ s.add_runtime_dependency 'jwt', '~> 2.7'
21
+ s.add_runtime_dependency 'zache', '~> 0.12'
22
+ s.add_runtime_dependency 'addressable', '~> 2.8'
23
+ s.add_runtime_dependency 'retryable', '~> 3.0'
24
+
25
+ s.add_development_dependency 'bundler'
26
+ s.add_development_dependency 'rake', '~> 13.0'
27
+ s.add_development_dependency 'fuubar', '~> 2.0'
28
+ s.add_development_dependency 'rspec', '~> 3.11'
29
+ s.add_development_dependency 'simplecov', '~> 0.9'
30
+ s.add_development_dependency 'faker', '~> 2.0'
31
+ s.add_development_dependency "super_diff", "~> 1.0"
32
+ s.add_development_dependency 'concurrent-ruby', '~> 1.1'
33
+ s.license = 'MIT'
34
+ end
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ gem 'descope'
4
+ gem 'launchy'
@@ -0,0 +1,41 @@
1
+ GEM
2
+ remote: https://rubygems.org/
3
+ specs:
4
+ addressable (2.8.6)
5
+ public_suffix (>= 2.0.2, < 6.0)
6
+ descope (1.0.2)
7
+ addressable (~> 2.8)
8
+ jwt (~> 2.7)
9
+ rest-client (~> 2.1)
10
+ retryable (~> 3.0)
11
+ zache (~> 0.12)
12
+ domain_name (0.6.20240107)
13
+ http-accept (1.7.0)
14
+ http-cookie (1.0.5)
15
+ domain_name (~> 0.5)
16
+ jwt (2.7.1)
17
+ launchy (2.5.2)
18
+ addressable (~> 2.8)
19
+ mime-types (3.5.2)
20
+ mime-types-data (~> 3.2015)
21
+ mime-types-data (3.2024.0206)
22
+ netrc (0.11.0)
23
+ public_suffix (5.0.4)
24
+ rest-client (2.1.0)
25
+ http-accept (>= 1.7.0, < 2.0)
26
+ http-cookie (>= 1.0.2, < 2.0)
27
+ mime-types (>= 1.16, < 4.0)
28
+ netrc (~> 0.8)
29
+ retryable (3.0.5)
30
+ zache (0.13.1)
31
+
32
+ PLATFORMS
33
+ arm64-darwin-23
34
+ ruby
35
+
36
+ DEPENDENCIES
37
+ descope
38
+ launchy
39
+
40
+ BUNDLED WITH
41
+ 2.5.5
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'descope'
5
+
6
+ @logger = Logger.new($stdout)
7
+
8
+ @project_id = ENV['DESCOPE_PROJECT_ID']
9
+ @management_key = ENV['DESCOPE_MANAGEMENT_KEY']
10
+
11
+ @logger.info("Initializing Descope API with project_id: #{@project_id} and base_uri: #{@base_uri}")
12
+
13
+ @client = Descope::Client.new({ project_id: @project_id, management_key: @management_key })
14
+
15
+ access_key = nil
16
+
17
+ begin
18
+ @logger.info('Going to login by using access key ...')
19
+
20
+ if access_key.nil?
21
+ print "Insert access key here\n"
22
+ access_key = gets.chomp
23
+ end
24
+
25
+ begin
26
+ jwt_response = @client.exchange_access_key(access_key)
27
+ @logger.info('exchange access key successfully')
28
+ @logger.info("jwt_response: #{jwt_response}")
29
+
30
+ permission_name = 'TestPermission'
31
+ permission_presented = @client.validate_permissions(
32
+ jwt_response:, permissions: [permission_name]
33
+ )
34
+ @logger.info("#{permission_name} presented on the jwt: [#{permission_presented}]")
35
+ role_name = 'TestRole'
36
+ role_presented = @client.validate_roles(jwt_response:, roles: [role_name])
37
+ @logger.info("#{role_name} presented on the jwt: [#{role_presented}]")
38
+ rescue Descope::AuthException => e
39
+ @logger.error("Failed to exchange access key #{e}")
40
+ raise
41
+ end
42
+ rescue StandardError => e
43
+ @logger.error("Failed to initialize DescopeClient #{e}")
44
+ raise
45
+ end
@@ -0,0 +1,65 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'descope'
5
+
6
+ @logger = Logger.new($stdout)
7
+
8
+ @project_id = ENV['DESCOPE_PROJECT_ID']
9
+ @management_key = ENV['DESCOPE_MANAGEMENT_KEY']
10
+
11
+ @logger.info("Initializing Descope API with project_id: #{@project_id} and base_uri: #{@base_uri}")
12
+
13
+ @client = Descope::Client.new({ project_id: @project_id, management_key: @management_key })
14
+
15
+ def verify
16
+ print "Please insert the token you received by email:\n"
17
+ token = gets.chomp
18
+ @client.enchanted_link_verify_token(token)
19
+ p 'Token is valid'
20
+ rescue Descope::AuthException => e
21
+ p "Invalid Token #{e}"
22
+ raise
23
+ end
24
+
25
+ print 'Going to signup / signin using Enchanted Link ...'
26
+ print "Please insert email to signup / signin:\n"
27
+ email = gets.chomp
28
+ resp = @client.enchanted_link_sign_up_or_in(
29
+ login_id: email,
30
+ uri: 'http://test.me'
31
+ )
32
+
33
+ link_identifier = resp['linkId']
34
+ masked_email = resp['maskedEmail']
35
+ p "We have sent you an email to #{masked_email}"
36
+ p "Please click the link with the identifier #{link_identifier}"
37
+ pending_ref = resp['pendingRef']
38
+
39
+ done = false
40
+
41
+ # open thread to get input
42
+ thread = Thread.new { verify }
43
+ thread.join
44
+
45
+ i = 0
46
+ until done
47
+ begin
48
+ i += 1
49
+ $stdout.write("Sleeping #{i}...")
50
+ sleep(4)
51
+ jwt_response = @client.enchanted_link_get_session(pending_ref)
52
+ done = true
53
+ rescue Descope::AuthException => e
54
+ if e.status_code != 401
55
+ p "Failed pending session, err: #{e}"
56
+ done = true
57
+ end
58
+ end
59
+ end
60
+
61
+ if jwt_response
62
+ refresh_token = jwt_response.fetch(Descope::Mixins::Common::REFRESH_SESSION_TOKEN_NAME).fetch('jwt')
63
+ @client.sign_out(refresh_token)
64
+ p 'User logged out'
65
+ end
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'descope'
5
+
6
+ # include Descope::Mixin::Common
7
+ @logger = Logger.new($stdout)
8
+
9
+ @project_id = ENV['DESCOPE_PROJECT_ID']
10
+ @management_key = ENV['DESCOPE_MANAGEMENT_KEY']
11
+
12
+ @logger.info("Initializing Descope API with project_id: #{@project_id} and base_uri: #{@base_uri}")
13
+
14
+ @client = Descope::Client.new({ project_id: @project_id, management_key: @management_key })
15
+
16
+ @logger.info('Going to signup / signin using Magic Link ...')
17
+ print "Please insert email to signup / signin:\n"
18
+ email = gets.chomp
19
+ masked_mail = @client.magiclink_sign_up_or_in(
20
+ method: Descope::Mixins::Common::DeliveryMethod::EMAIL,
21
+ login_id: email,
22
+ uri: 'http://test.me'
23
+ )
24
+
25
+ print "Please insert the token you received by email (#{masked_mail}):\n"
26
+ token = gets.chomp
27
+ begin
28
+ jwt_response = @client.magiclink_verify_token(token)
29
+ @logger.info('Token is valid')
30
+ refresh_token = jwt_response['refreshJwt']
31
+ @logger.info("jwt_response: #{jwt_response}")
32
+ rescue Descope::AuthException => e
33
+ @logger.error("Invalid Token #{e}")
34
+ raise
35
+ end
36
+
37
+ begin
38
+ @logger.info('Going to logout after sign-in / sign-up')
39
+ @client.sign_out(refresh_token)
40
+ @logger.info('User logged out after sign-in / sign-up')
41
+ rescue Descope::AuthException => e
42
+ @logger.info("Failed to logged after sign-in / sign-up, err: #{e}")
43
+ end
44
+
45
+ @logger.info('Going to sign in same user again...')
46
+ @client.magiclink_sign_in(
47
+ method: Descope::Mixins::Common::DeliveryMethod::EMAIL, login_id: email, uri: 'http://test.me'
48
+ )
49
+
50
+ print "Please insert the Token you received by email:\n"
51
+ token = gets.chomp
52
+ begin
53
+ jwt_response = @client.magiclink_verify_token(token)
54
+ @logger.info('Token is valid')
55
+ session_token_1 = jwt_response['sessionJwt']
56
+ refresh_token_1 = jwt_response['refreshJwt']
57
+ @logger.info("jwt_response: #{jwt_response}")
58
+ rescue Descope::AuthException => e
59
+ @logger.error("Invalid Token #{e}")
60
+ raise
61
+ end
62
+
63
+ begin
64
+ @logger.info("going to validate session...#{session_token_1}")
65
+ @client.validate_and_refresh_session(
66
+ session_token: session_token_1, refresh_token: refresh_token_1
67
+ )
68
+ @logger.info('Session is valid and all is OK')
69
+ rescue Descope::AuthException => e
70
+ @logger.error("Session is not valid #{e}")
71
+ end
72
+
73
+ begin
74
+ @logger.info(
75
+ "Going to logout at the second time\nrefresh_token: #{refresh_token_1}"
76
+ )
77
+ @client.sign_out(refresh_token_1)
78
+ @logger.info('User logged out')
79
+ rescue Descope::AuthException => e
80
+ @logger.error("Failed to logged out user, err: #{e}")
81
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ # A sample Gemfile
3
+ source 'http://rubygems.org'
4
+
5
+ gem 'descope'
@@ -0,0 +1,38 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ addressable (2.8.6)
5
+ public_suffix (>= 2.0.2, < 6.0)
6
+ descope (1.0.0)
7
+ addressable (~> 2.8)
8
+ jwt (~> 2.7)
9
+ rest-client (~> 2.1)
10
+ retryable (~> 3.0)
11
+ zache (~> 0.12)
12
+ domain_name (0.6.20240107)
13
+ http-accept (1.7.0)
14
+ http-cookie (1.0.5)
15
+ domain_name (~> 0.5)
16
+ jwt (2.7.1)
17
+ mime-types (3.5.2)
18
+ mime-types-data (~> 3.2015)
19
+ mime-types-data (3.2023.1205)
20
+ netrc (0.11.0)
21
+ public_suffix (5.0.4)
22
+ rest-client (2.1.0)
23
+ http-accept (>= 1.7.0, < 2.0)
24
+ http-cookie (>= 1.0.2, < 2.0)
25
+ mime-types (>= 1.16, < 4.0)
26
+ netrc (~> 0.8)
27
+ retryable (3.0.5)
28
+ zache (0.13.1)
29
+
30
+ PLATFORMS
31
+ arm64-darwin-23
32
+ ruby
33
+
34
+ DEPENDENCIES
35
+ descope
36
+
37
+ BUNDLED WITH
38
+ 2.5.5
@@ -0,0 +1,71 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'descope'
5
+
6
+ @logger = Logger.new($stdout)
7
+
8
+ @project_id = ENV['DESCOPE_PROJECT_ID']
9
+ @management_key = ENV['DESCOPE_MANAGEMENT_KEY']
10
+
11
+ @logger.info("Initializing Descope API with project_id: #{@project_id} and base_uri: #{@base_uri}")
12
+
13
+ @client = Descope::Client.new({ project_id: @project_id, management_key: @management_key })
14
+
15
+ begin
16
+ @logger.info('Going to create a new access key')
17
+ access_key_resp = @client.create_access_key(name: 'key-name', expire_time: 1_677_844_931)
18
+ access_key = access_key_resp['key']
19
+ key_id = access_key['id']
20
+ @logger.info("Create: created access key #{access_key}")
21
+ rescue Descope::AuthException => e
22
+ @logger.info("Access key creation failed #{e}")
23
+ end
24
+
25
+ begin
26
+ @logger.info('Searching for created access key')
27
+ access_key_resp = @client.load_access_key(key_id)
28
+ access_key = access_key_resp['key']
29
+ @logger.info("Load: found access key #{access_key}")
30
+ rescue Descope::AuthException => e
31
+ @logger.info("Access key load failed #{e}")
32
+ end
33
+
34
+ begin
35
+ @logger.info('Searching all access keys')
36
+ users_resp = @client.search_all_access_keys
37
+ access_keys = users_resp['keys']
38
+ access_keys.each do |key|
39
+ @logger.info("Search Found access key #{key}")
40
+ end
41
+ rescue Descope::AuthException => e
42
+ @logger.info("Access key load failed #{e}")
43
+ end
44
+
45
+ begin
46
+ @logger.info('Updating newly created access key')
47
+ @client.update_access_key(id: key_id, name: 'New key name')
48
+ rescue Descope::AuthException => e
49
+ @logger.info("Access key update failed #{e}")
50
+ end
51
+
52
+ begin
53
+ @logger.info('Deactivating newly created access key')
54
+ @client.deactivate_access_key(key_id)
55
+ rescue Descope::AuthException => e
56
+ @logger.info("Access key deactivate failed #{e}")
57
+ end
58
+
59
+ begin
60
+ @logger.info('Activating newly created access key')
61
+ @client.activate_access_key(key_id)
62
+ rescue Descope::AuthException => e
63
+ @logger.info("Access key activate failed #{e}")
64
+ end
65
+
66
+ begin
67
+ @logger.info('Deleting newly created access key')
68
+ @client.delete_access_key(key_id)
69
+ rescue Descope::AuthException => e
70
+ @logger.info("Access key deletion failed #{e}")
71
+ end
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'descope'
5
+
6
+ @logger = Logger.new($stdout)
7
+
8
+ @project_id = ENV['DESCOPE_PROJECT_ID']
9
+ @management_key = ENV['DESCOPE_MANAGEMENT_KEY']
10
+
11
+ @logger.info("Initializing Descope API with project_id: #{@project_id} and base_uri: #{@base_uri}")
12
+
13
+ @client = Descope::Client.new({ project_id: @project_id, management_key: @management_key })
14
+
15
+ begin
16
+ @logger.info('Going to search audit')
17
+ text = nil
18
+ text = ARGV[0] if ARGV.length > 1
19
+ from_ts = nil
20
+ from_ts = DateTime.iso8601(ARGV[1]) if ARGV.length > 2
21
+ res = @client.audit_search(text:, from_ts:)
22
+ @logger.info("Audit search result: #{res}")
23
+ rescue Descope::AuthException => e
24
+ @logger.error("Audit search failed #{e}")
25
+ end
@@ -0,0 +1,135 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'descope'
5
+
6
+ @logger = Logger.new($stdout)
7
+
8
+ @project_id = ENV['DESCOPE_PROJECT_ID']
9
+ @management_key = ENV['DESCOPE_MANAGEMENT_KEY']
10
+
11
+ @logger.info("Initializing Descope API with project_id: #{@project_id} and base_uri: #{@base_uri}")
12
+
13
+ @client = Descope::Client.new({ project_id: @project_id, management_key: @management_key })
14
+
15
+ begin
16
+ @logger.info('Creating test authz schema if different name')
17
+ schema = @client.authz_load_schema
18
+ File.open('./authz_files.json', 'rt') do |f|
19
+ schema_from_file = JSON.parse(f.read)
20
+ if schema['name'] != schema_from_file['name']
21
+ @logger.info('Schema is different, upgrading...')
22
+ @client.authz_save_schema(schema: schema_from_file, upgrade: true)
23
+ @client.authz_create_relations(
24
+ [
25
+ {
26
+ "resource": 'Dev',
27
+ "relationDefinition": 'parent',
28
+ "namespace": 'org',
29
+ "target": 'Descope'
30
+ },
31
+ {
32
+ "resource": 'Sales',
33
+ "relationDefinition": 'parent',
34
+ "namespace": 'org',
35
+ "target": 'Descope'
36
+ },
37
+ {
38
+ "resource": 'Dev',
39
+ "relationDefinition": 'member',
40
+ "namespace": 'org',
41
+ "target": 'u1'
42
+ },
43
+ {
44
+ "resource": 'Dev',
45
+ "relationDefinition": 'member',
46
+ "namespace": 'org',
47
+ "target": 'u3'
48
+ },
49
+ {
50
+ "resource": 'Sales',
51
+ "relationDefinition": 'member',
52
+ "namespace": 'org',
53
+ "target": 'u2'
54
+ },
55
+ {
56
+ "resource": 'Presentations',
57
+ "relationDefinition": 'parent',
58
+ "namespace": 'folder',
59
+ "target": 'Internal'
60
+ },
61
+ {
62
+ "resource": 'roadmap.ppt',
63
+ "relationDefinition": 'parent',
64
+ "namespace": 'doc',
65
+ "target": 'Presentations'
66
+ },
67
+ {
68
+ "resource": 'roadmap.ppt',
69
+ "relationDefinition": 'owner',
70
+ "namespace": 'doc',
71
+ "target": 'u1'
72
+ },
73
+ {
74
+ "resource": 'Internal',
75
+ "relationDefinition": 'viewer',
76
+ "namespace": 'folder',
77
+ "targetSetResource": 'Descope',
78
+ "targetSetRelationDefinition": 'member',
79
+ "targetSetRelationDefinitionNamespace": 'org'
80
+ },
81
+ {
82
+ "resource": 'Presentations',
83
+ "relationDefinition": 'editor',
84
+ "namespace": 'folder',
85
+ "targetSetResource": 'Sales',
86
+ "targetSetRelationDefinition": 'member',
87
+ "targetSetRelationDefinitionNamespace": 'org'
88
+ }
89
+ ]
90
+ )
91
+ end
92
+
93
+ res = @client.authz_has_relations?([
94
+ {
95
+ "resource": 'roadmap.ppt',
96
+ "relationDefinition": 'owner',
97
+ "namespace": 'doc',
98
+ "target": 'u1'
99
+ },
100
+ {
101
+ "resource": 'roadmap.ppt',
102
+ "relationDefinition": 'editor',
103
+ "namespace": 'doc',
104
+ "target": 'u1'
105
+ },
106
+ {
107
+ "resource": 'roadmap.ppt',
108
+ "relationDefinition": 'viewer',
109
+ "namespace": 'doc',
110
+ "target": 'u1'
111
+ },
112
+ {
113
+ "resource": 'roadmap.ppt',
114
+ "relationDefinition": 'viewer',
115
+ "namespace": 'doc',
116
+ "target": 'u3'
117
+ },
118
+ {
119
+ "resource": 'roadmap.ppt',
120
+ "relationDefinition": 'editor',
121
+ "namespace": 'doc',
122
+ "target": 'u3'
123
+ },
124
+ {
125
+ "resource": 'roadmap.ppt',
126
+ "relationDefinition": 'editor',
127
+ "namespace": 'doc',
128
+ "target": 'u2'
129
+ }
130
+ ])
131
+ @logger.info("Checking existing relations: #{res}")
132
+ rescue Descope::AuthException => e
133
+ @logger.error("Audit search failed #{e}")
134
+ end
135
+ end