auth0 4.17.0 → 5.20.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.
Files changed (357) hide show
  1. checksums.yaml +4 -4
  2. data/.version +1 -0
  3. data/CHANGELOG.md +407 -22
  4. data/README.md +80 -178
  5. data/auth0.gemspec +10 -15
  6. data/lib/auth0/api/authentication_endpoints.rb +162 -249
  7. data/lib/auth0/api/v2/actions.rb +209 -0
  8. data/lib/auth0/api/v2/attack_protection.rb +79 -0
  9. data/lib/auth0/api/v2/branding.rb +65 -0
  10. data/lib/auth0/api/v2/client_grants.rb +27 -2
  11. data/lib/auth0/api/v2/clients.rb +42 -0
  12. data/lib/auth0/api/v2/connections.rb +14 -5
  13. data/lib/auth0/api/v2/device_credentials.rb +12 -7
  14. data/lib/auth0/api/v2/grants.rb +49 -0
  15. data/lib/auth0/api/v2/jobs.rb +18 -5
  16. data/lib/auth0/api/v2/logs.rb +2 -2
  17. data/lib/auth0/api/v2/organizations.rb +407 -0
  18. data/lib/auth0/api/v2/refresh_tokens.rb +34 -0
  19. data/lib/auth0/api/v2/roles.rb +7 -3
  20. data/lib/auth0/api/v2/sessions.rb +43 -0
  21. data/lib/auth0/api/v2/tickets.rb +14 -2
  22. data/lib/auth0/api/v2/users.rb +203 -12
  23. data/lib/auth0/api/v2.rb +18 -4
  24. data/lib/auth0/client_assertion.rb +45 -0
  25. data/lib/auth0/exception.rb +17 -8
  26. data/lib/auth0/mixins/access_token_struct.rb +2 -2
  27. data/lib/auth0/mixins/api_token_struct.rb +2 -3
  28. data/lib/auth0/mixins/httpproxy.rb +98 -36
  29. data/lib/auth0/mixins/initializer.rb +6 -9
  30. data/lib/auth0/mixins/permission_struct.rb +2 -2
  31. data/lib/auth0/mixins/token_management.rb +35 -0
  32. data/lib/auth0/mixins/validation.rb +33 -6
  33. data/lib/auth0/mixins.rb +2 -1
  34. data/lib/auth0/version.rb +1 -1
  35. metadata +58 -632
  36. data/.bundle/config +0 -4
  37. data/.circleci/config.yml +0 -23
  38. data/.env.example +0 -2
  39. data/.gemrelease +0 -2
  40. data/.github/CODEOWNERS +0 -1
  41. data/.github/ISSUE_TEMPLATE.md +0 -39
  42. data/.github/PULL_REQUEST_TEMPLATE.md +0 -35
  43. data/.github/stale.yml +0 -20
  44. data/.gitignore +0 -14
  45. data/.rspec +0 -3
  46. data/.rubocop.yml +0 -10
  47. data/.rubocop_todo.yml +0 -5
  48. data/CODE_OF_CONDUCT.md +0 -3
  49. data/DEPLOYMENT.md +0 -61
  50. data/Dockerfile +0 -5
  51. data/Gemfile +0 -19
  52. data/Gemfile.lock +0 -227
  53. data/Guardfile +0 -37
  54. data/RUBYGEM.md +0 -9
  55. data/Rakefile +0 -53
  56. data/codecov.yml +0 -22
  57. data/deploy_documentation.sh +0 -29
  58. data/doc_config/templates/default/fulldoc/html/css/full_list.css +0 -79
  59. data/doc_config/templates/default/fulldoc/html/css/style.css +0 -546
  60. data/doc_config/templates/default/layout/html/breadcrumb.erb +0 -11
  61. data/doc_config/templates/default/layout/html/footer.erb +0 -115
  62. data/doc_config/templates/default/layout/html/headers.erb +0 -17
  63. data/doc_config/templates/default/layout/html/layout.erb +0 -27
  64. data/examples/ruby-api/.env.example +0 -2
  65. data/examples/ruby-api/.gitignore +0 -86
  66. data/examples/ruby-api/Gemfile +0 -8
  67. data/examples/ruby-api/README.md +0 -24
  68. data/examples/ruby-api/config.ru +0 -2
  69. data/examples/ruby-api/main.rb +0 -33
  70. data/examples/ruby-on-rails-api/.env.example +0 -2
  71. data/examples/ruby-on-rails-api/.gitignore +0 -18
  72. data/examples/ruby-on-rails-api/Gemfile +0 -48
  73. data/examples/ruby-on-rails-api/README.md +0 -27
  74. data/examples/ruby-on-rails-api/Rakefile +0 -6
  75. data/examples/ruby-on-rails-api/app/assets/images/.keep +0 -0
  76. data/examples/ruby-on-rails-api/app/assets/javascripts/application.js +0 -16
  77. data/examples/ruby-on-rails-api/app/assets/stylesheets/application.css +0 -15
  78. data/examples/ruby-on-rails-api/app/controllers/application_controller.rb +0 -8
  79. data/examples/ruby-on-rails-api/app/controllers/concerns/.keep +0 -0
  80. data/examples/ruby-on-rails-api/app/controllers/ping_controller.rb +0 -6
  81. data/examples/ruby-on-rails-api/app/controllers/secured_ping_controller.rb +0 -11
  82. data/examples/ruby-on-rails-api/app/helpers/application_helper.rb +0 -3
  83. data/examples/ruby-on-rails-api/app/mailers/.keep +0 -0
  84. data/examples/ruby-on-rails-api/app/models/.keep +0 -0
  85. data/examples/ruby-on-rails-api/app/models/User.rb +0 -5
  86. data/examples/ruby-on-rails-api/app/models/concerns/.keep +0 -0
  87. data/examples/ruby-on-rails-api/app/views/layouts/application.html.erb +0 -14
  88. data/examples/ruby-on-rails-api/bin/bundle +0 -3
  89. data/examples/ruby-on-rails-api/bin/rails +0 -4
  90. data/examples/ruby-on-rails-api/bin/rake +0 -4
  91. data/examples/ruby-on-rails-api/bin/setup +0 -29
  92. data/examples/ruby-on-rails-api/config/application.rb +0 -23
  93. data/examples/ruby-on-rails-api/config/boot.rb +0 -4
  94. data/examples/ruby-on-rails-api/config/database.yml +0 -27
  95. data/examples/ruby-on-rails-api/config/environment.rb +0 -5
  96. data/examples/ruby-on-rails-api/config/environments/development.rb +0 -37
  97. data/examples/ruby-on-rails-api/config/environments/production.rb +0 -83
  98. data/examples/ruby-on-rails-api/config/environments/test.rb +0 -41
  99. data/examples/ruby-on-rails-api/config/initializers/backtrace_silencers.rb +0 -7
  100. data/examples/ruby-on-rails-api/config/initializers/cookies_serializer.rb +0 -3
  101. data/examples/ruby-on-rails-api/config/initializers/dotenv.rb +0 -4
  102. data/examples/ruby-on-rails-api/config/initializers/filter_parameter_logging.rb +0 -4
  103. data/examples/ruby-on-rails-api/config/initializers/inflections.rb +0 -16
  104. data/examples/ruby-on-rails-api/config/initializers/knock.rb +0 -35
  105. data/examples/ruby-on-rails-api/config/initializers/mime_types.rb +0 -4
  106. data/examples/ruby-on-rails-api/config/initializers/session_store.rb +0 -3
  107. data/examples/ruby-on-rails-api/config/initializers/wrap_parameters.rb +0 -14
  108. data/examples/ruby-on-rails-api/config/locales/en.yml +0 -23
  109. data/examples/ruby-on-rails-api/config/routes.rb +0 -58
  110. data/examples/ruby-on-rails-api/config/secrets.yml +0 -28
  111. data/examples/ruby-on-rails-api/config.ru +0 -4
  112. data/examples/ruby-on-rails-api/db/schema.rb +0 -15
  113. data/examples/ruby-on-rails-api/db/seeds.rb +0 -7
  114. data/examples/ruby-on-rails-api/lib/assets/.keep +0 -0
  115. data/examples/ruby-on-rails-api/lib/tasks/.keep +0 -0
  116. data/examples/ruby-on-rails-api/log/.keep +0 -0
  117. data/examples/ruby-on-rails-api/public/404.html +0 -67
  118. data/examples/ruby-on-rails-api/public/422.html +0 -67
  119. data/examples/ruby-on-rails-api/public/500.html +0 -66
  120. data/examples/ruby-on-rails-api/public/favicon.ico +0 -0
  121. data/examples/ruby-on-rails-api/public/robots.txt +0 -5
  122. data/examples/ruby-on-rails-api/test/controllers/.keep +0 -0
  123. data/examples/ruby-on-rails-api/test/fixtures/.keep +0 -0
  124. data/examples/ruby-on-rails-api/test/helpers/.keep +0 -0
  125. data/examples/ruby-on-rails-api/test/integration/.keep +0 -0
  126. data/examples/ruby-on-rails-api/test/mailers/.keep +0 -0
  127. data/examples/ruby-on-rails-api/test/models/.keep +0 -0
  128. data/examples/ruby-on-rails-api/test/ping_controller_test.rb +0 -8
  129. data/examples/ruby-on-rails-api/test/secured_ping_controller_test.rb +0 -26
  130. data/examples/ruby-on-rails-api/test/test_helper.rb +0 -16
  131. data/lib/auth0/api/v1/clients.rb +0 -58
  132. data/lib/auth0/api/v1/connections.rb +0 -68
  133. data/lib/auth0/api/v1/logs.rb +0 -43
  134. data/lib/auth0/api/v1/rules.rb +0 -57
  135. data/lib/auth0/api/v1/users.rb +0 -227
  136. data/lib/auth0/api/v1.rb +0 -19
  137. data/publish_rubygem.sh +0 -10
  138. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_change_password/should_trigger_a_password_reset.yml +0 -63
  139. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_email.yml +0 -54
  140. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_password.yml +0 -54
  141. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_invalid_audience.yml +0 -55
  142. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_custom_audience.yml +0 -117
  143. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_default_scope.yml +0 -119
  144. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_saml_metadata/should_retrieve_SAML_metadata.yml +0 -57
  145. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_fail_as_not_authorized.yml +0 -55
  146. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_return_the_userinfo.yml +0 -118
  147. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_wsfed_metadata/should_retrieve_WSFED_metadata.yml +0 -55
  148. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/create_test_user.yml +0 -58
  149. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/delete_test_user.yml +0 -54
  150. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Anomaly/_check_if_ip_is_blocked/should_return_200_response_code.yml +0 -65
  151. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Anomaly/_remove_ip_block/should_remove_an_IP_successfully.yml +0 -60
  152. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_add_token_to_blacklist/should_add_a_token_to_the_blacklist.yml +0 -56
  153. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_blacklisted_tokens/should_get_the_added_token_from_the_blacklist.yml +0 -59
  154. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_at_least_1_result.yml +0 -62
  155. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_the_first_page_of_one_result.yml +0 -66
  156. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_the_test_client_grant.yml +0 -62
  157. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_delete_client_grant/should_delete_the_test_client_grant.yml +0 -54
  158. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_patch_client_grant/should_update_the_test_client_grant.yml +0 -64
  159. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client.yml +0 -118
  160. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client_grant.yml +0 -64
  161. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client.yml +0 -54
  162. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client_grant.yml +0 -54
  163. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_exclude_and_include_fields_properly.yml +0 -91
  164. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_include_the_specified_fields.yml +0 -63
  165. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/should_get_the_test_client.yml +0 -92
  166. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_fields_not_specified.yml +0 -60
  167. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_the_specified_fields.yml +0 -132
  168. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_include_the_specified_fields.yml +0 -63
  169. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_paginate_results.yml +0 -65
  170. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/should_get_at_least_one_client.yml +0 -132
  171. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_delete_client/should_delete_the_test_client_without_an_error.yml +0 -54
  172. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_patch_client/should_update_the_client_with_the_correct_attributes.yml +0 -94
  173. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/create_test_client.yml +0 -118
  174. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_exclude_the_fields_indicated.yml +0 -63
  175. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_include_the_fields_indicated.yml +0 -61
  176. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/should_find_the_correct_connection.yml +0 -63
  177. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_include_previously-created_connection_when_filtered.yml +0 -59
  178. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_exclude_the_fields_indicated_from_filtered_results.yml +0 -59
  179. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_include_the_fields_indicated_from_filtered_results.yml +0 -59
  180. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_include_the_previously_created_connection.yml +0 -59
  181. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_not_be_empty.yml +0 -59
  182. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection/should_delete_the_connection.yml +0 -54
  183. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection_user/should_delete_the_user_created.yml +0 -110
  184. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_update_connection/should_update_the_connection.yml +0 -66
  185. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_connection.yml +0 -65
  186. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_user.yml +0 -68
  187. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_delete_device_credential/should_delete_the_test_credential_without_an_error.yml +0 -54
  188. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/_filter_by_type/should_exclude_the_test_credential.yml +0 -59
  189. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/should_have_at_least_1_entry.yml +0 -62
  190. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/should_include_the_test_credential.yml +0 -62
  191. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_credential.yml +0 -62
  192. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_user.yml +0 -68
  193. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/delete_test_credential.yml +0 -54
  194. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/delete_test_user.yml +0 -54
  195. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_configure_provider/should_configure_a_new_email_provider.yml +0 -63
  196. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_delete_the_existing_email_provider_without_an_error.yml +0 -54
  197. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_throw_an_error_trying_to_get_the_email_provider.yml +0 -51
  198. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_with_specific_fields.yml +0 -60
  199. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_without_specific_fields.yml +0 -61
  200. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/should_get_the_existing_email_provider.yml +0 -61
  201. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_update_provider/should_update_the_existing_email_provider.yml +0 -63
  202. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/delete_existing_provider.yml +0 -54
  203. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_create_an_export_users_job_successfully.yml +0 -61
  204. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_get_the_export_users_job.yml +0 -117
  205. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_create_an_import_users_job_successfully.yml +0 -60
  206. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_get_the_import_users_job.yml +0 -116
  207. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_create_a_new_verification_email_job.yml +0 -119
  208. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_get_the_completed_verification_email.yml +0 -175
  209. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_reject_an_invalid_client_id.yml +0 -109
  210. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/delete_imported_user.yml +0 -110
  211. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/search_for_connection_id.yml +0 -59
  212. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_match_the_created_log_entry.yml +0 -265
  213. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_not_be_empty.yml +0 -265
  214. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_fields_not_specified.yml +0 -61
  215. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_the_specified_fields.yml +0 -75
  216. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_have_one_log_entry.yml +0 -76
  217. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_include_the_specified_fields.yml +0 -62
  218. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_from/should_take_one_log_entry.yml +0 -258
  219. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/create_test_user.yml +0 -68
  220. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_disabled_rule.yml +0 -54
  221. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_enabled_rule.yml +0 -54
  222. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_user.yml +0 -54
  223. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_delete_resource_server/should_delete_the_test_server_without_an_error.yml +0 -54
  224. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_patch_resource_server/should_update_the_resource_server_with_the_correct_attributes.yml +0 -61
  225. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_server/should_get_the_test_server.yml +0 -59
  226. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_get_the_test_server.yml +0 -59
  227. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_at_least_1_result.yml +0 -59
  228. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_the_first_page_of_one_result.yml +0 -64
  229. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/create_test_server.yml +0 -61
  230. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/delete_test_server.yml +0 -54
  231. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_permissions/should_add_a_Permission_to_the_Role_successfully.yml +0 -69
  232. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_users/should_add_a_User_to_the_Role_successfully.yml +0 -69
  233. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_delete_role/should_delete_the_Role_successfully.yml +0 -62
  234. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role/should_get_the_Role_successfully.yml +0 -67
  235. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_exactly_1_Permission.yml +0 -67
  236. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_the_added_Permission_from_the_Role_successfully.yml +0 -67
  237. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_exactly_1_User.yml +0 -67
  238. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_the_added_User_from_the_Role_successfully.yml +0 -67
  239. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_roles/should_get_the_Role_successfully.yml +0 -67
  240. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_remove_role_permissions/should_remove_a_Permission_from_the_Role_successfully.yml +0 -64
  241. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_update_role/should_update_the_Role_successfully.yml +0 -69
  242. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_api.yml +0 -69
  243. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_role.yml +0 -69
  244. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_user.yml +0 -69
  245. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_api.yml +0 -62
  246. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_user.yml +0 -62
  247. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_disabled_rule_without_an_error.yml +0 -54
  248. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_enabled_rule_without_an_error.yml +0 -54
  249. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_fields_not_specified.yml +0 -62
  250. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_specified_fields.yml +0 -62
  251. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_include_the_specified_fields.yml +0 -61
  252. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/should_get_a_specific_rule.yml +0 -62
  253. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_exclude_fields_not_specified.yml +0 -60
  254. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_include_the_specified_fields.yml +0 -61
  255. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_disabled_rule.yml +0 -63
  256. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_enabled_rule.yml +0 -62
  257. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_paginated_results.yml +0 -128
  258. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/should_return_at_least_1_rule.yml +0 -64
  259. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_update_rule/should_update_the_disabled_rule_to_be_enabled.yml +0 -64
  260. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_disabled_rule.yml +0 -65
  261. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_enabled_rule.yml +0 -65
  262. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_active_users/should_have_at_least_one_active_user.yml +0 -59
  263. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_daily_stats/should_have_at_least_one_stats_entry_for_the_timeframe.yml +0 -63
  264. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings/should_get_the_tenant_settings.yml +0 -95
  265. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_exclude_a_field_not_requested.yml +0 -61
  266. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_include_the_field_requested.yml +0 -61
  267. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_revert_the_tenant_name.yml +0 -96
  268. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_update_the_tenant_settings_with_a_new_tenant_name.yml +0 -96
  269. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_email_verification/should_create_an_email_verification_ticket.yml +0 -63
  270. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_password_change/should_create_a_password_change_ticket.yml +0 -63
  271. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/create_test_user.yml +0 -68
  272. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/delete_test_user.yml +0 -54
  273. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_permissions/should_add_a_Permissions_for_a_User_successfully.yml +0 -67
  274. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_roles/should_add_a_Role_to_a_User_successfully.yml +0 -62
  275. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_User_successfully.yml +0 -60
  276. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_secondary_User_successfully.yml +0 -60
  277. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user_provider/should_attempt_to_delete_the_MFA_provider_for_the_User.yml +0 -60
  278. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_enrollments/should_get_Enrollments_for_a_User_successfully.yml +0 -65
  279. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_exactly_1_Permission_for_a_User_successfully.yml +0 -65
  280. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_the_correct_Permission_for_a_User_successfully.yml +0 -65
  281. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_roles/should_get_Roles_for_a_User_successfully.yml +0 -65
  282. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_invalidate_browsers/should_invalidate_MFA_browsers_for_the_User_successfully.yml +0 -62
  283. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_link_user_account/should_link_two_Users_successfully.yml +0 -67
  284. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_patch_user/should_patch_the_User_successfully.yml +0 -68
  285. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_permissions/should_remove_a_Permission_from_a_User_successfully.yml +0 -62
  286. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_roles/should_remove_a_Role_from_a_User_successfully.yml +0 -62
  287. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_unlink_user_account/should_unlink_two_Users_successfully.yml +0 -65
  288. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_fields_not_indicated.yml +0 -65
  289. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_the_fields_indicated.yml +0 -65
  290. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_include_the_fields_indicated.yml +0 -65
  291. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/should_retrieve_the_created_user.yml +0 -65
  292. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user_logs/should_get_Logs_for_a_User_successfully.yml +0 -69
  293. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v2_search_engine_query.yml +0 -65
  294. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v3_search_engine_query.yml +0 -65
  295. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_exclude_the_indicated_fields_when_paginated.yml +0 -65
  296. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_include_the_indicated_fields_when_paginated.yml +0 -65
  297. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_not_include_other_fields_when_paginated.yml +0 -65
  298. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_return_the_correct_number_of_results_when_paginated.yml +0 -65
  299. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/should_have_at_least_one_user.yml +0 -65
  300. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_secondary_test_user.yml +0 -67
  301. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_api.yml +0 -67
  302. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_role.yml +0 -67
  303. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_user.yml +0 -67
  304. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_api.yml +0 -60
  305. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_role.yml +0 -60
  306. data/spec/integration/lib/auth0/api/api_authentication_spec.rb +0 -120
  307. data/spec/integration/lib/auth0/api/v2/api_anomaly_spec.rb +0 -17
  308. data/spec/integration/lib/auth0/api/v2/api_blacklist_spec.rb +0 -27
  309. data/spec/integration/lib/auth0/api/v2/api_client_grants_spec.rb +0 -75
  310. data/spec/integration/lib/auth0/api/v2/api_clients_spec.rb +0 -166
  311. data/spec/integration/lib/auth0/api/v2/api_connections_spec.rb +0 -159
  312. data/spec/integration/lib/auth0/api/v2/api_device_credentials_spec.rb +0 -128
  313. data/spec/integration/lib/auth0/api/v2/api_email_spec.rb +0 -117
  314. data/spec/integration/lib/auth0/api/v2/api_jobs_spec.rb +0 -124
  315. data/spec/integration/lib/auth0/api/v2/api_logs_spec.rb +0 -91
  316. data/spec/integration/lib/auth0/api/v2/api_resource_servers_spec.rb +0 -130
  317. data/spec/integration/lib/auth0/api/v2/api_roles_spec.rb +0 -145
  318. data/spec/integration/lib/auth0/api/v2/api_rules_spec.rb +0 -177
  319. data/spec/integration/lib/auth0/api/v2/api_stats_spec.rb +0 -22
  320. data/spec/integration/lib/auth0/api/v2/api_tenants_spec.rb +0 -59
  321. data/spec/integration/lib/auth0/api/v2/api_tickets_spec.rb +0 -59
  322. data/spec/integration/lib/auth0/api/v2/api_user_blocks_spec.rb +0 -73
  323. data/spec/integration/lib/auth0/api/v2/api_users_spec.rb +0 -300
  324. data/spec/integration/lib/auth0/auth0_client_spec.rb +0 -90
  325. data/spec/lib/auth0/api/authentication_endpoints_spec.rb +0 -703
  326. data/spec/lib/auth0/api/v2/anomaly_spec.rb +0 -26
  327. data/spec/lib/auth0/api/v2/blacklists_spec.rb +0 -25
  328. data/spec/lib/auth0/api/v2/client_grants_spec.rb +0 -76
  329. data/spec/lib/auth0/api/v2/clients_spec.rb +0 -104
  330. data/spec/lib/auth0/api/v2/connections_spec.rb +0 -140
  331. data/spec/lib/auth0/api/v2/device_credentials_spec.rb +0 -73
  332. data/spec/lib/auth0/api/v2/emails_spec.rb +0 -47
  333. data/spec/lib/auth0/api/v2/guardian_spec.rb +0 -154
  334. data/spec/lib/auth0/api/v2/jobs_spec.rb +0 -128
  335. data/spec/lib/auth0/api/v2/log_streams_spec.rb +0 -84
  336. data/spec/lib/auth0/api/v2/logs_spec.rb +0 -48
  337. data/spec/lib/auth0/api/v2/prompts_spec.rb +0 -88
  338. data/spec/lib/auth0/api/v2/resource_servers_spec.rb +0 -86
  339. data/spec/lib/auth0/api/v2/roles_spec.rb +0 -362
  340. data/spec/lib/auth0/api/v2/rules_spec.rb +0 -95
  341. data/spec/lib/auth0/api/v2/stats_spec.rb +0 -22
  342. data/spec/lib/auth0/api/v2/tenants_spec.rb +0 -26
  343. data/spec/lib/auth0/api/v2/tickets_spec.rb +0 -63
  344. data/spec/lib/auth0/api/v2/user_blocks_spec.rb +0 -52
  345. data/spec/lib/auth0/api/v2/users_by_email_spec.rb +0 -21
  346. data/spec/lib/auth0/api/v2/users_spec.rb +0 -542
  347. data/spec/lib/auth0/client_spec.rb +0 -153
  348. data/spec/lib/auth0/mixins/httpproxy_spec.rb +0 -304
  349. data/spec/lib/auth0/mixins/initializer_spec.rb +0 -30
  350. data/spec/lib/auth0/mixins/validation_spec.rb +0 -466
  351. data/spec/spec_helper.rb +0 -63
  352. data/spec/support/credentials.rb +0 -30
  353. data/spec/support/dummy_class.rb +0 -18
  354. data/spec/support/dummy_class_for_proxy.rb +0 -5
  355. data/spec/support/dummy_class_for_restclient.rb +0 -2
  356. data/spec/support/import_users.json +0 -13
  357. data/spec/support/stub_response.rb +0 -1
@@ -1,7 +1,7 @@
1
1
  module Auth0
2
2
  module Api
3
3
  module V2
4
- # Methods to use the users endpoints
4
+ # Methods to use the users' endpoints
5
5
  module Users
6
6
  include Auth0::Mixins::Validation
7
7
 
@@ -43,13 +43,15 @@ module Auth0
43
43
  # The attribute connection is always mandatory but depending on the type of connection you are using there
44
44
  # could be others too. For instance, Auth0 DB Connections require email and password.
45
45
  # @see https://auth0.com/docs/api/v2#!/Users/post_users
46
- # @param name [string] The user name.
47
- # @param options [hash]
48
- # * :connection [string] The connection the user belongs to.
46
+ # @param connection [string] The connection the user belongs to.
47
+ # @param options [hash] See https://auth0.com/docs/api/management/v2#!/Users/post_users for available options
49
48
  # @return [json] Returns the created user.
50
- def create_user(name, options = {})
49
+ def create_user(connection, options = {})
50
+ if !connection.is_a?(String) || connection.empty?
51
+ raise Auth0::MissingParameter, 'Must supply a valid connection'
52
+ end
51
53
  request_params = Hash[options.map { |(k, v)| [k.to_sym, v] }]
52
- request_params[:name] = name
54
+ request_params[:connection] = connection
53
55
  post(users_path, request_params)
54
56
  end
55
57
 
@@ -92,10 +94,10 @@ module Auth0
92
94
  # Some considerations:
93
95
  # The properties of the new object will replace the old ones.
94
96
  # The metadata fields are an exception to this rule (user_metadata and app_metadata). These properties are
95
- # merged instead of being replaced but be careful, the merge only occurs on the first level.
97
+ # merged instead of being replaced, but be careful, the merge only occurs on the first level.
96
98
  # If you are updating email_verified, phone_verified, username or password you need to specify the connection
97
99
  # property too.
98
- # If your are updating email or phone_number you need to specify the connection and the client_id properties.
100
+ # If you are updating email or phone_number you need to specify the connection and the client_id properties.
99
101
  # @see https://auth0.com/docs/api/v2#!/Users/patch_users_by_id
100
102
  # @param user_id [string] The user_id of the user to update.
101
103
  # @param body [hash] The optional parameters to update.
@@ -109,6 +111,15 @@ module Auth0
109
111
  end
110
112
  alias update_user patch_user
111
113
 
114
+ # Delete all authenticators
115
+ # @see https://auth0.com/docs/api/management/v2#!/Users/delete_authenticators
116
+ # @param user_id [string] The user_id of the user to delete all authenticators
117
+ def delete_user_authenticators(user_id)
118
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
119
+ path = "#{users_path}/#{user_id}/authenticators"
120
+ delete(path)
121
+ end
122
+
112
123
  # Delete a user's multifactor provider
113
124
  # @see https://auth0.com/docs/api/v2#!/Users/delete_multifactor_by_provider
114
125
  # @param user_id [string] The user_id of the user to delete the multifactor provider from.
@@ -126,7 +137,7 @@ module Auth0
126
137
  # update:current_user_identities scope. In this case only the link_with param is required in the body,
127
138
  # containing the JWT obtained upon the secondary account's authentication.
128
139
  # 2. With an API V2 generated token with update:users scope. In this case you need to send provider and user_id
129
- # in the body. Optionally you can also send the connection_id param which is suitable for identifying a
140
+ # in the body. Optionally, you can also send the connection_id param, which is suitable for identifying a
130
141
  # particular database connection for the 'auth0' provider.
131
142
  # @see https://auth0.com/docs/api/v2#!/Users/post_identities
132
143
  # @param user_id [string] The user_id of the primary identity where you are linking the secondary account to.
@@ -213,7 +224,7 @@ module Auth0
213
224
  # @see https://auth0.com/docs/api/management/v2#!/Users/delete_user_roles
214
225
  #
215
226
  # @param user_id [string] The user_id of the roles to remove.
216
- # @param roles [array] An array of role names to remove.
227
+ # @param roles [array] An array of role ids to remove.
217
228
  def remove_user_roles(user_id, roles)
218
229
  raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
219
230
  validate_strings_array roles
@@ -294,7 +305,7 @@ module Auth0
294
305
  # @param user_id [string] The user_id of the recovery codes to regenerate.
295
306
  def generate_recovery_code(user_id)
296
307
  raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
297
- post "#{users_path}/#{user_id}/recovery-code-generation"
308
+ post "#{users_path}/#{user_id}/recovery-code-regeneration"
298
309
  end
299
310
 
300
311
  # Invalidate all remembered browsers for all authentication factors for a specific user.
@@ -306,13 +317,193 @@ module Auth0
306
317
  post "#{users_path}/#{user_id}/multifactor/actions/invalidate-remember-browser"
307
318
  end
308
319
 
320
+
321
+ # Get a list of organizations for a user.
322
+ #
323
+ # @param user_id [string] The user_id of the permissions to get.
324
+ #
325
+ # @return [json] Returns organizations for the given user_id.
326
+ def get_user_organizations(user_id)
327
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
328
+
329
+ get "#{users_path}/#{user_id}/organizations"
330
+ end
331
+
332
+ # Get the available authentication methods for a user.
333
+ #
334
+ # @param user_id [string] The user ID of the authentication methods to get
335
+ # @param options [hash] A hash of options for getting permissions
336
+ # * :per_page [integer] The amount of permissions per page. (optional)
337
+ # * :page [integer] The page number. Zero based. (optional)
338
+ # * :include_totals [boolean] True if a query summary must be included in the result. (optional)
339
+ # @return [json] The user's authentication methods
340
+ # @see https://auth0.com/docs/api/management/v2#!/Users/get_authentication_methods
341
+ def user_authentication_methods(user_id, options = {})
342
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
343
+
344
+ request_params = {
345
+ per_page: options.fetch(:per_page, nil),
346
+ page: options.fetch(:page, nil),
347
+ include_totals: options.fetch(:include_totals, nil)
348
+ }
349
+
350
+ get "#{users_path}/#{user_id}/authentication-methods", request_params
351
+ end
352
+ alias get_user_authentication_methods user_authentication_methods
353
+
354
+ # Get a specific authentication method for a user.
355
+ #
356
+ # @param user_id [string] The user ID of the authentication methods to get
357
+ # @param authentication_method_id [string] The ID of the authentication method
358
+ # @return [json] The user authentication method
359
+ # @see https://auth0.com/docs/api/management/v2#!/Users/get_authentication_methods_by_authentication_method_id
360
+ def user_authentication_method(user_id, authentication_method_id)
361
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
362
+ raise Auth0::MissingParameter, 'Must supply a valid authentication_method_id' if authentication_method_id.to_s.empty?
363
+
364
+ get "#{users_path}/#{user_id}/authentication-methods/#{authentication_method_id}"
365
+ end
366
+ alias get_user_authentication_method user_authentication_method
367
+
368
+ # Create an authentication method for a user
369
+ #
370
+ # @param user_id [string] The user ID of the authentication methods to get
371
+ # @param body [hash] The post body content
372
+ # * :type [string] "phone" or "email" or "totp" or "webauthn-roaming"
373
+ # * :name [string] A human-readable label to identify the authentication method (optional)
374
+ # * :totp_secret [string] Base32 encoded secret for TOTP generation (optional)
375
+ # * :phone_number [string] Applies to phone authentication methods only. The destination phone number used to send verification codes via text and voice (optional)
376
+ # * :email [string] Applies to email authentication methods only. The email address used to send verification messages (optional)
377
+ # * :preferred_authentication_method [string] Preferred phone authentication method (optional)
378
+ # * :key_id [string] Applies to email webauthn authenticators only. The id of the credential (optional)
379
+ # * :public_key [string] Applies to email webauthn authenticators only. The public key (optional)
380
+ # * :relying_party_identifier [string] Applies to email webauthn authenticators only. The relying party identifier (optional)
381
+ # @see https://auth0.com/docs/api/management/v2#!/Users/post_authentication_methods
382
+ def post_user_authentication_method(user_id, body)
383
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
384
+ raise Auth0::MissingParameter, 'Must supply a body' if body.to_s.empty?
385
+
386
+ post "#{users_path}/#{user_id}/authentication-methods", body
387
+ end
388
+ alias create_user_authentication_method post_user_authentication_method
389
+
390
+ # Updates all authentication methods by replacing them with the given ones
391
+ #
392
+ # @param user_id [string] The user ID of the authentication methods to get
393
+ # @param body [hash array] The mehods to update
394
+ # * :type [string] "phone" or "email" or "totp" or "webauthn-roaming"
395
+ # * :name [string] A human-readable label to identify the authentication method (optional)
396
+ # * :totp_secret [string] Base32 encoded secret for TOTP generation (optional)
397
+ # * :phone_number [string] Applies to phone authentication methods only. The destination phone number used to send verification codes via text and voice (optional)
398
+ # * :email [string] Applies to email authentication methods only. The email address used to send verification messages (optional)
399
+ # * :preferred_authentication_method [string] Preferred phone authentication method (optional)
400
+ # @see https://auth0.com/docs/api/management/v2#!/Users/put_authentication_methods
401
+ def put_all_user_authentication_methods(user_id, body)
402
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
403
+ raise Auth0::MissingParameter, 'Must supply a body' if body.to_s.empty?
404
+
405
+ put "#{users_path}/#{user_id}/authentication-methods", body
406
+ end
407
+ alias update_all_user_authentication_methods put_all_user_authentication_methods
408
+
409
+ # Updates a user authentication method
410
+ #
411
+ # @param user_id [string] The user ID of the authentication methods to get
412
+ # @param body [hash array] The mehods to update
413
+ # * :name [string] A human-readable label to identify the authentication method (optional)
414
+ # * :preferred_authentication_method [string] Preferred phone authentication method (optional)
415
+ # @see https://auth0.com/docs/api/management/v2#!/Users/put_authentication_methods
416
+ def patch_user_authentication_method(user_id, authentication_method_id, body)
417
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
418
+ raise Auth0::MissingParameter, 'Must supply an authentication_method_id' if authentication_method_id.to_s.empty?
419
+ raise Auth0::MissingParameter, 'Must supply a body' if body.to_s.empty?
420
+
421
+ patch "#{users_path}/#{user_id}/authentication-methods/#{authentication_method_id}", body
422
+ end
423
+ alias update_user_authentication_method patch_user_authentication_method
424
+
425
+ # Deletes all of the user's authentication methods
426
+ #
427
+ # @param user_id [string] The user ID
428
+ # @see https://auth0.com/docs/api/management/v2#!/Users/delete_authentication_methods
429
+ def delete_user_authentication_methods(user_id)
430
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
431
+
432
+ delete "#{users_path}/#{user_id}/authentication-methods"
433
+ end
434
+
435
+
436
+ # Deletes the user's authentication method specified by authentication_method_id
437
+ #
438
+ # @param user_id [string] The user ID
439
+ # @param authentication_method_id [string] The ID of the authentication method
440
+ # @see https://auth0.com/docs/api/management/v2#!/Users/delete_authentication_methods_by_authentication_method_id
441
+ def delete_user_authentication_method(user_id, authentication_method_id)
442
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
443
+ raise Auth0::MissingParameter, 'Must supply an authentication_method_id' if authentication_method_id.to_s.empty?
444
+
445
+ delete "#{users_path}/#{user_id}/authentication-methods/#{authentication_method_id}"
446
+ end
447
+
448
+ # Delete all sessions for a user.
449
+ #
450
+ # @param user_id [string] The user ID
451
+ # @see https://auth0.com/docs/api/management/v2/users/delete-sessions-for-user
452
+ def delete_user_sessions(user_id)
453
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
454
+
455
+ delete "#{users_path}/#{user_id}/sessions"
456
+ end
457
+
458
+ # Retrieve details for a user's sessions.
459
+ #
460
+ # @param user_id [string] The user ID
461
+ # @see https://auth0.com/docs/api/management/v2/users/get-sessions-for-user
462
+ def user_sessions(user_id)
463
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
464
+
465
+ get "#{users_path}/#{user_id}/sessions"
466
+ end
467
+
468
+ # Retrieve details for a user's refresh tokens.
469
+ # @see https://auth0.com/docs/api/management/v2/users/get-refresh-tokens-for-user
470
+ #
471
+ # @param use_id [String] The user ID
472
+ # @param options [hash] A hash of options for getting permissions
473
+ # * :take [Integer] Number of results per page. Defaults to 50.
474
+ # * :from [String] Optional token ID from which to start selection (exclusive).
475
+ # * :include_totals [boolean] Return results inside an object that contains the total result count (true)
476
+ # or as a direct array of results (false, default)
477
+ #
478
+ # @return [json] Returns refresh tokens for the given user_id.
479
+ def user_refresh_tokens(user_id, options = {})
480
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
481
+
482
+ request_params = {
483
+ take: options.fetch(:take, nil),
484
+ from: options.fetch(:from, nil),
485
+ include_totals: options.fetch(:include_totals, nil)
486
+ }
487
+
488
+ get "#{users_path}/#{user_id}/refresh-tokens", request_params
489
+ end
490
+
491
+ # Delete all refresh tokens for a user.
492
+ #
493
+ # @param user_id [String] ID of the user to get remove refresh tokens for
494
+ # @see https://auth0.com/docs/api/management/v2/users/delete-refresh-tokens-for-user
495
+ def delete_user_refresh_tokens(user_id)
496
+ raise Auth0::MissingUserId, 'Must supply a valid user_id' if user_id.to_s.empty?
497
+
498
+ delete "#{users_path}/#{user_id}/refresh-tokens"
499
+ end
500
+
309
501
  private
310
502
 
311
503
  # Users API path
312
504
  def users_path
313
505
  @users_path ||= '/api/v2/users'
314
506
  end
315
-
316
507
  end
317
508
  end
318
509
  end
data/lib/auth0/api/v2.rb CHANGED
@@ -1,5 +1,8 @@
1
+ require 'auth0/api/v2/grants'
2
+ require 'auth0/api/v2/actions'
1
3
  require 'auth0/api/v2/anomaly'
2
4
  require 'auth0/api/v2/blacklists'
5
+ require 'auth0/api/v2/branding'
3
6
  require 'auth0/api/v2/clients'
4
7
  require 'auth0/api/v2/client_grants'
5
8
  require 'auth0/api/v2/connections'
@@ -7,6 +10,8 @@ require 'auth0/api/v2/device_credentials'
7
10
  require 'auth0/api/v2/emails'
8
11
  require 'auth0/api/v2/jobs'
9
12
  require 'auth0/api/v2/prompts'
13
+ require 'auth0/api/v2/organizations'
14
+ require 'auth0/api/v2/refresh_tokens'
10
15
  require 'auth0/api/v2/rules'
11
16
  require 'auth0/api/v2/roles'
12
17
  require 'auth0/api/v2/stats'
@@ -19,32 +24,41 @@ require 'auth0/api/v2/logs'
19
24
  require 'auth0/api/v2/log_streams'
20
25
  require 'auth0/api/v2/resource_servers'
21
26
  require 'auth0/api/v2/guardian'
27
+ require 'auth0/api/v2/attack_protection'
28
+ require 'auth0/api/v2/sessions'
22
29
 
23
30
  module Auth0
24
31
  module Api
25
32
  # https://auth0.com/docs/apiv2
26
33
  module V2
34
+ include Auth0::Api::V2::Grants
35
+ include Auth0::Api::V2::Actions
27
36
  include Auth0::Api::V2::Anomaly
28
37
  include Auth0::Api::V2::Blacklists
38
+ include Auth0::Api::V2::Branding
29
39
  include Auth0::Api::V2::Clients
30
40
  include Auth0::Api::V2::ClientGrants
31
41
  include Auth0::Api::V2::Connections
32
42
  include Auth0::Api::V2::DeviceCredentials
33
43
  include Auth0::Api::V2::Emails
44
+ include Auth0::Api::V2::Guardian
34
45
  include Auth0::Api::V2::Jobs
46
+ include Auth0::Api::V2::Logs
47
+ include Auth0::Api::V2::LogStreams
35
48
  include Auth0::Api::V2::Prompts
49
+ include Auth0::Api::V2::Organizations
50
+ include Auth0::Api::V2::RefreshTokens
36
51
  include Auth0::Api::V2::Rules
37
52
  include Auth0::Api::V2::Roles
38
53
  include Auth0::Api::V2::Stats
39
54
  include Auth0::Api::V2::Users
40
55
  include Auth0::Api::V2::UsersByEmail
41
56
  include Auth0::Api::V2::UserBlocks
57
+ include Auth0::Api::V2::ResourceServers
42
58
  include Auth0::Api::V2::Tenants
43
59
  include Auth0::Api::V2::Tickets
44
- include Auth0::Api::V2::Logs
45
- include Auth0::Api::V2::LogStreams
46
- include Auth0::Api::V2::ResourceServers
47
- include Auth0::Api::V2::Guardian
60
+ include Auth0::Api::V2::AttackProtection
61
+ include Auth0::Api::V2::Sessions
48
62
  end
49
63
  end
50
64
  end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'jwt'
4
+
5
+ module Auth0
6
+ module ClientAssertion
7
+ CLIENT_ASSERTION_TYPE = 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer'.freeze
8
+
9
+ # Adds keys into the supplied hash for either the client secret, or client assertion. If `client_assertion_signing_key` is not nil,
10
+ # it takes precedence over `client_secret`.
11
+ # @param [hash] The hash to add the keys to
12
+ # @param client_id [string] The client ID
13
+ # @param client_secret [string] The client secret
14
+ # @param client_assertion_signing_key [PKey] The key used to sign the client assertion JWT
15
+ # @param client_assertion_signing_alg [string] The algorithm used when signing the client assertion JWT
16
+ def populate_client_assertion_or_secret(hash,
17
+ domain: @domain,
18
+ client_id: @client_id,
19
+ client_secret: @client_secret,
20
+ client_assertion_signing_key: @client_assertion_signing_key,
21
+ client_assertion_signing_alg: @client_assertion_signing_alg)
22
+
23
+ if !client_assertion_signing_key.nil?
24
+ # Create JWT
25
+ now = Time.now.to_i
26
+
27
+ payload = {
28
+ iss: client_id,
29
+ sub: client_id,
30
+ aud: "https://#{domain}/",
31
+ iat: now,
32
+ exp: now + 180,
33
+ jti: SecureRandom.uuid
34
+ }
35
+
36
+ jwt = JWT.encode payload, client_assertion_signing_key, client_assertion_signing_alg
37
+
38
+ hash[:client_assertion] = jwt
39
+ hash[:client_assertion_type] = Auth0::ClientAssertion::CLIENT_ASSERTION_TYPE
40
+ else
41
+ hash[:client_secret] = client_secret
42
+ end
43
+ end
44
+ end
45
+ end
@@ -38,25 +38,34 @@ module Auth0
38
38
  class MissingUserId < Auth0::Exception; end
39
39
  # exception for unset client_id
40
40
  class MissingClientId < Auth0::Exception; end
41
+ # exception for unset organization_id
42
+ class MissingOrganizationId < Auth0::Exception; end
43
+ # exception for unset trigger_id
44
+ class MissingTriggerId < Auth0::Exception; end
45
+ # exception for unset action_name
46
+ class MissingActionName < Auth0::Exception; end
47
+ # exception for unset action_id
48
+ class MissingActionId < Auth0::Exception; end
49
+ # exception for unset execution_id
50
+ class MissingExecutionId < Auth0::Exception; end
51
+ # exception for unset trigger_id
52
+ class MissingTriggerId < Auth0::Exception; end
41
53
  # exception for an unset parameter
42
54
  class MissingParameter < Auth0::Exception; end
55
+ # exception for unset version_id
56
+ class MissingVersionId < Auth0::Exception; end
43
57
  # Api v2 access denied
44
58
  class AccessDenied < Auth0::HTTPError; end
45
59
  # Invalid parameter passed, e.g. empty where ID is required
46
60
  class InvalidParameter < Auth0::Exception; end
47
- # Invalid Auth0 credentials either client_id/secret for API v1
48
- # or JWT for API v2/
61
+ # Invalid JWT
49
62
  class InvalidCredentials < Auth0::Exception; end
50
63
  # Invalid Auth0 API namespace
51
64
  class InvalidApiNamespace < Auth0::Exception; end
52
65
  # Auth0 API rate-limiting encountered
53
- # TODO: When making API-breaking changes, make this a subclass
54
- # of Auth0::HTTPError directly rather than Auth0::Unsupported.
55
- # It's currently under Unsupported to avoid breaking compatibility
56
- # with prior gem versions that treated 429 errors as unknown errors.
57
- class RateLimitEncountered < Auth0::Unsupported
66
+ class RateLimitEncountered < Auth0::HTTPError
58
67
  def reset
59
- Time.at(headers['X-RateLimit-Reset']).utc
68
+ Time.at(Integer(headers[:x_ratelimit_reset])).utc
60
69
  end
61
70
  end
62
71
 
@@ -1,4 +1,4 @@
1
- AccessToken = Struct.new(
1
+ Auth0::AccessToken = Struct.new(
2
2
  :access_token,
3
3
  :expires_in,
4
4
  :refresh_token,
@@ -17,4 +17,4 @@ AccessToken = Struct.new(
17
17
  def token
18
18
  access_token
19
19
  end
20
- end
20
+ end
@@ -1,5 +1,4 @@
1
- ApiToken = Struct.new :access_token, :scope, :expires_in do
2
-
1
+ Auth0::ApiToken = Struct.new :access_token, :scope, :expires_in do
3
2
  def token
4
3
  access_token
5
4
  end
@@ -7,4 +6,4 @@ ApiToken = Struct.new :access_token, :scope, :expires_in do
7
6
  def scopes
8
7
  scope.split
9
8
  end
10
- end
9
+ end
@@ -1,46 +1,55 @@
1
- require "addressable/uri"
1
+ # frozen_string_literal: true
2
+
3
+ require 'addressable/uri'
4
+ require 'retryable'
5
+ require_relative '../exception'
2
6
 
3
7
  module Auth0
4
8
  module Mixins
5
9
  # here's the proxy for Rest calls based on rest-client, we're building all request on that gem
6
10
  # for now, if you want to feel free to use your own http client
7
11
  module HTTPProxy
8
- attr_accessor :headers, :base_uri, :timeout
12
+ attr_accessor :headers, :base_uri, :timeout, :retry_count
13
+
14
+ DEFAULT_RETRIES = 3
15
+ MAX_ALLOWED_RETRIES = 10
16
+ MAX_REQUEST_RETRY_JITTER = 250
17
+ MAX_REQUEST_RETRY_DELAY = 1000
18
+ MIN_REQUEST_RETRY_DELAY = 250
19
+ BASE_DELAY = 100
9
20
 
10
21
  # proxying requests from instance methods to HTTP class methods
11
- %i(get post post_file put patch delete delete_with_body).each do |method|
12
- define_method(method) do |path, body = {}, extra_headers = {}|
13
- safe_path = Addressable::URI.escape(path)
14
- body = body.delete_if { |_, v| v.nil? }
15
- result = if method == :get
16
- # Mutate the headers property to add parameters.
17
- add_headers({params: body})
18
- # Merge custom headers into existing ones for this req.
19
- # This prevents future calls from using them.
20
- get_headers = headers.merge extra_headers
21
- # Make the call with extra_headers, if provided.
22
- call(:get, url(safe_path), timeout, get_headers)
23
- elsif method == :delete
24
- call(:delete, url(safe_path), timeout, add_headers({params: body}))
25
- elsif method == :delete_with_body
26
- call(:delete, url(safe_path), timeout, headers, body.to_json)
27
- elsif method == :post_file
28
- body.merge!(multipart: true)
29
- call(:post, url(safe_path), timeout, headers, body)
30
- else
31
- call(method, url(safe_path), timeout, headers, body.to_json)
32
- end
33
- case result.code
34
- when 200...226 then safe_parse_json(result.body)
35
- when 400 then raise Auth0::BadRequest.new(result.body, code: result.code, headers: result.headers)
36
- when 401 then raise Auth0::Unauthorized.new(result.body, code: result.code, headers: result.headers)
37
- when 403 then raise Auth0::AccessDenied.new(result.body, code: result.code, headers: result.headers)
38
- when 404 then raise Auth0::NotFound.new(result.body, code: result.code, headers: result.headers)
39
- when 429 then raise Auth0::RateLimitEncountered.new(result.body, code: result.code, headers: result.headers)
40
- when 500 then raise Auth0::ServerError.new(result.body, code: result.code, headers: result.headers)
41
- else raise Auth0::Unsupported.new(result.body, code: result.code, headers: result.headers)
42
- end
22
+ %i[get post post_file post_form put patch delete delete_with_body].each do |method|
23
+ define_method(method) do |uri, body = {}, extra_headers = {}|
24
+ body = safe_merge_body(body, extra_headers)
25
+ token = get_token
26
+ authorization_header(token) unless token.nil?
27
+ request_with_retry(method, uri, body, extra_headers)
28
+ end
29
+ end
30
+
31
+ def retry_options
32
+ sleep_timer = lambda do |attempt|
33
+ wait = BASE_DELAY * (2**attempt - 1) # Exponential delay with each subsequent request attempt.
34
+ wait += rand(wait + 1..wait + MAX_REQUEST_RETRY_JITTER) # Add jitter to the delay window.
35
+ wait = [MAX_REQUEST_RETRY_DELAY, wait].min # Cap delay at MAX_REQUEST_RETRY_DELAY.
36
+ wait = [MIN_REQUEST_RETRY_DELAY, wait].max # Ensure delay is no less than MIN_REQUEST_RETRY_DELAY.
37
+ wait / 1000.to_f.round(2) # convert ms to seconds
43
38
  end
39
+
40
+ tries = 1 + [Integer(retry_count || DEFAULT_RETRIES), MAX_ALLOWED_RETRIES].min # Cap retries at MAX_ALLOWED_RETRIES
41
+
42
+ {
43
+ tries: tries,
44
+ sleep: sleep_timer,
45
+ on: Auth0::RateLimitEncountered
46
+ }
47
+ end
48
+
49
+ def encode_uri(uri)
50
+ # if a base_uri is set then the uri can be encoded as a path
51
+ path = base_uri ? Addressable::URI.new(path: uri).normalized_path : Addressable::URI.escape(uri)
52
+ url(path)
44
53
  end
45
54
 
46
55
  def url(path)
@@ -49,6 +58,7 @@ module Auth0
49
58
 
50
59
  def add_headers(h = {})
51
60
  raise ArgumentError, 'Headers must be an object which responds to #to_hash' unless h.respond_to?(:to_hash)
61
+
52
62
  @headers ||= {}
53
63
  @headers.merge!(h.to_hash)
54
64
  end
@@ -59,6 +69,50 @@ module Auth0
59
69
  body
60
70
  end
61
71
 
72
+ def request_with_retry(method, uri, body = {}, extra_headers = {})
73
+ Retryable.retryable(retry_options) do
74
+ request(method, uri, body, extra_headers)
75
+ end
76
+ end
77
+
78
+ def request(method, uri, body = {}, extra_headers = {})
79
+ result = case method
80
+ when :get
81
+ @headers ||= {}
82
+ get_headers = @headers.merge({ params: body }).merge(extra_headers)
83
+ call(:get, encode_uri(uri), timeout, get_headers)
84
+ when :delete
85
+ @headers ||= {}
86
+ delete_headers = @headers.merge({ params: body })
87
+ call(:delete, encode_uri(uri), timeout, delete_headers)
88
+ when :delete_with_body
89
+ call(:delete, encode_uri(uri), timeout, headers, body.to_json)
90
+ when :post_file
91
+ body.merge!(multipart: true)
92
+ # Ignore the default Content-Type headers and let the HTTP client define them
93
+ post_file_headers = headers.except('Content-Type') unless headers.nil?
94
+ # Actual call with the altered headers
95
+ call(:post, encode_uri(uri), timeout, post_file_headers, body)
96
+ when :post_form
97
+ form_post_headers = headers.except('Content-Type') unless headers.nil?
98
+ call(:post, encode_uri(uri), timeout, form_post_headers, body.compact)
99
+ else
100
+ call(method, encode_uri(uri), timeout, headers, body.to_json)
101
+ end
102
+
103
+ case result.code
104
+ when 200...226 then safe_parse_json(result.body)
105
+ when 400 then raise Auth0::BadRequest.new(result.body, code: result.code, headers: result.headers)
106
+ when 401 then raise Auth0::Unauthorized.new(result.body, code: result.code, headers: result.headers)
107
+ when 403 then raise Auth0::AccessDenied.new(result.body, code: result.code, headers: result.headers)
108
+ when 404 then raise Auth0::NotFound.new(result.body, code: result.code, headers: result.headers)
109
+ when 429 then raise Auth0::RateLimitEncountered.new(result.body, code: result.code,
110
+ headers: result.headers)
111
+ when 500 then raise Auth0::ServerError.new(result.body, code: result.code, headers: result.headers)
112
+ else raise Auth0::Unsupported.new(result.body, code: result.code, headers: result.headers)
113
+ end
114
+ end
115
+
62
116
  def call(method, url, timeout, headers, body = nil)
63
117
  RestClient::Request.execute(
64
118
  method: method,
@@ -70,11 +124,19 @@ module Auth0
70
124
  rescue RestClient::Exception => e
71
125
  case e
72
126
  when RestClient::RequestTimeout
73
- raise Auth0::RequestTimeout.new(e.message)
127
+ raise Auth0::RequestTimeout, e.message
74
128
  else
75
- return e.response
129
+ e.response
76
130
  end
77
131
  end
132
+
133
+ private
134
+
135
+ def safe_merge_body(body, extra = {})
136
+ return body unless body.is_a?(Hash)
137
+ merged = extra.any? ? body.merge(extra) : body
138
+ merged.compact
139
+ end
78
140
  end
79
141
  end
80
142
  end
@@ -15,9 +15,13 @@ module Auth0
15
15
  @base_uri = base_url(options)
16
16
  @headers = client_headers
17
17
  @timeout = options[:timeout] || 10
18
+ @retry_count = options[:retry_count]
19
+ @client_assertion_signing_key = options[:client_assertion_signing_key]
20
+ @client_assertion_signing_alg = options[:client_assertion_signing_alg] || 'RS256';
18
21
  extend Auth0::Api::AuthenticationEndpoints
19
22
  @client_id = options[:client_id]
20
23
  @client_secret = options[:client_secret]
24
+ @organization = options[:organization]
21
25
  initialize_api(options)
22
26
  end
23
27
 
@@ -40,7 +44,7 @@ module Auth0
40
44
  private
41
45
 
42
46
  def initialize_api(options)
43
- api_v2?(options) ? initialize_v2(options) : initialize_v1
47
+ initialize_v2(options)
44
48
  raise InvalidCredentials, 'Must supply a valid API token' if @token.nil?
45
49
  if options.fetch(:authorization, nil) == 'Basic'
46
50
  authorization_header_basic(options)
@@ -57,14 +61,7 @@ module Auth0
57
61
 
58
62
  def initialize_v2(options)
59
63
  extend Auth0::Api::V2
60
- @token = options[:access_token] || options[:token]
61
- @token = api_token.token if @token.nil? && @client_id && @client_secret
62
- end
63
-
64
- def initialize_v1
65
- extend Auth0::Api::V1
66
- raise InvalidCredentials, 'Invalid API v1 client_id and client_secret' if @client_id.nil? || @client_secret.nil?
67
- @token = obtain_access_token
64
+ initialize_token(options)
68
65
  end
69
66
 
70
67
  def api_v2?(options)