auth0 5.3.0 → 5.6.1

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 (214) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -0
  3. data/.shiprc +7 -0
  4. data/CHANGELOG.md +109 -31
  5. data/Gemfile +1 -0
  6. data/README.md +10 -8
  7. data/auth0.gemspec +2 -1
  8. data/lib/auth0/api/authentication_endpoints.rb +40 -16
  9. data/lib/auth0/api/v2/actions.rb +210 -0
  10. data/lib/auth0/api/v2/branding.rb +0 -1
  11. data/lib/auth0/api/v2/grants.rb +49 -0
  12. data/lib/auth0/api/v2.rb +4 -0
  13. data/lib/auth0/exception.rb +12 -0
  14. data/lib/auth0/mixins/api_token_struct.rb +0 -1
  15. data/lib/auth0/mixins/httpproxy.rb +77 -34
  16. data/lib/auth0/mixins/initializer.rb +2 -3
  17. data/lib/auth0/mixins/token_management.rb +32 -0
  18. data/lib/auth0/mixins/validation.rb +1 -1
  19. data/lib/auth0/mixins.rb +2 -0
  20. data/lib/auth0/version.rb +1 -1
  21. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_change_password/should_trigger_a_password_reset.yml +53 -23
  22. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_email.yml +49 -18
  23. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_password.yml +49 -18
  24. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_invalid_audience.yml +46 -15
  25. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_custom_audience.yml +49 -79
  26. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_default_scope.yml +49 -80
  27. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_saml_metadata/should_retrieve_SAML_metadata.yml +74 -21
  28. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_fail_as_not_authorized.yml +53 -14
  29. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_return_the_userinfo.yml +106 -48
  30. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_wsfed_metadata/should_retrieve_WSFED_metadata.yml +62 -19
  31. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/create_test_user.yml +57 -22
  32. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/delete_test_user.yml +38 -20
  33. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_add_token_to_blacklist/should_add_a_token_to_the_blacklist.yml +37 -19
  34. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_blacklisted_tokens/should_get_the_added_token_from_the_blacklist.yml +38 -23
  35. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_at_least_1_result.yml +42 -26
  36. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_the_test_client_grant.yml +42 -26
  37. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_delete_client_grant/should_delete_the_test_client_grant.yml +38 -20
  38. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_patch_client_grant/should_update_the_test_client_grant.yml +39 -27
  39. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client.yml +44 -82
  40. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client_grant.yml +39 -27
  41. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client.yml +38 -20
  42. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client_grant.yml +38 -20
  43. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_exclude_and_include_fields_properly.yml +43 -56
  44. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_include_the_specified_fields.yml +39 -28
  45. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/should_get_the_test_client.yml +43 -57
  46. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_fields_not_specified.yml +43 -24
  47. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_the_specified_fields.yml +236 -96
  48. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_include_the_specified_fields.yml +52 -27
  49. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_paginate_results.yml +39 -25
  50. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/should_get_at_least_one_client.yml +235 -96
  51. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_delete_client/should_delete_the_test_client_without_an_error.yml +38 -20
  52. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_patch_client/should_update_the_client_with_the_correct_attributes.yml +43 -57
  53. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/create_test_client.yml +45 -82
  54. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_exclude_the_fields_indicated.yml +15 -16
  55. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_include_the_fields_indicated.yml +15 -16
  56. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/should_find_the_correct_connection.yml +15 -16
  57. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_include_previously-created_connection_when_filtered.yml +14 -15
  58. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_exclude_the_fields_indicated_from_filtered_results.yml +14 -15
  59. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_include_the_fields_indicated_from_filtered_results.yml +14 -15
  60. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_include_the_previously_created_connection.yml +15 -15
  61. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_not_be_empty.yml +15 -15
  62. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection/should_delete_the_connection.yml +15 -16
  63. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection_user/should_delete_the_user_created.yml +29 -27
  64. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_update_connection/should_update_the_connection.yml +15 -16
  65. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_connection.yml +16 -17
  66. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_user.yml +40 -32
  67. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_credential.yml +40 -30
  68. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_user.yml +40 -32
  69. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/delete_test_user.yml +38 -20
  70. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_configure_provider/should_configure_a_new_email_provider.yml +37 -28
  71. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_delete_the_existing_email_provider_without_an_error.yml +37 -19
  72. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_throw_an_error_trying_to_get_the_email_provider.yml +34 -16
  73. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_with_specific_fields.yml +36 -27
  74. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_without_specific_fields.yml +36 -28
  75. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/should_get_the_existing_email_provider.yml +36 -28
  76. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_update_provider/should_update_the_existing_email_provider.yml +36 -28
  77. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/delete_existing_provider.yml +37 -19
  78. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_create_an_export_users_job_successfully.yml +38 -23
  79. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_get_the_export_users_job.yml +76 -46
  80. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_create_an_import_users_job_successfully.yml +46 -25
  81. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_get_the_import_users_job.yml +84 -48
  82. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_create_a_new_verification_email_job.yml +77 -47
  83. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_get_the_completed_verification_email.yml +116 -71
  84. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_reject_an_invalid_client_id.yml +76 -39
  85. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/delete_imported_user.yml +76 -43
  86. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/search_for_connection_id.yml +43 -23
  87. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_match_the_created_log_entry.yml +224 -196
  88. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_not_be_empty.yml +224 -196
  89. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_fields_not_specified.yml +38 -25
  90. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_the_specified_fields.yml +39 -39
  91. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_have_one_log_entry.yml +41 -40
  92. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_include_the_specified_fields.yml +38 -26
  93. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_from/should_take_one_log_entry.yml +229 -189
  94. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/create_test_user.yml +40 -32
  95. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_disabled_rule.yml +38 -20
  96. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_enabled_rule.yml +38 -20
  97. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_user.yml +38 -20
  98. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_delete_resource_server/should_delete_the_test_server_without_an_error.yml +38 -20
  99. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_patch_resource_server/should_update_the_resource_server_with_the_correct_attributes.yml +39 -24
  100. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_server/should_get_the_test_server.yml +39 -24
  101. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_get_the_test_server.yml +146 -23
  102. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_at_least_1_result.yml +146 -23
  103. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_the_first_page_of_one_result.yml +131 -24
  104. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/create_test_server.yml +40 -25
  105. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/delete_test_server.yml +38 -20
  106. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_permissions/should_add_a_Permission_to_the_Role_successfully.yml +39 -32
  107. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_users/should_add_a_User_to_the_Role_successfully.yml +38 -31
  108. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_delete_role/should_delete_the_Role_successfully.yml +42 -30
  109. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role/should_get_the_Role_successfully.yml +38 -30
  110. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_exactly_1_Permission.yml +37 -30
  111. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_the_added_Permission_from_the_Role_successfully.yml +37 -30
  112. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_exactly_1_User.yml +37 -30
  113. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_the_added_User_from_the_Role_successfully.yml +37 -30
  114. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_roles/should_get_the_Role_successfully.yml +37 -29
  115. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_remove_role_permissions/should_remove_a_Permission_from_the_Role_successfully.yml +39 -29
  116. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_update_role/should_update_the_Role_successfully.yml +37 -30
  117. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_api.yml +38 -31
  118. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_role.yml +39 -31
  119. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_user.yml +38 -31
  120. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_api.yml +36 -26
  121. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_user.yml +36 -26
  122. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_disabled_rule_without_an_error.yml +38 -20
  123. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_enabled_rule_without_an_error.yml +38 -20
  124. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_fields_not_specified.yml +40 -27
  125. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_specified_fields.yml +40 -27
  126. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_include_the_specified_fields.yml +39 -26
  127. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/should_get_a_specific_rule.yml +40 -27
  128. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_exclude_fields_not_specified.yml +80 -24
  129. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_include_the_specified_fields.yml +82 -25
  130. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_disabled_rule.yml +59 -27
  131. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_enabled_rule.yml +68 -26
  132. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_paginated_results.yml +78 -49
  133. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/should_return_at_least_1_rule.yml +84 -28
  134. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_update_rule/should_update_the_disabled_rule_to_be_enabled.yml +40 -27
  135. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_disabled_rule.yml +42 -29
  136. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_enabled_rule.yml +42 -29
  137. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_active_users/should_have_at_least_one_active_user.yml +38 -23
  138. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_daily_stats/should_have_at_least_one_stats_entry_for_the_timeframe.yml +38 -27
  139. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings/should_get_the_tenant_settings.yml +72 -59
  140. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_exclude_a_field_not_requested.yml +38 -25
  141. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_include_the_field_requested.yml +38 -25
  142. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_revert_the_tenant_name.yml +72 -58
  143. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_update_the_tenant_settings_with_a_new_tenant_name.yml +72 -58
  144. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_email_verification/should_create_an_email_verification_ticket.yml +39 -26
  145. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_password_change/should_create_a_password_change_ticket.yml +39 -26
  146. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/create_test_user.yml +40 -32
  147. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/delete_test_user.yml +38 -20
  148. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_permissions/should_add_a_Permissions_for_a_User_successfully.yml +39 -35
  149. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_roles/should_add_a_Role_to_a_User_successfully.yml +37 -25
  150. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_User_successfully.yml +36 -24
  151. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_secondary_User_successfully.yml +36 -24
  152. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user_provider/should_attempt_to_delete_the_MFA_provider_for_the_User.yml +36 -24
  153. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_enrollments/should_get_Enrollments_for_a_User_successfully.yml +37 -28
  154. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_exactly_1_Permission_for_a_User_successfully.yml +37 -28
  155. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_the_correct_Permission_for_a_User_successfully.yml +37 -28
  156. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_roles/should_get_Roles_for_a_User_successfully.yml +38 -28
  157. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_invalidate_browsers/should_invalidate_MFA_browsers_for_the_User_successfully.yml +36 -24
  158. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_link_user_account/should_link_two_Users_successfully.yml +38 -29
  159. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_patch_user/should_patch_the_User_successfully.yml +38 -28
  160. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_permissions/should_remove_a_Permission_from_a_User_successfully.yml +39 -27
  161. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_roles/should_remove_a_Role_from_a_User_successfully.yml +39 -27
  162. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_unlink_user_account/should_unlink_two_Users_successfully.yml +37 -28
  163. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_fields_not_indicated.yml +37 -28
  164. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_the_fields_indicated.yml +37 -28
  165. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_include_the_fields_indicated.yml +37 -28
  166. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/should_retrieve_the_created_user.yml +37 -28
  167. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user_logs/should_get_Logs_for_a_User_successfully.yml +42 -30
  168. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v2_search_engine_query.yml +36 -27
  169. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v3_search_engine_query.yml +36 -27
  170. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_exclude_the_indicated_fields_when_paginated.yml +36 -27
  171. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_include_the_indicated_fields_when_paginated.yml +36 -27
  172. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_not_include_other_fields_when_paginated.yml +36 -27
  173. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_return_the_correct_number_of_results_when_paginated.yml +36 -27
  174. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/should_have_at_least_one_user.yml +37 -27
  175. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_secondary_test_user.yml +38 -29
  176. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_api.yml +38 -29
  177. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_role.yml +39 -29
  178. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_user.yml +38 -29
  179. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_api.yml +36 -24
  180. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_role.yml +42 -28
  181. data/spec/integration/lib/auth0/api/v2/api_client_grants_spec.rb +0 -9
  182. data/spec/integration/lib/auth0/api/v2/api_connections_spec.rb +3 -3
  183. data/spec/integration/lib/auth0/api/v2/api_email_spec.rb +0 -31
  184. data/spec/integration/lib/auth0/api/v2/api_jobs_spec.rb +4 -4
  185. data/spec/integration/lib/auth0/api/v2/api_logs_spec.rb +5 -5
  186. data/spec/integration/lib/auth0/api/v2/api_roles_spec.rb +3 -3
  187. data/spec/integration/lib/auth0/api/v2/api_tickets_spec.rb +4 -4
  188. data/spec/integration/lib/auth0/api/v2/api_user_blocks_spec.rb +8 -5
  189. data/spec/integration/lib/auth0/api/v2/api_users_spec.rb +6 -33
  190. data/spec/lib/auth0/api/v2/actions_spec.rb +312 -0
  191. data/spec/lib/auth0/api/v2/grants_spec.rb +91 -0
  192. data/spec/lib/auth0/client_spec.rb +3 -3
  193. data/spec/lib/auth0/mixins/httpproxy_spec.rb +320 -25
  194. data/spec/lib/auth0/mixins/initializer_spec.rb +87 -0
  195. data/spec/lib/auth0/mixins/token_management_spec.rb +125 -0
  196. data/spec/spec_helper.rb +1 -1
  197. data/spec/support/dummy_class_for_proxy.rb +2 -2
  198. data/spec/support/dummy_class_for_tokens.rb +17 -0
  199. metadata +31 -30
  200. data/.yardoc/checksums +0 -22
  201. data/.yardoc/complete +0 -0
  202. data/.yardoc/object_types +0 -0
  203. data/.yardoc/objects/root.dat +0 -0
  204. data/.yardoc/proxy_types +0 -0
  205. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Anomaly/_check_if_ip_is_blocked/should_return_200_response_code.yml +0 -65
  206. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Anomaly/_remove_ip_block/should_remove_an_IP_successfully.yml +0 -60
  207. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_the_first_page_of_one_result.yml +0 -66
  208. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_delete_device_credential/should_delete_the_test_credential_without_an_error.yml +0 -54
  209. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/_filter_by_type/should_exclude_the_test_credential.yml +0 -59
  210. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/should_have_at_least_1_entry.yml +0 -62
  211. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/_device_credentials/should_include_the_test_credential.yml +0 -62
  212. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/delete_test_credential.yml +0 -54
  213. data/spec/integration/lib/auth0/api/v2/api_anomaly_spec.rb +0 -17
  214. data/spec/integration/lib/auth0/api/v2/api_device_credentials_spec.rb +0 -128
@@ -0,0 +1,210 @@
1
+ module Auth0
2
+ module Api
3
+ module V2
4
+ # Methods to use the actions endpoints
5
+ module Actions
6
+ include Auth0::Mixins::Validation
7
+
8
+ attr_reader :actions_path
9
+
10
+ # Get all actions.
11
+ # @see https://auth0.com/docs/api/management/v2#!/Actions/get_actions
12
+ # @param trigger_id [string] An actions extensibility point.
13
+ # @param action_name [string] The name of the action to retrieve.
14
+ # @param deployed [boolean] filter to only retrieve actions that are deployed.
15
+ # @param per_page [integer] The amount of entries per page. Default: 50. Max value: 100.
16
+ # @param page [integer] The page number. Zero based.
17
+ # @param installed [boolean] When true, return only installed actions. When false, return only custom actions. Returns all actions by default.
18
+ # @return [json] Actions and pagination info
19
+ def actions(trigger_id, action_name, deployed: nil, per_page: nil, page: nil, installed: nil)
20
+ raise Auth0::MissingTriggerId, 'Must supply a valid trigger_id' if trigger_id.to_s.empty?
21
+ raise Auth0::MissingActionName, 'Must supply a valid action_name' if action_name.to_s.empty?
22
+
23
+ request_params = {
24
+ trigger_id: trigger_id,
25
+ action_name: action_name,
26
+ deployed: deployed,
27
+ per_page: per_page,
28
+ page: page,
29
+ installed: installed
30
+ }
31
+ path = "#{actions_path}/actions"
32
+ get(path, request_params)
33
+ end
34
+ alias get_actions actions
35
+
36
+ # Create a new action.
37
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/post_action
38
+ # @param body [hash] See https://auth0.com/docs/api/management/v2/#!/actions/post_action for available options
39
+ # @return [json] Returns the created action.
40
+ def create_action(body = {})
41
+ post(actions_path, body)
42
+ end
43
+
44
+ # Retrieve the set of triggers currently available within actions. A trigger is an extensibility point to which actions can be bound.
45
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/get_triggers
46
+ #
47
+ # @return [json] Returns triggers of the action
48
+ def actions_triggers
49
+ path = "#{actions_path}/triggers"
50
+ get(path)
51
+ end
52
+
53
+ # Get an action by id.
54
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/get_action
55
+ # @param action_id [string] The action_id of the user to retrieve.
56
+ #
57
+ # @return [json] Returns the action with the given action_id if it exists.
58
+ def action(action_id)
59
+ raise Auth0::MissingActionId, 'Must supply a valid action_id' if action_id.to_s.empty?
60
+ path = "#{actions_path}/actions/#{action_id}"
61
+ get(path)
62
+ end
63
+ alias get_action action
64
+
65
+
66
+ # Deletes a single action given its id
67
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/delete_action
68
+ # @param action_id [string] The action ID
69
+ # @param force [boolean] Force action deletion detaching bindings (defaults to false)
70
+ def delete_action(action_id, force=false)
71
+ raise Auth0::MissingActionId, 'Must supply a valid action_id' if action_id.to_s.empty?
72
+ path = "#{actions_path}/actions/#{action_id}"
73
+ delete(path, { force: force })
74
+ end
75
+
76
+ # Update an existing action.
77
+ # @see https://auth0.com/docs/api/management/v2/#!/Actions/patch_action
78
+ # @param action_id [string] The action ID
79
+ # @param body [hash] The optional parameters to update.
80
+ #
81
+ # @return [json] Returns the updated user.
82
+ def patch_action(action_id, body)
83
+ raise Auth0::MissingActionId, 'Must supply a valid action_id' if action_id.to_s.empty?
84
+ raise Auth0::InvalidParameter, 'Must supply a valid body' if body.to_s.empty? || body.empty?
85
+ path = "#{actions_path}/actions/#{action_id}"
86
+ patch(path, body)
87
+ end
88
+ alias update_action patch_action
89
+
90
+ # Retrieve information about a specific execution of a trigger.
91
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/get_action
92
+ # @param execution_id [string] The ID of the exeution to retrieve.
93
+ #
94
+ # @return [json] Returns the action with the given execution_id if it exists.
95
+ def execution(execution_id)
96
+ raise Auth0::MissingExecutionId, 'Must supply a valid execution_id' if execution_id.to_s.empty?
97
+ path = "#{actions_path}/executions/#{execution_id}"
98
+ get(path)
99
+ end
100
+ alias get_execution execution
101
+
102
+ # Retrieve all of an action's versions.
103
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/versions
104
+ # @param action_id [string] The ID of the action.
105
+ # @param per_page [integer] The amount of entries per page. Default: 50. Max value: 100.
106
+ # @param page [integer] The page number. Zero based
107
+ #
108
+ # @return [json] Returns the action with the given execution_id if it exists.
109
+ def actions_versions(action_id, page: nil, per_page: nil)
110
+ raise Auth0::MissingActionId, 'Must supply a valid action_id' if action_id.to_s.empty?
111
+ path = "#{actions_path}/actions/#{action_id}/versions"
112
+ request_params = {
113
+ per_page: per_page,
114
+ page: page
115
+ }
116
+
117
+ get(path, request_params)
118
+ end
119
+ alias get_actions_versions actions_versions
120
+
121
+ # Retrieve the actions that are bound to a trigger.
122
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/get_bindings
123
+ # @param trigger_id [string] An actions extensibility point.
124
+ # @param per_page [integer] The amount of entries per page. Default: 50. Max value: 100.
125
+ # @param page [integer] The page number. Zero based
126
+ #
127
+ # @return [json] Returns the action with the given trigger_id if it exists.
128
+ def trigger_bindings(trigger_id, page: nil, per_page: nil)
129
+ raise Auth0::MissingTriggerId, 'Must supply a valid trigger_id' if trigger_id.to_s.empty?
130
+ path = "#{actions_path}/triggers/#{trigger_id}/bindings"
131
+ request_params = {
132
+ per_page: per_page,
133
+ page: page
134
+ }
135
+
136
+ get(path, request_params)
137
+ end
138
+ alias get_trigger_bindings trigger_bindings
139
+
140
+ # Update the actions that are bound (i.e. attached) to a trigger.
141
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/patch_bindings
142
+ # @param trigger_id [string] An actions extensibility point.
143
+ # @param body [hash] The optional parameters to update.
144
+ #
145
+ # @return [json] Returns the bindings that were updated.
146
+ def patch_trigger_bindings(trigger_id, body = nil)
147
+ raise Auth0::MissingTriggerId, 'Must supply a valid trigger_id' if trigger_id.to_s.empty?
148
+ raise Auth0::InvalidParameter, 'Must supply a valid body' if body.to_s.empty? || body.empty?
149
+ path = "#{actions_path}/triggers/#{trigger_id}/bindings"
150
+ patch(path, body)
151
+ end
152
+ alias update_trigger_bindings patch_trigger_bindings
153
+
154
+ # Retrieve a specific version of an action
155
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/get_action_version
156
+ # @param action_id [string] The ID of the action.
157
+ # @param version_id [string] The ID of the action version.
158
+ #
159
+ # @return [json] Returns the action.
160
+ def action_by_version(action_id, version_id)
161
+ raise Auth0::MissingActionId, 'Must supply a valid action_id' if action_id.to_s.empty?
162
+ raise Auth0::MissingVersionId, 'Must supply a valid version_id' if version_id.to_s.empty?
163
+ path = "#{actions_path}/actions/#{action_id}/versions/#{version_id}"
164
+ get(path)
165
+ end
166
+ alias get_action_by_version action_by_version
167
+
168
+ # Deploy an action.
169
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/post_deploy_action
170
+ # @param action_id [string] The ID of the action.
171
+ # @return [json] Returns the created action.
172
+ def deploy_action(action_id)
173
+ raise Auth0::MissingActionId, 'Must supply a valid action_id' if action_id.to_s.empty?
174
+ path = "#{actions_path}/actions/#{action_id}/deploy"
175
+ post(path)
176
+ end
177
+
178
+ # Test an action.
179
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/post_test_action
180
+ # @param action_id [string] The ID of the action.
181
+ # @param body [hash] See https://auth0.com/docs/api/management/v2/#!/actions/post_test_action for available options
182
+ # @return [json] Returns the created action.
183
+ def test_action(action_id, body = {})
184
+ raise Auth0::MissingActionId, 'Must supply a valid action_id' if action_id.to_s.empty?
185
+ raise Auth0::InvalidParameter, 'Must supply a valid body' if body.to_s.empty? || body.empty?
186
+ path = "#{actions_path}/actions/#{action_id}/test"
187
+ post(path, body)
188
+ end
189
+
190
+ # Performs the equivalent of a roll-back of an action to an earlier, specified version.
191
+ # @see https://auth0.com/docs/api/management/v2/#!/actions/post_deploy_draft_version
192
+ # @param action_id [string] The ID of the action.
193
+ # @param version_id [string] The ID of the action version.
194
+ # @return [json] Returns the created action.
195
+ def rollback_action(action_id, version_id)
196
+ raise Auth0::MissingActionId, 'Must supply a valid action_id' if action_id.to_s.empty?
197
+ raise Auth0::MissingVersionId, 'Must supply a valid version_id' if version_id.to_s.empty?
198
+ path = "#{actions_path}/actions/#{action_id}/versions/#{version_id}/deploy"
199
+ post(path)
200
+ end
201
+
202
+ private
203
+ # actions API path
204
+ def actions_path
205
+ @actions_path ||= '/api/v2/actions'
206
+ end
207
+ end
208
+ end
209
+ end
210
+ end
@@ -35,7 +35,6 @@ module Auth0
35
35
 
36
36
  # Delete template for New Universal Login Experience
37
37
  # @see https://auth0.com/docs/api/management/v2/#!/Branding/delete_universal_login
38
- # @param rule_id [string] The id of the rule to delete.
39
38
  def delete_branding_templates_for_universal_login
40
39
  delete(templates_path)
41
40
  end
@@ -0,0 +1,49 @@
1
+ module Auth0
2
+ module Api
3
+ module V2
4
+ module Grants
5
+ attr_reader :grants_path
6
+
7
+ # Retrieve the grants associated with your account.
8
+ # @see https://auth0.com/docs/api/management/v2#!/Grants/get_grants
9
+ # @param client_id [string] The client_id of the grants to retrieve.
10
+ # @param user_id [string] The user_id of the grants to retrieve.
11
+ # @param audience [string] The audience of the grants to retrieve.
12
+ # @param page [int] The page index of the results to return. First page is 0.
13
+ # @param per_page [int] The number of results per page. Paging is disabled if parameter not sent.
14
+ # @param include_totals [boolean] Return results inside an object that contains the total result count (true) or as a direct array of results (false, default).
15
+ # @return [json] Returns the grants.
16
+ def grants(client_id: nil, user_id: nil, audience: nil, page: nil, per_page: nil, include_totals: nil)
17
+ request_params = {
18
+ client_id: client_id,
19
+ user_id: user_id,
20
+ audience: audience,
21
+ page: page,
22
+ per_page: per_page,
23
+ include_totals: include_totals
24
+ }
25
+ get(grants_path, request_params)
26
+ end
27
+ alias get_all_grants grants
28
+
29
+ # Delete a grant associated with your account.
30
+ # @see https://auth0.com/docs/api/management/v2#!/Grants/delete_grants_by_id
31
+ # @param id [string] The id of the grant to delete.
32
+ # @param user_id [string] The user_id of the grant to delete.
33
+ def delete_grant(id, user_id)
34
+ raise Auth0::InvalidParameter, 'Must specify a grant id as id' if id.to_s.empty?
35
+ raise Auth0::InvalidParameter, 'Must specify a user id' if user_id.to_s.empty?
36
+ path = "#{grants_path}/#{id}"
37
+ delete(path, user_id: user_id)
38
+ end
39
+
40
+ private
41
+
42
+ # Grants API path
43
+ def grants_path
44
+ @grants_path ||= '/api/v2/grants'
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
data/lib/auth0/api/v2.rb CHANGED
@@ -1,3 +1,5 @@
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'
3
5
  require 'auth0/api/v2/branding'
@@ -26,6 +28,8 @@ module Auth0
26
28
  module Api
27
29
  # https://auth0.com/docs/apiv2
28
30
  module V2
31
+ include Auth0::Api::V2::Grants
32
+ include Auth0::Api::V2::Actions
29
33
  include Auth0::Api::V2::Anomaly
30
34
  include Auth0::Api::V2::Blacklists
31
35
  include Auth0::Api::V2::Branding
@@ -40,8 +40,20 @@ module Auth0
40
40
  class MissingClientId < Auth0::Exception; end
41
41
  # exception for unset organization_id
42
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
43
53
  # exception for an unset parameter
44
54
  class MissingParameter < Auth0::Exception; end
55
+ # exception for unset version_id
56
+ class MissingVersionId < Auth0::Exception; end
45
57
  # Api v2 access denied
46
58
  class AccessDenied < Auth0::HTTPError; end
47
59
  # Invalid parameter passed, e.g. empty where ID is required
@@ -1,5 +1,4 @@
1
1
  Auth0::ApiToken = Struct.new :access_token, :scope, :expires_in do
2
-
3
2
  def token
4
3
  access_token
5
4
  end
@@ -1,51 +1,53 @@
1
1
  require "addressable/uri"
2
+ require "retryable"
3
+ require_relative "../exception.rb"
2
4
 
3
5
  module Auth0
4
6
  module Mixins
5
7
  # here's the proxy for Rest calls based on rest-client, we're building all request on that gem
6
8
  # for now, if you want to feel free to use your own http client
7
9
  module HTTPProxy
8
- attr_accessor :headers, :base_uri, :timeout
10
+ attr_accessor :headers, :base_uri, :timeout, :retry_count
11
+ DEAFULT_RETRIES = 3
12
+ MAX_ALLOWED_RETRIES = 10
13
+ MAX_REQUEST_RETRY_JITTER = 250
14
+ MAX_REQUEST_RETRY_DELAY = 1000
15
+ MIN_REQUEST_RETRY_DELAY = 100
9
16
 
10
17
  # proxying requests from instance methods to HTTP class methods
11
18
  %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)
19
+ define_method(method) do |uri, body = {}, extra_headers = {}|
14
20
  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
- # Ignore the default Content-Type headers and let the HTTP client define them
30
- post_file_headers = headers.slice(*headers.keys - ['Content-Type'])
31
- # Actual call with the altered headers
32
- call(:post, url(safe_path), timeout, post_file_headers, body)
33
- else
34
- call(method, url(safe_path), timeout, headers, body.to_json)
35
- end
36
- case result.code
37
- when 200...226 then safe_parse_json(result.body)
38
- when 400 then raise Auth0::BadRequest.new(result.body, code: result.code, headers: result.headers)
39
- when 401 then raise Auth0::Unauthorized.new(result.body, code: result.code, headers: result.headers)
40
- when 403 then raise Auth0::AccessDenied.new(result.body, code: result.code, headers: result.headers)
41
- when 404 then raise Auth0::NotFound.new(result.body, code: result.code, headers: result.headers)
42
- when 429 then raise Auth0::RateLimitEncountered.new(result.body, code: result.code, headers: result.headers)
43
- when 500 then raise Auth0::ServerError.new(result.body, code: result.code, headers: result.headers)
44
- else raise Auth0::Unsupported.new(result.body, code: result.code, headers: result.headers)
45
- end
21
+ token = get_token()
22
+ authorization_header(token) unless token.nil?
23
+ request_with_retry(method, uri, body, extra_headers)
46
24
  end
47
25
  end
48
26
 
27
+ def retry_options
28
+ sleep_timer = lambda do |attempt|
29
+ wait = 1000 * 2**attempt # Exponential delay with each subsequent request attempt.
30
+ wait += rand(wait..wait+MAX_REQUEST_RETRY_JITTER) # Add jitter to the delay window.
31
+ wait = [MAX_REQUEST_RETRY_DELAY, wait].min # Cap delay at MAX_REQUEST_RETRY_DELAY.
32
+ wait = [MIN_REQUEST_RETRY_DELAY, wait].max # Ensure delay is no less than MIN_REQUEST_RETRY_DELAY.
33
+ wait / 1000.to_f.round(2) # convert ms to seconds
34
+ end
35
+
36
+ tries = 1 + [Integer(retry_count || DEAFULT_RETRIES), MAX_ALLOWED_RETRIES].min # Cap retries at MAX_ALLOWED_RETRIES
37
+
38
+ {
39
+ tries: tries,
40
+ sleep: sleep_timer,
41
+ on: Auth0::RateLimitEncountered
42
+ }
43
+ end
44
+
45
+ def encode_uri(uri)
46
+ # if a base_uri is set then the uri can be encoded as a path
47
+ path = base_uri ? Addressable::URI.new(path: uri).normalized_path : Addressable::URI.escape(uri)
48
+ url(path)
49
+ end
50
+
49
51
  def url(path)
50
52
  "#{base_uri}#{path}"
51
53
  end
@@ -62,6 +64,47 @@ module Auth0
62
64
  body
63
65
  end
64
66
 
67
+ def request_with_retry(method, uri, body = {}, extra_headers = {})
68
+ Retryable.retryable(retry_options) do
69
+ request(method, uri, body, extra_headers)
70
+ end
71
+ end
72
+
73
+ def request(method, uri, body = {}, extra_headers = {})
74
+ result = if method == :get
75
+ # Mutate the headers property to add parameters.
76
+ add_headers({params: body})
77
+ # Merge custom headers into existing ones for this req.
78
+ # This prevents future calls from using them.
79
+ get_headers = headers.merge extra_headers
80
+ # Make the call with extra_headers, if provided.
81
+ call(:get, encode_uri(uri), timeout, get_headers)
82
+ elsif method == :delete
83
+ call(:delete, encode_uri(uri), timeout, add_headers({params: body}))
84
+ elsif method == :delete_with_body
85
+ call(:delete, encode_uri(uri), timeout, headers, body.to_json)
86
+ elsif method == :post_file
87
+ body.merge!(multipart: true)
88
+ # Ignore the default Content-Type headers and let the HTTP client define them
89
+ post_file_headers = headers.slice(*headers.keys - ['Content-Type'])
90
+ # Actual call with the altered headers
91
+ call(:post, encode_uri(uri), timeout, post_file_headers, body)
92
+ else
93
+ call(method, encode_uri(uri), timeout, headers, body.to_json)
94
+ end
95
+
96
+ case result.code
97
+ when 200...226 then safe_parse_json(result.body)
98
+ when 400 then raise Auth0::BadRequest.new(result.body, code: result.code, headers: result.headers)
99
+ when 401 then raise Auth0::Unauthorized.new(result.body, code: result.code, headers: result.headers)
100
+ when 403 then raise Auth0::AccessDenied.new(result.body, code: result.code, headers: result.headers)
101
+ when 404 then raise Auth0::NotFound.new(result.body, code: result.code, headers: result.headers)
102
+ when 429 then raise Auth0::RateLimitEncountered.new(result.body, code: result.code, headers: result.headers)
103
+ when 500 then raise Auth0::ServerError.new(result.body, code: result.code, headers: result.headers)
104
+ else raise Auth0::Unsupported.new(result.body, code: result.code, headers: result.headers)
105
+ end
106
+ end
107
+
65
108
  def call(method, url, timeout, headers, body = nil)
66
109
  RestClient::Request.execute(
67
110
  method: method,
@@ -15,6 +15,7 @@ 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]
18
19
  extend Auth0::Api::AuthenticationEndpoints
19
20
  @client_id = options[:client_id]
20
21
  @client_secret = options[:client_secret]
@@ -58,9 +59,7 @@ module Auth0
58
59
 
59
60
  def initialize_v2(options)
60
61
  extend Auth0::Api::V2
61
- @token = options[:access_token] || options[:token]
62
- api_identifier = options[:api_identifier] || "https://#{@domain}/api/v2/"
63
- @token = api_token(audience: api_identifier).token if @token.nil? && @client_id && @client_secret
62
+ initialize_token(options)
64
63
  end
65
64
 
66
65
  def api_v2?(options)
@@ -0,0 +1,32 @@
1
+ module Auth0
2
+ module Mixins
3
+ module TokenManagement
4
+
5
+ private
6
+
7
+ def initialize_token(options)
8
+ @token = options[:access_token] || options[:token]
9
+
10
+ # default expiry to an hour if a token was given but no expires_at
11
+ @token_expires_at = @token ? options[:token_expires_at] || Time.now.to_i + 3600 : nil
12
+
13
+ @audience = options[:api_identifier] || "https://#{@domain}/api/v2/"
14
+ get_token() if @token.nil?
15
+ end
16
+
17
+ def get_token
18
+ has_expired = @token && @token_expires_at ? @token_expires_at < (Time.now.to_i + 10) : false
19
+
20
+ if (@token.nil? || has_expired) && @client_id && @client_secret
21
+ response = api_token(audience: @audience)
22
+ @token = response.token
23
+ @token_expires_at = response.expires_in ? Time.now.to_i + response.expires_in : nil
24
+
25
+ @token
26
+ else
27
+ @token
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -335,7 +335,7 @@ module Auth0
335
335
  private
336
336
 
337
337
  def fetch_jwks
338
- result = get(@jwks_url)
338
+ result = request_with_retry(:get, @jwks_url, {}, {})
339
339
  @did_fetch_jwks = result.is_a?(Hash) && result.key?('keys')
340
340
  result if @did_fetch_jwks
341
341
  end
data/lib/auth0/mixins.rb CHANGED
@@ -9,6 +9,7 @@ require 'auth0/mixins/httpproxy'
9
9
  require 'auth0/mixins/initializer'
10
10
  require 'auth0/mixins/permission_struct'
11
11
  require 'auth0/mixins/validation'
12
+ require 'auth0/mixins/token_management'
12
13
 
13
14
  require 'auth0/api/authentication_endpoints'
14
15
  require 'auth0/api/v2'
@@ -17,6 +18,7 @@ module Auth0
17
18
  # Collecting dependencies here
18
19
  module Mixins
19
20
  include Auth0::Mixins::Headers
21
+ include Auth0::Mixins::TokenManagement
20
22
  include Auth0::Mixins::HTTPProxy
21
23
  include Auth0::Mixins::Initializer
22
24
  end
data/lib/auth0/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  # current version of gem
2
2
  module Auth0
3
- VERSION = '5.3.0'.freeze
3
+ VERSION = '5.6.1'.freeze
4
4
  end
@@ -5,22 +5,22 @@ http_interactions:
5
5
  uri: https://auth0-sdk-tests.auth0.com/dbconnections/change_password
6
6
  body:
7
7
  encoding: UTF-8
8
- string: '{"email":"rubytest-username-1@auth0.com","password":"","connection":"Username-Password-Authentication","client_id":"2cnWuug6zaFX1j0ge1P99jAUn0F4XSuI"}'
8
+ string: '{"email":"rubytest-210908-username-1@auth0.com","password":"","connection":"Username-Password-Authentication","client_id":"2cnWuug6zaFX1j0ge1P99jAUn0F4XSuI"}'
9
9
  headers:
10
10
  Accept:
11
11
  - "*/*"
12
- Accept-Encoding:
13
- - gzip, deflate
14
12
  User-Agent:
15
- - Ruby/2.5.1
13
+ - rest-client/2.1.0 (darwin19.6.0 x86_64) ruby/2.7.0p0
16
14
  Content-Type:
17
15
  - application/json
18
16
  Auth0-Client:
19
- - eyJuYW1lIjoicnVieS1hdXRoMCIsInZlcnNpb24iOiI0LjUuMCJ9
17
+ - eyJuYW1lIjoicnVieS1hdXRoMCIsInZlcnNpb24iOiI1LjUuMCIsImVudiI6eyJydWJ5IjoiMi43LjAifX0=
20
18
  Authorization:
21
19
  - Bearer API_TOKEN
22
20
  Content-Length:
23
- - '150'
21
+ - '157'
22
+ Accept-Encoding:
23
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
24
24
  Host:
25
25
  - auth0-sdk-tests.auth0.com
26
26
  response:
@@ -29,35 +29,65 @@ http_interactions:
29
29
  message: OK
30
30
  headers:
31
31
  Date:
32
- - Wed, 10 Oct 2018 23:19:59 GMT
32
+ - Fri, 03 Sep 2021 20:16:11 GMT
33
33
  Content-Type:
34
34
  - text/html; charset=utf-8
35
35
  Transfer-Encoding:
36
36
  - chunked
37
37
  Connection:
38
38
  - keep-alive
39
+ Cf-Ray:
40
+ - 6891a783fa1aeb79-LAX
41
+ Access-Control-Allow-Origin:
42
+ - "*"
43
+ Cache-Control:
44
+ - private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0, no-transform
45
+ Etag:
46
+ - W/"34-isurgRF3drpbztqj/kuLX3wcQN4"
47
+ Set-Cookie:
48
+ - did=s%3Av0%3Ac7c670e0-0cf3-11ec-8fcc-b1ac7dd7e8e6.SMKCwsFbZxS1wgznun%2Bc4MrNN8Yb7eXSJYergKRIbm4;
49
+ Max-Age=31557600; Path=/; Expires=Sun, 04 Sep 2022 02:16:10 GMT; HttpOnly;
50
+ Secure; SameSite=None
51
+ - did_compat=s%3Av0%3Ac7c670e0-0cf3-11ec-8fcc-b1ac7dd7e8e6.SMKCwsFbZxS1wgznun%2Bc4MrNN8Yb7eXSJYergKRIbm4;
52
+ Max-Age=31557600; Path=/; Expires=Sun, 04 Sep 2022 02:16:11 GMT; HttpOnly;
53
+ Secure
54
+ Strict-Transport-Security:
55
+ - max-age=31536000
39
56
  Vary:
40
- - Accept-Encoding
57
+ - Accept-Encoding, Origin
58
+ Cf-Cache-Status:
59
+ - DYNAMIC
60
+ Access-Control-Allow-Credentials:
61
+ - 'false'
62
+ Access-Control-Expose-Headers:
63
+ - X-RateLimit-Limit, X-RateLimit-Remaining, X-RateLimit-Reset
64
+ Expect-Ct:
65
+ - max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
66
+ Ot-Baggage-Auth0-Request-Id:
67
+ - 6891a783fa1aeb79
68
+ Ot-Tracer-Sampled:
69
+ - 'true'
70
+ Ot-Tracer-Spanid:
71
+ - 73ed236e3e952604
72
+ Ot-Tracer-Traceid:
73
+ - 75dde96b4f4143d1
41
74
  X-Auth0-Requestid:
42
- - b1edcce5da4346cf4e72
75
+ - 46bd91e5c530f4b3a9f7
76
+ X-Content-Type-Options:
77
+ - nosniff
43
78
  X-Ratelimit-Limit:
44
79
  - '10'
45
80
  X-Ratelimit-Remaining:
46
81
  - '9'
47
82
  X-Ratelimit-Reset:
48
- - '1539213660'
49
- Cache-Control:
50
- - private, no-store, no-cache, must-revalidate, post-check=0, pre-check=0
51
- Strict-Transport-Security:
52
- - max-age=15724800
53
- X-Robots-Tag:
54
- - noindex, nofollow, nosnippet, noarchive
55
- Content-Encoding:
56
- - gzip
83
+ - '1630700231'
84
+ Server:
85
+ - cloudflare
86
+ Alt-Svc:
87
+ - h3-27=":443"; ma=86400, h3-28=":443"; ma=86400, h3-29=":443"; ma=86400, h3=":443";
88
+ ma=86400
57
89
  body:
58
90
  encoding: ASCII-8BIT
59
- string: !binary |-
60
- H4sIAAAAAAAAAwtPVS9LVcgqLS5RKE7NK1GozC9VSMxTSM1NzMxRKMlXKEotTgWLFikUJBYXl+cXpegBAKHKLwA0AAAA
61
- http_version:
62
- recorded_at: Wed, 10 Oct 2018 23:19:59 GMT
63
- recorded_with: VCR 4.0.0
91
+ string: We've just sent you an email to reset your password.
92
+ recorded_at: Fri, 03 Sep 2021 20:16:10 GMT
93
+ recorded_with: VCR 6.0.0