auth0 5.3.0 → 5.6.1

Sign up to get free protection for your applications and to get access to all the features.
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