auth0 4.4.0 → 5.1.2

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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/.bundle/config +3 -2
  3. data/.circleci/config.yml +44 -0
  4. data/.env.example +2 -0
  5. data/.github/CODEOWNERS +1 -0
  6. data/.github/ISSUE_TEMPLATE/config.yml +8 -0
  7. data/.github/ISSUE_TEMPLATE/feature_request.md +39 -0
  8. data/.github/ISSUE_TEMPLATE/report_a_bug.md +55 -0
  9. data/.github/PULL_REQUEST_TEMPLATE.md +35 -0
  10. data/.github/stale.yml +20 -0
  11. data/.gitignore +1 -2
  12. data/.rubocop.yml +2 -0
  13. data/.yardoc/checksums +22 -0
  14. data/.yardoc/complete +0 -0
  15. data/.yardoc/object_types +0 -0
  16. data/.yardoc/objects/root.dat +0 -0
  17. data/.yardoc/proxy_types +0 -0
  18. data/CHANGELOG.md +334 -19
  19. data/CODE_OF_CONDUCT.md +3 -0
  20. data/DEPLOYMENT.md +56 -9
  21. data/Gemfile +10 -3
  22. data/README.md +260 -37
  23. data/Rakefile +4 -23
  24. data/auth0.gemspec +10 -9
  25. data/codecov.yml +22 -0
  26. data/examples/ruby-api/.gitignore +0 -6
  27. data/lib/auth0/algorithm.rb +5 -0
  28. data/lib/auth0/api/authentication_endpoints.rb +244 -237
  29. data/lib/auth0/api/v2/anomaly.rb +36 -0
  30. data/lib/auth0/api/v2/branding.rb +66 -0
  31. data/lib/auth0/api/v2/client_grants.rb +14 -5
  32. data/lib/auth0/api/v2/clients.rb +9 -6
  33. data/lib/auth0/api/v2/connections.rb +19 -7
  34. data/lib/auth0/api/v2/device_credentials.rb +5 -4
  35. data/lib/auth0/api/v2/guardian.rb +142 -0
  36. data/lib/auth0/api/v2/jobs.rb +77 -13
  37. data/lib/auth0/api/v2/log_streams.rb +78 -0
  38. data/lib/auth0/api/v2/logs.rb +11 -11
  39. data/lib/auth0/api/v2/organizations.rb +335 -0
  40. data/lib/auth0/api/v2/prompts.rb +70 -0
  41. data/lib/auth0/api/v2/resource_servers.rb +32 -8
  42. data/lib/auth0/api/v2/roles.rb +172 -0
  43. data/lib/auth0/api/v2/rules.rb +6 -2
  44. data/lib/auth0/api/v2/tickets.rb +55 -8
  45. data/lib/auth0/api/v2/users.rb +168 -28
  46. data/lib/auth0/api/v2/users_by_email.rb +3 -2
  47. data/lib/auth0/api/v2.rb +16 -2
  48. data/lib/auth0/client.rb +1 -1
  49. data/lib/auth0/exception.rb +34 -9
  50. data/lib/auth0/mixins/access_token_struct.rb +20 -0
  51. data/lib/auth0/mixins/api_token_struct.rb +10 -0
  52. data/lib/auth0/mixins/headers.rb +35 -0
  53. data/lib/auth0/mixins/httpproxy.rb +37 -14
  54. data/lib/auth0/mixins/initializer.rb +10 -26
  55. data/lib/auth0/mixins/permission_struct.rb +3 -0
  56. data/lib/auth0/mixins/validation.rb +346 -0
  57. data/lib/auth0/mixins.rb +9 -1
  58. data/lib/auth0/version.rb +1 -1
  59. data/lib/auth0.rb +1 -0
  60. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_change_password/should_trigger_a_password_reset.yml +63 -0
  61. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_email.yml +54 -0
  62. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_password.yml +54 -0
  63. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_invalid_audience.yml +55 -0
  64. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_custom_audience.yml +117 -0
  65. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_default_scope.yml +119 -0
  66. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_saml_metadata/should_retrieve_SAML_metadata.yml +57 -0
  67. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_fail_as_not_authorized.yml +55 -0
  68. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_return_the_userinfo.yml +118 -0
  69. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_wsfed_metadata/should_retrieve_WSFED_metadata.yml +55 -0
  70. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/create_test_user.yml +58 -0
  71. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/delete_test_user.yml +54 -0
  72. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Anomaly/_check_if_ip_is_blocked/should_return_200_response_code.yml +65 -0
  73. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Anomaly/_remove_ip_block/should_remove_an_IP_successfully.yml +60 -0
  74. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_add_token_to_blacklist/should_add_a_token_to_the_blacklist.yml +56 -0
  75. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_blacklisted_tokens/should_get_the_added_token_from_the_blacklist.yml +59 -0
  76. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_at_least_1_result.yml +62 -0
  77. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_the_first_page_of_one_result.yml +66 -0
  78. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_the_test_client_grant.yml +62 -0
  79. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_delete_client_grant/should_delete_the_test_client_grant.yml +54 -0
  80. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_patch_client_grant/should_update_the_test_client_grant.yml +64 -0
  81. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client.yml +118 -0
  82. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client_grant.yml +64 -0
  83. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client.yml +54 -0
  84. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client_grant.yml +54 -0
  85. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_exclude_and_include_fields_properly.yml +91 -0
  86. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_include_the_specified_fields.yml +63 -0
  87. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/should_get_the_test_client.yml +92 -0
  88. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_fields_not_specified.yml +60 -0
  89. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_the_specified_fields.yml +132 -0
  90. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_include_the_specified_fields.yml +63 -0
  91. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_paginate_results.yml +65 -0
  92. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/should_get_at_least_one_client.yml +132 -0
  93. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_delete_client/should_delete_the_test_client_without_an_error.yml +54 -0
  94. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_patch_client/should_update_the_client_with_the_correct_attributes.yml +94 -0
  95. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/create_test_client.yml +118 -0
  96. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_exclude_the_fields_indicated.yml +63 -0
  97. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_include_the_fields_indicated.yml +61 -0
  98. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/should_find_the_correct_connection.yml +63 -0
  99. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_include_previously-created_connection_when_filtered.yml +59 -0
  100. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_exclude_the_fields_indicated_from_filtered_results.yml +59 -0
  101. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_include_the_fields_indicated_from_filtered_results.yml +59 -0
  102. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_include_the_previously_created_connection.yml +59 -0
  103. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_not_be_empty.yml +59 -0
  104. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection/should_delete_the_connection.yml +54 -0
  105. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection_user/should_delete_the_user_created.yml +110 -0
  106. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_update_connection/should_update_the_connection.yml +66 -0
  107. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_connection.yml +65 -0
  108. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_user.yml +68 -0
  109. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_delete_device_credential/should_delete_the_test_credential_without_an_error.yml +54 -0
  110. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/_filter_by_type/should_exclude_the_test_credential.yml +59 -0
  111. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/should_have_at_least_1_entry.yml +62 -0
  112. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/should_include_the_test_credential.yml +62 -0
  113. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_credential.yml +62 -0
  114. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_user.yml +68 -0
  115. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/delete_test_credential.yml +54 -0
  116. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/delete_test_user.yml +54 -0
  117. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_configure_provider/should_configure_a_new_email_provider.yml +63 -0
  118. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_delete_the_existing_email_provider_without_an_error.yml +54 -0
  119. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_throw_an_error_trying_to_get_the_email_provider.yml +51 -0
  120. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_with_specific_fields.yml +60 -0
  121. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_without_specific_fields.yml +61 -0
  122. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/should_get_the_existing_email_provider.yml +61 -0
  123. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_update_provider/should_update_the_existing_email_provider.yml +63 -0
  124. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/delete_existing_provider.yml +54 -0
  125. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_create_an_export_users_job_successfully.yml +61 -0
  126. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_get_the_export_users_job.yml +117 -0
  127. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_create_an_import_users_job_successfully.yml +60 -0
  128. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_get_the_import_users_job.yml +116 -0
  129. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_create_a_new_verification_email_job.yml +119 -0
  130. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_get_the_completed_verification_email.yml +175 -0
  131. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_reject_an_invalid_client_id.yml +109 -0
  132. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/delete_imported_user.yml +110 -0
  133. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/search_for_connection_id.yml +59 -0
  134. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_match_the_created_log_entry.yml +265 -0
  135. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_not_be_empty.yml +265 -0
  136. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_fields_not_specified.yml +61 -0
  137. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_the_specified_fields.yml +75 -0
  138. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_have_one_log_entry.yml +76 -0
  139. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_include_the_specified_fields.yml +62 -0
  140. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_from/should_take_one_log_entry.yml +258 -0
  141. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/create_test_user.yml +68 -0
  142. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_disabled_rule.yml +54 -0
  143. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_enabled_rule.yml +54 -0
  144. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_user.yml +54 -0
  145. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_delete_resource_server/should_delete_the_test_server_without_an_error.yml +54 -0
  146. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_patch_resource_server/should_update_the_resource_server_with_the_correct_attributes.yml +61 -0
  147. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_server/should_get_the_test_server.yml +59 -0
  148. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_get_the_test_server.yml +59 -0
  149. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_at_least_1_result.yml +59 -0
  150. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_the_first_page_of_one_result.yml +64 -0
  151. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/create_test_server.yml +61 -0
  152. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/delete_test_server.yml +54 -0
  153. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_permissions/should_add_a_Permission_to_the_Role_successfully.yml +69 -0
  154. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_users/should_add_a_User_to_the_Role_successfully.yml +69 -0
  155. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_delete_role/should_delete_the_Role_successfully.yml +62 -0
  156. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role/should_get_the_Role_successfully.yml +67 -0
  157. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_exactly_1_Permission.yml +67 -0
  158. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_the_added_Permission_from_the_Role_successfully.yml +67 -0
  159. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_exactly_1_User.yml +67 -0
  160. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_the_added_User_from_the_Role_successfully.yml +67 -0
  161. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_roles/should_get_the_Role_successfully.yml +67 -0
  162. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_remove_role_permissions/should_remove_a_Permission_from_the_Role_successfully.yml +64 -0
  163. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_update_role/should_update_the_Role_successfully.yml +69 -0
  164. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_api.yml +69 -0
  165. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_role.yml +69 -0
  166. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_user.yml +69 -0
  167. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_api.yml +62 -0
  168. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_user.yml +62 -0
  169. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_disabled_rule_without_an_error.yml +54 -0
  170. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_enabled_rule_without_an_error.yml +54 -0
  171. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_fields_not_specified.yml +62 -0
  172. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_specified_fields.yml +62 -0
  173. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_include_the_specified_fields.yml +61 -0
  174. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/should_get_a_specific_rule.yml +62 -0
  175. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_exclude_fields_not_specified.yml +60 -0
  176. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_include_the_specified_fields.yml +61 -0
  177. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_disabled_rule.yml +63 -0
  178. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_enabled_rule.yml +62 -0
  179. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_paginated_results.yml +128 -0
  180. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/should_return_at_least_1_rule.yml +64 -0
  181. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_update_rule/should_update_the_disabled_rule_to_be_enabled.yml +64 -0
  182. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_disabled_rule.yml +65 -0
  183. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_enabled_rule.yml +65 -0
  184. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_active_users/should_have_at_least_one_active_user.yml +59 -0
  185. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_daily_stats/should_have_at_least_one_stats_entry_for_the_timeframe.yml +63 -0
  186. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings/should_get_the_tenant_settings.yml +95 -0
  187. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_exclude_a_field_not_requested.yml +61 -0
  188. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_include_the_field_requested.yml +61 -0
  189. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_revert_the_tenant_name.yml +96 -0
  190. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_update_the_tenant_settings_with_a_new_tenant_name.yml +96 -0
  191. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_email_verification/should_create_an_email_verification_ticket.yml +63 -0
  192. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_password_change/should_create_a_password_change_ticket.yml +63 -0
  193. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/create_test_user.yml +68 -0
  194. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/delete_test_user.yml +54 -0
  195. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_permissions/should_add_a_Permissions_for_a_User_successfully.yml +67 -0
  196. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_roles/should_add_a_Role_to_a_User_successfully.yml +62 -0
  197. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_User_successfully.yml +60 -0
  198. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_secondary_User_successfully.yml +60 -0
  199. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user_provider/should_attempt_to_delete_the_MFA_provider_for_the_User.yml +60 -0
  200. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_enrollments/should_get_Enrollments_for_a_User_successfully.yml +65 -0
  201. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_exactly_1_Permission_for_a_User_successfully.yml +65 -0
  202. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_the_correct_Permission_for_a_User_successfully.yml +65 -0
  203. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_roles/should_get_Roles_for_a_User_successfully.yml +65 -0
  204. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_invalidate_browsers/should_invalidate_MFA_browsers_for_the_User_successfully.yml +62 -0
  205. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_link_user_account/should_link_two_Users_successfully.yml +67 -0
  206. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_patch_user/should_patch_the_User_successfully.yml +68 -0
  207. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_permissions/should_remove_a_Permission_from_a_User_successfully.yml +62 -0
  208. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_roles/should_remove_a_Role_from_a_User_successfully.yml +62 -0
  209. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_unlink_user_account/should_unlink_two_Users_successfully.yml +65 -0
  210. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_fields_not_indicated.yml +65 -0
  211. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_the_fields_indicated.yml +65 -0
  212. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_include_the_fields_indicated.yml +65 -0
  213. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/should_retrieve_the_created_user.yml +65 -0
  214. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user_logs/should_get_Logs_for_a_User_successfully.yml +69 -0
  215. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v2_search_engine_query.yml +65 -0
  216. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v3_search_engine_query.yml +65 -0
  217. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_exclude_the_indicated_fields_when_paginated.yml +65 -0
  218. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_include_the_indicated_fields_when_paginated.yml +65 -0
  219. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_not_include_other_fields_when_paginated.yml +65 -0
  220. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_return_the_correct_number_of_results_when_paginated.yml +65 -0
  221. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/should_have_at_least_one_user.yml +65 -0
  222. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_secondary_test_user.yml +67 -0
  223. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_api.yml +67 -0
  224. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_role.yml +67 -0
  225. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_user.yml +67 -0
  226. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_api.yml +60 -0
  227. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_role.yml +60 -0
  228. data/spec/integration/lib/auth0/api/api_authentication_spec.rb +96 -54
  229. data/spec/integration/lib/auth0/api/v2/api_anomaly_spec.rb +17 -0
  230. data/spec/integration/lib/auth0/api/v2/api_blacklist_spec.rb +18 -5
  231. data/spec/integration/lib/auth0/api/v2/api_client_grants_spec.rb +46 -33
  232. data/spec/integration/lib/auth0/api/v2/api_clients_spec.rb +115 -61
  233. data/spec/integration/lib/auth0/api/v2/api_connections_spec.rb +117 -103
  234. data/spec/integration/lib/auth0/api/v2/api_device_credentials_spec.rb +101 -58
  235. data/spec/integration/lib/auth0/api/v2/api_email_spec.rb +72 -77
  236. data/spec/integration/lib/auth0/api/v2/api_jobs_spec.rb +113 -60
  237. data/spec/integration/lib/auth0/api/v2/api_logs_spec.rb +46 -38
  238. data/spec/integration/lib/auth0/api/v2/api_resource_servers_spec.rb +110 -40
  239. data/spec/integration/lib/auth0/api/v2/api_roles_spec.rb +145 -0
  240. data/spec/integration/lib/auth0/api/v2/api_rules_spec.rb +119 -62
  241. data/spec/integration/lib/auth0/api/v2/api_stats_spec.rb +11 -14
  242. data/spec/integration/lib/auth0/api/v2/api_tenants_spec.rb +40 -34
  243. data/spec/integration/lib/auth0/api/v2/api_tickets_spec.rb +42 -28
  244. data/spec/integration/lib/auth0/api/v2/api_user_blocks_spec.rb +1 -1
  245. data/spec/integration/lib/auth0/api/v2/api_users_spec.rb +252 -120
  246. data/spec/integration/lib/auth0/auth0_client_spec.rb +32 -26
  247. data/spec/lib/auth0/api/v2/anomaly_spec.rb +26 -0
  248. data/spec/lib/auth0/api/v2/branding_spec.rb +70 -0
  249. data/spec/lib/auth0/api/v2/client_grants_spec.rb +34 -2
  250. data/spec/lib/auth0/api/v2/clients_spec.rb +50 -5
  251. data/spec/lib/auth0/api/v2/connections_spec.rb +49 -1
  252. data/spec/lib/auth0/api/v2/guardian_spec.rb +154 -0
  253. data/spec/lib/auth0/api/v2/jobs_spec.rb +109 -6
  254. data/spec/lib/auth0/api/v2/log_streams_spec.rb +84 -0
  255. data/spec/lib/auth0/api/v2/organizations_spec.rb +593 -0
  256. data/spec/lib/auth0/api/v2/prompts_spec.rb +88 -0
  257. data/spec/lib/auth0/api/v2/resource_servers_spec.rb +23 -0
  258. data/spec/lib/auth0/api/v2/roles_spec.rb +362 -0
  259. data/spec/lib/auth0/api/v2/rules_spec.rb +23 -1
  260. data/spec/lib/auth0/api/v2/tickets_spec.rb +95 -5
  261. data/spec/lib/auth0/api/v2/users_spec.rb +465 -61
  262. data/spec/lib/auth0/client_spec.rb +196 -18
  263. data/spec/lib/auth0/mixins/httpproxy_spec.rb +83 -4
  264. data/spec/lib/auth0/mixins/initializer_spec.rb +1 -0
  265. data/spec/lib/auth0/mixins/validation_spec.rb +498 -0
  266. data/spec/spec_helper.rb +54 -11
  267. data/spec/support/credentials.rb +6 -18
  268. data/spec/support/dummy_class.rb +7 -3
  269. data/spec/support/dummy_class_for_proxy.rb +1 -0
  270. data/spec/support/stub_response.rb +1 -1
  271. metadata +497 -53
  272. data/.travis.yml +0 -18
  273. data/build_travis.sh +0 -7
  274. data/deploy_documentation.sh +0 -29
  275. data/doc_config/templates/default/fulldoc/html/css/full_list.css +0 -79
  276. data/doc_config/templates/default/fulldoc/html/css/style.css +0 -546
  277. data/doc_config/templates/default/layout/html/breadcrumb.erb +0 -11
  278. data/doc_config/templates/default/layout/html/footer.erb +0 -115
  279. data/doc_config/templates/default/layout/html/headers.erb +0 -17
  280. data/doc_config/templates/default/layout/html/layout.erb +0 -27
  281. data/lib/auth0/api/v1/clients.rb +0 -48
  282. data/lib/auth0/api/v1/connections.rb +0 -53
  283. data/lib/auth0/api/v1/logs.rb +0 -34
  284. data/lib/auth0/api/v1/rules.rb +0 -45
  285. data/lib/auth0/api/v1/users.rb +0 -164
  286. data/lib/auth0/api/v1.rb +0 -19
  287. data/spec/lib/auth0/api/authentication_endpoints_spec.rb +0 -348
  288. data/spec/spec_helper_full.rb +0 -45
  289. data/spec/spec_helper_unit.rb +0 -3
@@ -1,314 +1,276 @@
1
+ # frozen_string_literal: true
1
2
  # rubocop:disable Metrics/ModuleLength
3
+
4
+ require 'jwt'
5
+
2
6
  module Auth0
3
7
  module Api
4
- # {https://auth0.com/docs/auth-api}
5
- # Methods to use the authentication endpoints
8
+ # {https://auth0.com/docs/api/authentication}
9
+ # Methods to use the Authentication API
6
10
  module AuthenticationEndpoints
7
11
  UP_AUTH = 'Username-Password-Authentication'.freeze
8
12
  JWT_BEARER = 'urn:ietf:params:oauth:grant-type:jwt-bearer'.freeze
9
13
 
10
- # Retrives an access token
11
- # @see https://auth0.com/docs/auth-api#!#post--oauth-access_token
12
- # @param access_token [string] Social provider's access_token
13
- # @param connection [string] Currently, this endpoint only works for Facebook, Google, Twitter and Weibo
14
- # @return [json] Returns the access token
15
- def obtain_access_token(access_token = nil, connection = 'facebook', scope = 'openid')
16
- if access_token
17
- request_params = { client_id: @client_id, access_token: access_token, connection: connection, scope: scope }
18
- post('/oauth/access_token', request_params)['access_token']
19
- else
20
- request_params = { client_id: @client_id, client_secret: @client_secret, grant_type: 'client_credentials' }
21
- post('/oauth/token', request_params)['access_token']
22
- end
14
+ # Request an API access token using a Client Credentials grant
15
+ # @see https://auth0.com/docs/api-auth/tutorials/client-credentials
16
+ # @param audience [string] API audience to use
17
+ # @param organization [string] Organization ID
18
+ # @return [json] Returns the API token
19
+ def api_token(
20
+ client_id: @client_id,
21
+ client_secret: @client_secret,
22
+ organization: @organization,
23
+ audience: nil
24
+ )
25
+
26
+ request_params = {
27
+ grant_type: 'client_credentials',
28
+ client_id: client_id,
29
+ client_secret: client_secret,
30
+ audience: audience,
31
+ organization: organization
32
+ }
33
+
34
+ response = post('/oauth/token', request_params)
35
+ ::Auth0::ApiToken.new(response['access_token'], response['scope'], response['expires_in'])
23
36
  end
24
37
 
25
- # Gets the user tokens using the code obtained through passive authentication in the specified connection
26
- # @see https://auth0.com/docs/auth-api#!#post--oauth-access_token
27
- # @param connection [string] Currently, this endpoint only works for Facebook, Google, Twitter and Weibo
28
- # @param scope [string] Defaults to openid. Can be 'openid name email', 'openid offline_access'
29
- # @param redirect_uri [string] Url to redirect after authorization
30
- # @param redirect_uri [string] The access code obtained through passive authentication
31
- # @return [json] Returns the access_token and id_token
32
- def obtain_user_tokens(code, redirect_uri, connection = 'facebook', scope = 'openid')
33
- raise Auth0::InvalidParameter, 'Must supply a valid code' if code.to_s.empty?
34
- raise Auth0::InvalidParameter, 'Must supply a valid redirect_uri' if redirect_uri.to_s.empty?
38
+ # Get access and ID tokens using an Authorization Code.
39
+ # @see https://auth0.com/docs/api/authentication#authorization-code
40
+ # @param code [string] The authentication code obtained from /authorize
41
+ # @param redirect_uri [string] URL to redirect to after authorization.
42
+ # Required only if it was set at the GET /authorize endpoint
43
+ # @param client_id [string] Client ID for the Application
44
+ # @param client_secret [string] Client Secret for the Application.
45
+ # @return [Auth0::AccessToken] Returns the access_token and id_token
46
+ def exchange_auth_code_for_tokens(
47
+ code,
48
+ redirect_uri: nil,
49
+ client_id: @client_id,
50
+ client_secret: @client_secret
51
+ )
52
+ raise Auth0::InvalidParameter, 'Must provide an authorization code' if code.to_s.empty?
53
+
35
54
  request_params = {
36
- client_id: @client_id,
37
- client_secret: @client_secret,
38
- connection: connection,
39
- grant_type: 'authorization_code',
40
- code: code,
41
- scope: scope,
42
- redirect_uri: redirect_uri
55
+ grant_type: 'authorization_code',
56
+ client_id: client_id,
57
+ client_secret: client_secret,
58
+ code: code,
59
+ redirect_uri: redirect_uri
43
60
  }
44
- post('/oauth/token', request_params)
61
+ ::Auth0::AccessToken.from_response post('/oauth/token', request_params)
45
62
  end
46
63
 
47
- # Logins using username/password
48
- # @see https://auth0.com/docs/auth-api#!#post--oauth-ro
49
- # @param username [string] Username
50
- # @param password [string] User's password
51
- # @param scope [string] Defaults to openid. Can be 'openid name email', 'openid offline_access'
52
- # @param id_token [string] Token's id
53
- # @param connection_name [string] Connection name. Works for database connections, passwordless connections,
54
- # Active Directory/LDAP, Windows Azure AD and ADF
55
- # @return [json] Returns the access token and id token
56
- def login(username, password, id_token = nil, connection_name = UP_AUTH, options = {})
57
- raise Auth0::InvalidParameter, 'Must supply a valid username' if username.to_s.empty?
58
- raise Auth0::InvalidParameter, 'Must supply a valid password' if password.to_s.empty?
64
+ # Get access and ID tokens using a refresh token.
65
+ # @see https://auth0.com/docs/api/authentication#refresh-token
66
+ # @param refresh_token [string] Refresh token to use. Request this with
67
+ # the offline_access scope when logging in.
68
+ # @param client_id [string] Client ID for the Application
69
+ # @param client_secret [string] Client Secret for the Application.
70
+ # Required when the Application's Token Endpoint Authentication Method
71
+ # is Post or Basic.
72
+ # @return [Auth0::AccessToken] Returns tokens allowed in the refresh_token
73
+ def exchange_refresh_token(
74
+ refresh_token,
75
+ client_id: @client_id,
76
+ client_secret: @client_secret
77
+ )
78
+ raise Auth0::InvalidParameter, 'Must provide a refresh token' if refresh_token.to_s.empty?
79
+
59
80
  request_params = {
60
- client_id: @client_id,
61
- client_secret: @client_secret,
62
- username: username,
63
- password: password,
64
- scope: options.fetch(:scope, 'openid'),
65
- connection: connection_name,
66
- grant_type: options.fetch(:grant_type, password),
67
- id_token: id_token,
68
- device: options.fetch(:device, nil)
81
+ grant_type: 'refresh_token',
82
+ client_id: client_id,
83
+ client_secret: client_secret,
84
+ refresh_token: refresh_token
69
85
  }
70
- post('/oauth/token', request_params)
86
+ ::Auth0::AccessToken.from_response post('/oauth/token', request_params)
71
87
  end
72
88
 
73
- # Signup using username/password
74
- # @see https://auth0.com/docs/auth-api#!#post--dbconnections-signup
75
- # @param email [string] User email
76
- # @param password [string] User's password
77
- # @param connection_name [string] Connection name. Works for database connections.
89
+ # rubocop:disable Metrics/ParameterLists
90
+ # Get access and ID tokens using Resource Owner Password.
91
+ # Requires that your tenant has a Default Audience or Default Directory.
92
+ # @see https://auth0.com/docs/api/authentication#resource-owner-password
93
+ # @param login_name [string] Email or username for the connection
94
+ # @param password [string] Password
95
+ # @param client_id [string] Client ID from Application settings
96
+ # @param client_secret [string] Client Secret from Application settings
97
+ # @param realm [string] Specific realm to authenticate against
98
+ # @param audience [string] API audience
99
+ # @param scope [string] Scope(s) requested
100
+ # - Include an audience (above) for API access scopes
101
+ # - Use the default "openid" for userinfo calls
102
+ # @return [json] Returns the access_token and id_token
103
+ def login_with_resource_owner(
104
+ login_name,
105
+ password,
106
+ client_id: @client_id,
107
+ client_secret: @client_secret,
108
+ realm: nil,
109
+ audience: nil,
110
+ scope: 'openid'
111
+ )
112
+
113
+ raise Auth0::InvalidParameter, 'Must supply a valid login_name' if login_name.empty?
114
+ raise Auth0::InvalidParameter, 'Must supply a valid password' if password.empty?
115
+
116
+ request_params = {
117
+ username: login_name,
118
+ password: password,
119
+ client_id: client_id,
120
+ client_secret: client_secret,
121
+ realm: realm,
122
+ scope: scope,
123
+ audience: audience,
124
+ grant_type: realm ? 'http://auth0.com/oauth/grant-type/password-realm' : 'password'
125
+ }
126
+ ::Auth0::AccessToken.from_response post('/oauth/token', request_params)
127
+ end
128
+ # rubocop:enable Metrics/ParameterLists
129
+
130
+ # Sign up with a database connection using a username and password.
131
+ # @see https://auth0.com/docs/api/authentication#signup
132
+ # @param email [string] New user's email
133
+ # @param password [string] New user's password
134
+ # @param connection_name [string] Database connection name
78
135
  # @return [json] Returns the created user
79
136
  def signup(email, password, connection_name = UP_AUTH)
80
137
  raise Auth0::InvalidParameter, 'Must supply a valid email' if email.to_s.empty?
81
138
  raise Auth0::InvalidParameter, 'Must supply a valid password' if password.to_s.empty?
139
+
82
140
  request_params = {
83
- client_id: @client_id,
84
- email: email,
141
+ email: email,
142
+ password: password,
85
143
  connection: connection_name,
86
- password: password
144
+ client_id: @client_id
87
145
  }
88
146
  post('/dbconnections/signup', request_params)
89
147
  end
90
148
 
91
- # Asks to change a password for a given user.
92
- # Send an email to the user.
93
- # @see https://auth0.com/docs/auth-api#!#post--dbconnections-change_password
94
- # @param email [string] User email
95
- # @param password [string] User's new password
96
- # @param connection_name [string] Connection name. Works for database connections.
149
+ # Change a user's password or trigger a password reset email.
150
+ # @see https://auth0.com/docs/api/authentication#change-password
151
+ # @see https://auth0.com/docs/connections/database/password-change
152
+ # @param email [string] User's current email
153
+ # @param password [string] User's new password; empty to trigger a
154
+ # password reset email
155
+ # @param connection_name [string] Database connection name
97
156
  def change_password(email, password, connection_name = UP_AUTH)
98
157
  raise Auth0::InvalidParameter, 'Must supply a valid email' if email.to_s.empty?
158
+
99
159
  request_params = {
100
- client_id: @client_id,
101
- email: email,
160
+ email: email,
161
+ password: password,
102
162
  connection: connection_name,
103
- password: password
163
+ client_id: @client_id
104
164
  }
105
165
  post('/dbconnections/change_password', request_params)
106
166
  end
107
167
 
108
- # Start passwordless workflow sending an email
109
- # @see https://auth0.com/docs/auth-api#!#post--with_email
110
- # @param email [string] User email
111
- # @param send [string] Defaults to 'link'. Can be 'code'. You can then authenticate with this user opening the link
112
- # @param auth_params [hash] Append/override parameters to the link (like scope, redirect_uri, protocol, etc.)
168
+ # Start Passwordless email login flow.
169
+ # @see https://auth0.com/docs/api/authentication#get-code-or-link
170
+ # @see https://auth0.com/docs/connections/passwordless#passwordless-on-regular-web-apps
171
+ # @param email [string] Email to send a link or code
172
+ # @param send [string] Pass 'link' to send a magic link, 'code' to send a code
173
+ # @param auth_params [hash] Append or override the magic link parameters
113
174
  def start_passwordless_email_flow(email, send = 'link', auth_params = {})
114
175
  raise Auth0::InvalidParameter, 'Must supply a valid email' if email.to_s.empty?
176
+
115
177
  request_params = {
116
- client_id: @client_id,
117
- connection: 'email',
118
- email: email,
119
- send: send,
120
- authParams: auth_params
178
+ email: email,
179
+ send: send,
180
+ authParams: auth_params,
181
+ connection: 'email',
182
+ client_id: @client_id,
183
+ client_secret: @client_secret
121
184
  }
122
185
  post('/passwordless/start', request_params)
123
186
  end
124
187
 
125
- # Start passwordless workflow sending a SMS message
126
- # @see https://auth0.com/docs/auth-api#!#post--with_sms
188
+ # Start Passwordless SMS login flow.
189
+ # @see https://auth0.com/docs/api/authentication#get-code-or-link
190
+ # @see https://auth0.com/docs/connections/passwordless#passwordless-on-regular-web-apps
127
191
  # @param phone_number [string] User's phone number.
128
192
  def start_passwordless_sms_flow(phone_number)
129
193
  raise Auth0::InvalidParameter, 'Must supply a valid phone number' if phone_number.to_s.empty?
130
- request_params = {
131
- client_id: @client_id,
132
- connection: 'sms',
133
- phone_number: phone_number
134
- }
135
- post('/passwordless/start', request_params)
136
- end
137
194
 
138
- # Logins using phone number/verification code.
139
- # @see https://auth0.com/docs/auth-api#!#post--ro_with_sms
140
- # @param phone_number [string] User's phone number.
141
- # @param code [string] Verification code.
142
- # @return [json] Returns the access token and id token
143
- def phone_login(phone_number, code, scope = 'openid')
144
- raise Auth0::InvalidParameter, 'Must supply a valid phone number' if phone_number.to_s.empty?
145
- raise Auth0::InvalidParameter, 'Must supply a valid code' if code.to_s.empty?
146
195
  request_params = {
147
- client_id: @client_id,
148
- username: phone_number,
149
- password: code,
150
- scope: scope,
196
+ phone_number: phone_number,
151
197
  connection: 'sms',
152
- grant_type: 'password'
198
+ client_id: @client_id,
199
+ client_secret: @client_secret
153
200
  }
154
- post('/oauth/ro', request_params)
201
+ post('/passwordless/start', request_params)
155
202
  end
156
203
 
157
- # Retrives the SAML 2.0 metadata
158
- # @see https://auth0.com/docs/auth-api#!#get--samlp--client_id-
204
+ # Retrive SAML 2.0 metadata XML for an Application.
205
+ # @see https://auth0.com/docs/api/authentication#get-metadata
159
206
  # @return [xml] SAML 2.0 metadata
160
207
  def saml_metadata
161
208
  get("/samlp/metadata/#{@client_id}")
162
209
  end
163
210
 
164
- # Retrives the WS-Federation metadata
165
- # @see https://auth0.com/docs/auth-api#!#get--wsfed--client_id-
166
- # @return [xml] Federation Metadata
211
+ # Retrieve WS-Federation metadata XML for a tenant.
212
+ # @see https://auth0.com/docs/api/authentication#get-metadata36
213
+ # @return [xml] WS-Federation metadata
167
214
  def wsfed_metadata
168
215
  get('/wsfed/FederationMetadata/2007-06/FederationMetadata.xml')
169
216
  end
170
217
 
171
- # Validates a JSON Web Token (signature and expiration)
172
- # @see https://auth0.com/docs/auth-api#!#post--tokeninfo
173
- # @param id_token [string] Token's id.
174
- # @return User information associated with the user id (sub property) of the token.
175
- def token_info(id_token)
176
- raise Auth0::InvalidParameter, 'Must supply a valid id_token' if id_token.to_s.empty?
177
- request_params = { id_token: id_token }
178
- post('/tokeninfo', request_params)
179
- end
180
-
181
- # Refreshes a delegation token
182
- # @see https://auth0.com/docs/auth-api#!#post--delegation
183
- # @param refresh_token [string] Token to refresh
184
- # @param target [string] Target to sign the new token.
185
- # @param scope [string] Defaults to openid. Can be 'openid name email'.
186
- # @param api_type [string] Defaults to app. Can be aws, azure_sb, azure_blob, firebase, layer, salesforce_api,
187
- # salesforce_sandbox_api, sap_api or wams
188
- # @param extra_parameters [hash] Extra parameters.
189
- # @return [json] Returns the refreshed delegation token
190
- def refresh_delegation(refresh_token, target, scope = 'openid', api_type = 'app', extra_parameters = {})
191
- raise Auth0::InvalidParameter, 'Must supply a valid token to refresh' if refresh_token.to_s.empty?
192
- request_params = {
193
- client_id: @client_id,
194
- grant_type: JWT_BEARER,
195
- refresh_token: refresh_token,
196
- target: target,
197
- api_type: api_type,
198
- scope: scope
199
- }.merge(extra_parameters)
200
- post('/delegation', request_params)
201
- end
202
-
203
- # Retrives a delegation token
204
- # @see https://auth0.com/docs/auth-api#!#post--delegation
205
- # @param id_token [string] Token's id.
206
- # @param target [string] Target to sign the new token.
207
- # @param scope [string] Defaults to openid. Can be 'openid name email'.
208
- # @param api_type [string] Defaults to app. Can be aws, azure_sb, azure_blob, firebase, layer, salesforce_api,
209
- # salesforce_sandbox_api, sap_api or wams
210
- # @param extra_parameters [hash] Extra parameters.
211
- # @return [json] Returns the refreshed delegation token
212
- def delegation(id_token, target, scope = 'openid', api_type = 'app', extra_parameters = {})
213
- raise Auth0::InvalidParameter, 'Must supply a valid id_token' if id_token.to_s.empty?
214
- request_params = {
215
- client_id: @client_id,
216
- grant_type: JWT_BEARER,
217
- id_token: id_token,
218
- target: target,
219
- api_type: api_type,
220
- scope: scope
221
- }.merge(extra_parameters)
222
- post('/delegation', request_params)
223
- end
224
-
225
- # Retrives an impersonation URL to login as another user
226
- # @see https://auth0.com/docs/auth-api#!#post--users--user_id--impersonate
227
- # @param user_id [string] Impersonate user id
228
- # @param app_client_id [string] Application client id
229
- # @param impersonator_id [string] Impersonator user id id.
230
- # @param options [string] Additional Parameters
231
- # @return [string] Impersonation URL
232
- # rubocop:disable Metrics/MethodLength, Metrics/AbcSize
233
- def impersonate(user_id, app_client_id, impersonator_id, options)
234
- raise Auth0::InvalidParameter, 'Must supply a valid user_id' if user_id.to_s.empty?
235
- raise Auth0::InvalidParameter, 'Must supply a valid app_client_id' if app_client_id.to_s.empty?
236
- raise Auth0::InvalidParameter, 'Must supply a valid impersonator_id' if impersonator_id.to_s.empty?
237
- raise Auth0::MissingParameter, 'Must supply client_secret' if @client_secret.nil?
238
- authorization_header obtain_access_token
239
- request_params = {
240
- protocol: options.fetch(:protocol, 'oauth2'),
241
- impersonator_id: impersonator_id,
242
- client_id: app_client_id,
243
- additionalParameters: {
244
- response_type: options.fetch(:response_type, 'code'),
245
- state: options.fetch(:state, ''),
246
- scope: options.fetch(:scope, 'openid'),
247
- callback_url: options.fetch(:callback_url, '')
248
- }
249
- }
250
- result = post("/users/#{user_id}/impersonate", request_params)
251
- authorization_header @token
252
- result
253
- end
254
-
255
- # Unlinks a User
256
- # @see https://auth0.com/docs/auth-api#!#post--unlink
257
- # @param access_token [string] Logged-in user access token
258
- # @param user_id [string] User Id
259
- def unlink_user(access_token, user_id)
260
- raise Auth0::InvalidParameter, 'Must supply a valid access_token' if access_token.to_s.empty?
261
- raise Auth0::InvalidParameter, 'Must supply a valid user_id' if user_id.to_s.empty?
262
- request_params = {
263
- access_token: access_token,
264
- user_id: user_id
265
- }
266
- post('/unlink', request_params)
267
- end
268
-
269
- # Returns the user information based on the Auth0 access token.
270
- # @see https://auth0.com/docs/auth-api#!#get--userinfo
218
+ # Return the user information based on the Auth0 access token.
219
+ # @see https://auth0.com/docs/api/authentication#get-user-info
271
220
  # @return [json] User information based on the Auth0 access token
272
- def user_info
273
- get('/userinfo')
221
+ def userinfo(access_token)
222
+ get('/userinfo', {}, 'Authorization' => "Bearer #{access_token}")
274
223
  end
275
224
 
276
- # Returns an authorization URL, triggers a redirect.
277
- # @see https://auth0.com/docs/auth-api#!#get--authorize_social
278
- # @param redirect_uri [string] Url to redirect after authorization
279
- # @param options [hash] Can contain response_type, connection, state and additional_parameters.
225
+ # Return an authorization URL.
226
+ # @see https://auth0.com/docs/api/authentication#authorization-code-grant
227
+ # @param redirect_uri [string] URL to redirect after authorization
228
+ # @param options [hash] Can contain response_type, connection, state, organization, invitation, and additional_parameters.
280
229
  # @return [url] Authorization URL.
281
230
  def authorization_url(redirect_uri, options = {})
282
231
  raise Auth0::InvalidParameter, 'Must supply a valid redirect_uri' if redirect_uri.to_s.empty?
232
+
283
233
  request_params = {
284
234
  client_id: @client_id,
285
235
  response_type: options.fetch(:response_type, 'code'),
286
236
  connection: options.fetch(:connection, nil),
287
237
  redirect_uri: redirect_uri,
288
238
  state: options.fetch(:state, nil),
289
- scope: options.fetch(:scope, nil)
239
+ scope: options.fetch(:scope, nil),
240
+ organization: options.fetch(:organization, @organization),
241
+ invitation: options.fetch(:invitation, nil)
290
242
  }.merge(options.fetch(:additional_parameters, {}))
291
243
 
292
244
  URI::HTTPS.build(host: @domain, path: '/authorize', query: to_query(request_params))
293
245
  end
294
246
 
295
- # Returns an logout URL, triggers the logout flow.
296
- # @see https://auth0.com/docs/auth-api#!#get--logout
297
- # @param return_to [string] Url to redirect after authorization
298
- # @return [url] Logout URL.
299
- def logout_url(return_to)
247
+ # Returns an Auth0 logout URL with a return URL.
248
+ # @see https://auth0.com/docs/api/authentication#logout
249
+ # @see https://auth0.com/docs/logout
250
+ # @param return_to [string] URL to redirect after logout.
251
+ # @param include_client [bool] Include the client_id in the logout URL.
252
+ # @param federated [boolean] Perform a federated logout.
253
+ # @return [url] Logout URI
254
+ def logout_url(return_to, include_client: false, federated: false)
300
255
  request_params = {
301
- returnTo: return_to
256
+ returnTo: return_to,
257
+ client_id: include_client ? @client_id : nil,
258
+ federated: federated ? '1' : nil
302
259
  }
303
260
 
304
- URI::HTTPS.build(host: @domain, path: '/logout', query: to_query(request_params))
261
+ URI::HTTPS.build(
262
+ host: @domain,
263
+ path: '/v2/logout',
264
+ query: to_query(request_params)
265
+ )
305
266
  end
306
267
 
307
- # Returns a samlp URL. The SAML Request AssertionConsumerServiceURL will be used to POST back the assertion
308
- # and it has to match with the application callback URL.
309
- # @see https://auth0.com/docs/auth-api#get--samlp--client_id-
310
- # @param connection [string] to login with a specific provider.
311
- # @return [url] samlp URL.
268
+ # Return a SAMLP URL.
269
+ # The SAML Request AssertionConsumerServiceURL will be used to POST back
270
+ # the assertion and it must match with the application callback URL.
271
+ # @see https://auth0.com/docs/api/authentication#accept-request
272
+ # @param connection [string] Connection to use; empty to show all
273
+ # @return [url] SAMLP URL
312
274
  def samlp_url(connection = UP_AUTH)
313
275
  request_params = {
314
276
  connection: connection
@@ -316,22 +278,67 @@ module Auth0
316
278
  URI::HTTPS.build(host: @domain, path: "/samlp/#{@client_id}", query: to_query(request_params))
317
279
  end
318
280
 
319
- # Returns a wsfed URL.
320
- # @see https://auth0.com/docs/auth-api#get--wsfed--client_id-
321
- # @param connection [string] to login with a specific provider.
322
- # @return [url] wsfed URL.
323
- def wsfed_url(connection = UP_AUTH)
281
+ # Return a WS-Federation URL.
282
+ # @see https://auth0.com/docs/api/authentication#accept-request35
283
+ # @param connection [string] Connection to use; empty to show all
284
+ # @param options [hash] Extra options; supports wtrealm, wctx, wreply
285
+ # @return [url] WS-Federation URL
286
+ def wsfed_url(connection = UP_AUTH, options = {})
324
287
  request_params = {
325
- whr: connection
288
+ whr: connection,
289
+ wtrealm: options[:wtrealm],
290
+ wctx: options[:wctx],
291
+ wreply: options[:wreply]
326
292
  }
327
- URI::HTTPS.build(host: @domain, path: "/wsfed/#{@client_id}", query: to_query(request_params))
293
+
294
+ url_client_id = @client_id unless request_params[:wtrealm]
295
+ URI::HTTPS.build(
296
+ host: @domain,
297
+ path: "/wsfed/#{url_client_id}",
298
+ query: to_query(request_params)
299
+ )
300
+ end
301
+
302
+ # Validate an ID token (signature and expiration).
303
+ # @see https://auth0.com/docs/tokens/guides/validate-id-tokens
304
+ # @param id_token [string] The JWT to validate.
305
+ # @param algorithm [JWKAlgorithm] The expected signing algorithm.
306
+
307
+ # @param leeway [integer] The clock skew to accept when verifying date related claims in seconds.
308
+ # Must be a non-negative value. Defaults to *60 seconds*.
309
+ # @param nonce [string] The nonce value sent during authentication.
310
+ # @param max_age [integer] The max_age value sent during authentication.
311
+ # Must be a non-negative value.
312
+ # @param issuer [string] The expected issuer claim value.
313
+ # Defaults to +https://YOUR_AUTH0_DOMAIN/+.
314
+ # @param audience [string] The expected audience claim value.
315
+ # Defaults to your *Auth0 Client ID*.
316
+ # @param organization [string] Organization ID
317
+ # Defaults to your *Auth0 Organization ID*.
318
+ # rubocop:disable Metrics/MethodLength, Metrics/AbcSize, Metrics/ParameterLists
319
+ def validate_id_token(id_token, algorithm: nil, leeway: 60, nonce: nil, max_age: nil, issuer: nil, audience: nil, organization: @organization)
320
+ context = {
321
+ issuer: issuer || "https://#{@domain}/",
322
+ audience: audience || @client_id,
323
+ algorithm: algorithm || Auth0::Algorithm::RS256.jwks_url("https://#{@domain}/.well-known/jwks.json"),
324
+ leeway: leeway
325
+ }
326
+
327
+ context[:nonce] = nonce unless nonce.nil?
328
+ context[:max_age] = max_age unless max_age.nil?
329
+ context[:organization] = organization unless !organization
330
+
331
+ Auth0::Mixins::Validation::IdTokenValidator.new(context).validate(id_token)
328
332
  end
333
+ # rubocop:enable Metrics/MethodLength, Metrics/AbcSize, Metrics/ParameterLists
329
334
 
330
335
  private
331
336
 
337
+ # Build a URL query string from a hash.
332
338
  def to_query(hash)
333
- hash.map { |k, v| "#{k}=#{URI.escape(v)}" unless v.nil? }.reject(&:nil?).join('&')
339
+ hash.map { |k, v| "#{k}=#{CGI.escape(v)}" unless v.nil? }.reject(&:nil?).join('&')
334
340
  end
335
341
  end
336
342
  end
337
343
  end
344
+ # rubocop:enable Metrics/ModuleLength
@@ -0,0 +1,36 @@
1
+ module Auth0
2
+ module Api
3
+ module V2
4
+ # Methods to use the anomaly endpoints
5
+ module Anomaly
6
+ # Use this route to determine if a given IP is currently blocked
7
+ # by the failed login to multiple user accounts trigger.
8
+ # @see https://auth0.com/docs/api/management/v2#!/Anomaly/get_ips_by_id
9
+ # @param ip [string] The IP to check.
10
+ def check_if_ip_is_blocked(ip)
11
+ raise Auth0::InvalidParameter, 'Must specify an IP' if ip.to_s.empty?
12
+
13
+ path = "#{anomaly_path}/#{ip}"
14
+ get(path)
15
+ end
16
+
17
+ # Resets an IP that is currently blocked by the failed login to multiple user accounts trigger.
18
+ # @see https://auth0.com/docs/api/management/v2#!/Anomaly/delete_ips_by_id
19
+ # @param ip [string] The IP to remove block.
20
+ def remove_ip_block(ip)
21
+ raise Auth0::InvalidParameter, 'Must specify an IP' if ip.to_s.empty?
22
+
23
+ path = "#{anomaly_path}/#{ip}"
24
+ delete(path)
25
+ end
26
+
27
+ private
28
+
29
+ # Anomaly API path
30
+ def anomaly_path
31
+ @anomaly_path ||= '/api/v2/anomaly/blocks/ips'
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end