auth0 5.18.1 → 5.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. checksums.yaml +4 -4
  2. data/.version +1 -1
  3. data/CHANGELOG.md +9 -0
  4. data/README.md +11 -0
  5. data/auth0.gemspec +1 -3
  6. data/lib/auth0/mixins/token_management.rb +17 -14
  7. data/lib/auth0/version.rb +1 -1
  8. metadata +2 -336
  9. data/.bundle/config +0 -4
  10. data/.devcontainer/Dockerfile +0 -19
  11. data/.devcontainer/devcontainer.json +0 -37
  12. data/.env.example +0 -2
  13. data/.github/CODEOWNERS +0 -1
  14. data/.github/ISSUE_TEMPLATE/Bug Report.yml +0 -67
  15. data/.github/ISSUE_TEMPLATE/Feature Request.yml +0 -53
  16. data/.github/ISSUE_TEMPLATE/config.yml +0 -8
  17. data/.github/PULL_REQUEST_TEMPLATE.md +0 -35
  18. data/.github/actions/get-prerelease/action.yml +0 -30
  19. data/.github/actions/get-release-notes/action.yml +0 -42
  20. data/.github/actions/get-version/action.yml +0 -21
  21. data/.github/actions/release-create/action.yml +0 -47
  22. data/.github/actions/rl-scanner/action.yml +0 -71
  23. data/.github/actions/rubygems-publish/action.yml +0 -30
  24. data/.github/actions/setup/action.yml +0 -32
  25. data/.github/actions/tag-exists/action.yml +0 -36
  26. data/.github/dependabot.yml +0 -13
  27. data/.github/stale.yml +0 -20
  28. data/.github/workflows/codeql.yml +0 -53
  29. data/.github/workflows/matrix.json +0 -3
  30. data/.github/workflows/release.yml +0 -36
  31. data/.github/workflows/rl-scanner.yml +0 -65
  32. data/.github/workflows/ruby-release.yml +0 -72
  33. data/.github/workflows/semgrep.yml +0 -40
  34. data/.github/workflows/snyk.yml +0 -40
  35. data/.github/workflows/test.yml +0 -69
  36. data/.gitignore +0 -18
  37. data/.rspec +0 -3
  38. data/.rubocop.yml +0 -10
  39. data/.rubocop_todo.yml +0 -5
  40. data/.semgrepignore +0 -6
  41. data/.shiprc +0 -8
  42. data/.snyk +0 -17
  43. data/CODE_OF_CONDUCT.md +0 -3
  44. data/DEPLOYMENT.md +0 -61
  45. data/DEVELOPMENT.md +0 -35
  46. data/Dockerfile +0 -5
  47. data/EXAMPLES.md +0 -222
  48. data/Gemfile +0 -18
  49. data/Gemfile.lock +0 -239
  50. data/Guardfile +0 -37
  51. data/RUBYGEM.md +0 -9
  52. data/Rakefile +0 -31
  53. data/codecov.yml +0 -22
  54. data/examples/ruby-api/.env.example +0 -2
  55. data/examples/ruby-api/.gitignore +0 -80
  56. data/examples/ruby-api/Gemfile +0 -9
  57. data/examples/ruby-api/Gemfile.lock +0 -42
  58. data/examples/ruby-api/README.md +0 -24
  59. data/examples/ruby-api/config.ru +0 -2
  60. data/examples/ruby-api/main.rb +0 -33
  61. data/examples/ruby-on-rails-api/.env.example +0 -2
  62. data/examples/ruby-on-rails-api/.gitignore +0 -18
  63. data/examples/ruby-on-rails-api/Gemfile +0 -48
  64. data/examples/ruby-on-rails-api/README.md +0 -25
  65. data/examples/ruby-on-rails-api/Rakefile +0 -6
  66. data/examples/ruby-on-rails-api/app/assets/images/.keep +0 -0
  67. data/examples/ruby-on-rails-api/app/assets/javascripts/application.js +0 -16
  68. data/examples/ruby-on-rails-api/app/assets/stylesheets/application.css +0 -15
  69. data/examples/ruby-on-rails-api/app/controllers/application_controller.rb +0 -8
  70. data/examples/ruby-on-rails-api/app/controllers/concerns/.keep +0 -0
  71. data/examples/ruby-on-rails-api/app/controllers/ping_controller.rb +0 -6
  72. data/examples/ruby-on-rails-api/app/controllers/secured_ping_controller.rb +0 -11
  73. data/examples/ruby-on-rails-api/app/helpers/application_helper.rb +0 -3
  74. data/examples/ruby-on-rails-api/app/mailers/.keep +0 -0
  75. data/examples/ruby-on-rails-api/app/models/.keep +0 -0
  76. data/examples/ruby-on-rails-api/app/models/User.rb +0 -5
  77. data/examples/ruby-on-rails-api/app/models/concerns/.keep +0 -0
  78. data/examples/ruby-on-rails-api/app/views/layouts/application.html.erb +0 -14
  79. data/examples/ruby-on-rails-api/bin/bundle +0 -3
  80. data/examples/ruby-on-rails-api/bin/rails +0 -4
  81. data/examples/ruby-on-rails-api/bin/rake +0 -4
  82. data/examples/ruby-on-rails-api/bin/setup +0 -29
  83. data/examples/ruby-on-rails-api/config/application.rb +0 -23
  84. data/examples/ruby-on-rails-api/config/boot.rb +0 -4
  85. data/examples/ruby-on-rails-api/config/database.yml +0 -27
  86. data/examples/ruby-on-rails-api/config/environment.rb +0 -5
  87. data/examples/ruby-on-rails-api/config/environments/development.rb +0 -37
  88. data/examples/ruby-on-rails-api/config/environments/production.rb +0 -83
  89. data/examples/ruby-on-rails-api/config/environments/test.rb +0 -41
  90. data/examples/ruby-on-rails-api/config/initializers/backtrace_silencers.rb +0 -7
  91. data/examples/ruby-on-rails-api/config/initializers/cookies_serializer.rb +0 -3
  92. data/examples/ruby-on-rails-api/config/initializers/dotenv.rb +0 -4
  93. data/examples/ruby-on-rails-api/config/initializers/filter_parameter_logging.rb +0 -4
  94. data/examples/ruby-on-rails-api/config/initializers/inflections.rb +0 -16
  95. data/examples/ruby-on-rails-api/config/initializers/knock.rb +0 -35
  96. data/examples/ruby-on-rails-api/config/initializers/mime_types.rb +0 -4
  97. data/examples/ruby-on-rails-api/config/initializers/session_store.rb +0 -3
  98. data/examples/ruby-on-rails-api/config/initializers/wrap_parameters.rb +0 -14
  99. data/examples/ruby-on-rails-api/config/locales/en.yml +0 -23
  100. data/examples/ruby-on-rails-api/config/routes.rb +0 -58
  101. data/examples/ruby-on-rails-api/config/secrets.yml +0 -28
  102. data/examples/ruby-on-rails-api/config.ru +0 -4
  103. data/examples/ruby-on-rails-api/db/schema.rb +0 -15
  104. data/examples/ruby-on-rails-api/db/seeds.rb +0 -7
  105. data/examples/ruby-on-rails-api/lib/assets/.keep +0 -0
  106. data/examples/ruby-on-rails-api/lib/tasks/.keep +0 -0
  107. data/examples/ruby-on-rails-api/log/.keep +0 -0
  108. data/examples/ruby-on-rails-api/public/404.html +0 -67
  109. data/examples/ruby-on-rails-api/public/422.html +0 -67
  110. data/examples/ruby-on-rails-api/public/500.html +0 -66
  111. data/examples/ruby-on-rails-api/public/favicon.ico +0 -0
  112. data/examples/ruby-on-rails-api/public/robots.txt +0 -5
  113. data/examples/ruby-on-rails-api/test/controllers/.keep +0 -0
  114. data/examples/ruby-on-rails-api/test/fixtures/.keep +0 -0
  115. data/examples/ruby-on-rails-api/test/helpers/.keep +0 -0
  116. data/examples/ruby-on-rails-api/test/integration/.keep +0 -0
  117. data/examples/ruby-on-rails-api/test/mailers/.keep +0 -0
  118. data/examples/ruby-on-rails-api/test/models/.keep +0 -0
  119. data/examples/ruby-on-rails-api/test/ping_controller_test.rb +0 -8
  120. data/examples/ruby-on-rails-api/test/secured_ping_controller_test.rb +0 -26
  121. data/examples/ruby-on-rails-api/test/test_helper.rb +0 -16
  122. data/opslevel.yml +0 -5
  123. data/publish_rubygem.sh +0 -10
  124. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_change_password/should_trigger_a_password_reset.yml +0 -93
  125. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_email.yml +0 -85
  126. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_incorrect_password.yml +0 -85
  127. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_fail_with_an_invalid_audience.yml +0 -86
  128. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_custom_audience.yml +0 -87
  129. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_login_with_resource_owner/should_login_successfully_with_a_default_scope.yml +0 -88
  130. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_saml_metadata/should_retrieve_SAML_metadata.yml +0 -110
  131. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_fail_as_not_authorized.yml +0 -94
  132. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_userinfo/should_return_the_userinfo.yml +0 -176
  133. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/_wsfed_metadata/should_retrieve_WSFED_metadata.yml +0 -98
  134. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/create_test_user.yml +0 -93
  135. data/spec/fixtures/vcr_cassettes/Auth0_Api_AuthenticationEndpoints/delete_test_user.yml +0 -72
  136. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_add_token_to_blacklist/should_add_a_token_to_the_blacklist.yml +0 -74
  137. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Blacklists/_blacklisted_tokens/should_get_the_added_token_from_the_blacklist.yml +0 -74
  138. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_at_least_1_result.yml +0 -78
  139. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_client_grants/should_return_the_test_client_grant.yml +0 -78
  140. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_delete_client_grant/should_delete_the_test_client_grant.yml +0 -72
  141. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/_patch_client_grant/should_update_the_test_client_grant.yml +0 -76
  142. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client.yml +0 -80
  143. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/create_test_client_grant.yml +0 -76
  144. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client.yml +0 -72
  145. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ClientGrants/delete_test_client_grant.yml +0 -72
  146. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_exclude_and_include_fields_properly.yml +0 -78
  147. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/_filters/should_include_the_specified_fields.yml +0 -74
  148. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_client/should_get_the_test_client.yml +0 -78
  149. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_fields_not_specified.yml +0 -79
  150. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_exclude_the_specified_fields.yml +0 -272
  151. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_include_the_specified_fields.yml +0 -88
  152. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/_filters/should_paginate_results.yml +0 -79
  153. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_clients/should_get_at_least_one_client.yml +0 -271
  154. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_delete_client/should_delete_the_test_client_without_an_error.yml +0 -72
  155. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/_patch_client/should_update_the_client_with_the_correct_attributes.yml +0 -81
  156. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Clients/create_test_client.yml +0 -81
  157. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_exclude_the_fields_indicated.yml +0 -74
  158. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/_filters/should_include_the_fields_indicated.yml +0 -74
  159. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connection/should_find_the_correct_connection.yml +0 -74
  160. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_include_previously-created_connection_when_filtered.yml +0 -78
  161. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_exclude_the_fields_indicated_from_filtered_results.yml +0 -78
  162. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/_filters/should_should_include_the_fields_indicated_from_filtered_results.yml +0 -78
  163. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_include_the_previously_created_connection.yml +0 -79
  164. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_connections/should_not_be_empty.yml +0 -79
  165. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection/should_delete_the_connection.yml +0 -74
  166. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_delete_connection_user/should_delete_the_user_created.yml +0 -148
  167. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/_update_connection/should_update_the_connection.yml +0 -76
  168. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_connection.yml +0 -76
  169. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Connections/create_test_user.yml +0 -76
  170. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_credential.yml +0 -72
  171. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/create_test_user.yml +0 -76
  172. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_DeviceCredentials/delete_test_user.yml +0 -72
  173. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_configure_provider/should_configure_a_new_email_provider.yml +0 -72
  174. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_delete_the_existing_email_provider_without_an_error.yml +0 -72
  175. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_delete_provider/should_throw_an_error_trying_to_get_the_email_provider.yml +0 -69
  176. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_with_specific_fields.yml +0 -69
  177. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/_filters/should_get_the_existing_email_provider_without_specific_fields.yml +0 -69
  178. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_get_provider/should_get_the_existing_email_provider.yml +0 -69
  179. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/_update_provider/should_update_the_existing_email_provider.yml +0 -71
  180. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Emails/delete_existing_provider.yml +0 -72
  181. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_create_an_export_users_job_successfully.yml +0 -76
  182. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_export_users_and_get_job/should_get_the_export_users_job.yml +0 -147
  183. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_create_an_import_users_job_successfully.yml +0 -81
  184. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_import_users_and_get_job/should_get_the_import_users_job.yml +0 -152
  185. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_create_a_new_verification_email_job.yml +0 -149
  186. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_get_the_completed_verification_email.yml +0 -220
  187. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/_send_verification_email_and_get_job/should_reject_an_invalid_client_id.yml +0 -146
  188. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/delete_imported_user.yml +0 -143
  189. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Jobs/search_for_connection_id.yml +0 -79
  190. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_match_the_created_log_entry.yml +0 -293
  191. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_log/should_not_be_empty.yml +0 -293
  192. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_fields_not_specified.yml +0 -74
  193. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_exclude_the_specified_fields.yml +0 -75
  194. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_have_one_log_entry.yml +0 -77
  195. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_filters/should_include_the_specified_fields.yml +0 -74
  196. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/_logs/_from/should_take_one_log_entry.yml +0 -298
  197. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/create_test_user.yml +0 -76
  198. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_disabled_rule.yml +0 -72
  199. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_enabled_rule.yml +0 -72
  200. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Logs/delete_test_user.yml +0 -72
  201. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_delete_resource_server/should_delete_the_test_server_without_an_error.yml +0 -72
  202. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_patch_resource_server/should_update_the_resource_server_with_the_correct_attributes.yml +0 -76
  203. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_server/should_get_the_test_server.yml +0 -74
  204. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_get_the_test_server.yml +0 -182
  205. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_at_least_1_result.yml +0 -182
  206. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/_resource_servers/should_return_the_first_page_of_one_result.yml +0 -171
  207. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/create_test_server.yml +0 -76
  208. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_ResourceServers/delete_test_server.yml +0 -72
  209. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_permissions/should_add_a_Permission_to_the_Role_successfully.yml +0 -76
  210. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_add_role_users/should_add_a_User_to_the_Role_successfully.yml +0 -76
  211. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_delete_role/should_delete_the_Role_successfully.yml +0 -74
  212. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role/should_get_the_Role_successfully.yml +0 -75
  213. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_exactly_1_Permission.yml +0 -74
  214. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_permissions/should_get_the_added_Permission_from_the_Role_successfully.yml +0 -74
  215. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_exactly_1_User.yml +0 -74
  216. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_role_users/should_get_the_added_User_from_the_Role_successfully.yml +0 -74
  217. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_get_roles/should_get_the_Role_successfully.yml +0 -75
  218. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_remove_role_permissions/should_remove_a_Permission_from_the_Role_successfully.yml +0 -74
  219. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/_update_role/should_update_the_Role_successfully.yml +0 -76
  220. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_api.yml +0 -76
  221. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_role.yml +0 -77
  222. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/create_test_user.yml +0 -76
  223. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_api.yml +0 -72
  224. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Roles/delete_test_user.yml +0 -72
  225. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_disabled_rule_without_an_error.yml +0 -72
  226. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_delete_rule/should_delete_the_test_enabled_rule_without_an_error.yml +0 -72
  227. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_fields_not_specified.yml +0 -75
  228. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_exclude_the_specified_fields.yml +0 -75
  229. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/_filters/should_include_the_specified_fields.yml +0 -74
  230. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rule/should_get_a_specific_rule.yml +0 -75
  231. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_exclude_fields_not_specified.yml +0 -116
  232. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_include_the_specified_fields.yml +0 -118
  233. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_disabled_rule.yml +0 -95
  234. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_at_least_1_enabled_rule.yml +0 -104
  235. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/_filters/should_return_paginated_results.yml +0 -157
  236. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_rules/should_return_at_least_1_rule.yml +0 -120
  237. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/_update_rule/should_update_the_disabled_rule_to_be_enabled.yml +0 -77
  238. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_disabled_rule.yml +0 -78
  239. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Rules/create_test_enabled_rule.yml +0 -78
  240. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_active_users/should_have_at_least_one_active_user.yml +0 -74
  241. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Stats/_daily_stats/should_have_at_least_one_stats_entry_for_the_timeframe.yml +0 -74
  242. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings/should_get_the_tenant_settings.yml +0 -108
  243. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_exclude_a_field_not_requested.yml +0 -74
  244. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_get_tenant_settings_with_specific_fields/should_include_the_field_requested.yml +0 -74
  245. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_revert_the_tenant_name.yml +0 -110
  246. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tenants/_update_tenant_settings/should_update_the_tenant_settings_with_a_new_tenant_name.yml +0 -110
  247. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_email_verification/should_create_an_email_verification_ticket.yml +0 -76
  248. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/_post_password_change/should_create_a_password_change_ticket.yml +0 -76
  249. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/create_test_user.yml +0 -76
  250. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Tickets/delete_test_user.yml +0 -72
  251. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_permissions/should_add_a_Permissions_for_a_User_successfully.yml +0 -71
  252. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_add_user_roles/should_add_a_Role_to_a_User_successfully.yml +0 -74
  253. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_User_successfully.yml +0 -72
  254. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user/should_delete_the_secondary_User_successfully.yml +0 -72
  255. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_delete_user_provider/should_attempt_to_delete_the_MFA_provider_for_the_User.yml +0 -72
  256. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_enrollments/should_get_Enrollments_for_a_User_successfully.yml +0 -74
  257. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_exactly_1_Permission_for_a_User_successfully.yml +0 -74
  258. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_permissions/should_get_the_correct_Permission_for_a_User_successfully.yml +0 -74
  259. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_get_user_roles/should_get_Roles_for_a_User_successfully.yml +0 -75
  260. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_invalidate_browsers/should_invalidate_MFA_browsers_for_the_User_successfully.yml +0 -74
  261. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_link_user_account/should_link_two_Users_successfully.yml +0 -76
  262. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_patch_user/should_patch_the_User_successfully.yml +0 -78
  263. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_permissions/should_remove_a_Permission_from_a_User_successfully.yml +0 -74
  264. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_remove_user_roles/should_remove_a_Role_from_a_User_successfully.yml +0 -74
  265. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_unlink_user_account/should_unlink_two_Users_successfully.yml +0 -74
  266. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_fields_not_indicated.yml +0 -74
  267. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_exclude_the_fields_indicated.yml +0 -74
  268. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/_filters/should_include_the_fields_indicated.yml +0 -74
  269. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user/should_retrieve_the_created_user.yml +0 -74
  270. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_user_logs/should_get_Logs_for_a_User_successfully.yml +0 -81
  271. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v2_search_engine_query.yml +0 -74
  272. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/is_expected_to_find_a_user_with_a_v3_search_engine_query.yml +0 -74
  273. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_exclude_the_indicated_fields_when_paginated.yml +0 -74
  274. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_include_the_indicated_fields_when_paginated.yml +0 -74
  275. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_not_include_other_fields_when_paginated.yml +0 -74
  276. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/_filters/should_return_the_correct_number_of_results_when_paginated.yml +0 -74
  277. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/_users/should_have_at_least_one_user.yml +0 -75
  278. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_secondary_test_user.yml +0 -76
  279. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_api.yml +0 -76
  280. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_role.yml +0 -77
  281. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/create_test_user.yml +0 -76
  282. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_api.yml +0 -72
  283. data/spec/fixtures/vcr_cassettes/Auth0_Api_V2_Users/delete_test_role.yml +0 -74
  284. data/spec/integration/lib/auth0/api/api_authentication_spec.rb +0 -120
  285. data/spec/integration/lib/auth0/api/v2/api_blacklist_spec.rb +0 -27
  286. data/spec/integration/lib/auth0/api/v2/api_client_grants_spec.rb +0 -66
  287. data/spec/integration/lib/auth0/api/v2/api_clients_spec.rb +0 -166
  288. data/spec/integration/lib/auth0/api/v2/api_connections_spec.rb +0 -159
  289. data/spec/integration/lib/auth0/api/v2/api_email_spec.rb +0 -86
  290. data/spec/integration/lib/auth0/api/v2/api_jobs_spec.rb +0 -124
  291. data/spec/integration/lib/auth0/api/v2/api_logs_spec.rb +0 -91
  292. data/spec/integration/lib/auth0/api/v2/api_resource_servers_spec.rb +0 -130
  293. data/spec/integration/lib/auth0/api/v2/api_roles_spec.rb +0 -145
  294. data/spec/integration/lib/auth0/api/v2/api_rules_spec.rb +0 -177
  295. data/spec/integration/lib/auth0/api/v2/api_stats_spec.rb +0 -22
  296. data/spec/integration/lib/auth0/api/v2/api_tenants_spec.rb +0 -59
  297. data/spec/integration/lib/auth0/api/v2/api_tickets_spec.rb +0 -59
  298. data/spec/integration/lib/auth0/api/v2/api_user_blocks_spec.rb +0 -76
  299. data/spec/integration/lib/auth0/api/v2/api_users_spec.rb +0 -273
  300. data/spec/integration/lib/auth0/auth0_client_spec.rb +0 -90
  301. data/spec/lib/auth0/api/authentication_endpoints_spec.rb +0 -750
  302. data/spec/lib/auth0/api/v2/actions_spec.rb +0 -322
  303. data/spec/lib/auth0/api/v2/anomaly_spec.rb +0 -26
  304. data/spec/lib/auth0/api/v2/attack_protection_spec.rb +0 -132
  305. data/spec/lib/auth0/api/v2/blacklists_spec.rb +0 -25
  306. data/spec/lib/auth0/api/v2/branding_spec.rb +0 -71
  307. data/spec/lib/auth0/api/v2/client_grants_spec.rb +0 -106
  308. data/spec/lib/auth0/api/v2/clients_spec.rb +0 -155
  309. data/spec/lib/auth0/api/v2/connections_spec.rb +0 -164
  310. data/spec/lib/auth0/api/v2/device_credentials_spec.rb +0 -102
  311. data/spec/lib/auth0/api/v2/emails_spec.rb +0 -47
  312. data/spec/lib/auth0/api/v2/grants_spec.rb +0 -91
  313. data/spec/lib/auth0/api/v2/guardian_spec.rb +0 -154
  314. data/spec/lib/auth0/api/v2/jobs_spec.rb +0 -158
  315. data/spec/lib/auth0/api/v2/log_streams_spec.rb +0 -84
  316. data/spec/lib/auth0/api/v2/logs_spec.rb +0 -48
  317. data/spec/lib/auth0/api/v2/organizations_spec.rb +0 -708
  318. data/spec/lib/auth0/api/v2/prompts_spec.rb +0 -88
  319. data/spec/lib/auth0/api/v2/refresh_tokens_spec.rb +0 -51
  320. data/spec/lib/auth0/api/v2/resource_servers_spec.rb +0 -86
  321. data/spec/lib/auth0/api/v2/roles_spec.rb +0 -366
  322. data/spec/lib/auth0/api/v2/rules_spec.rb +0 -95
  323. data/spec/lib/auth0/api/v2/sessions_spec.rb +0 -71
  324. data/spec/lib/auth0/api/v2/stats_spec.rb +0 -22
  325. data/spec/lib/auth0/api/v2/tenants_spec.rb +0 -26
  326. data/spec/lib/auth0/api/v2/tickets_spec.rb +0 -118
  327. data/spec/lib/auth0/api/v2/user_blocks_spec.rb +0 -52
  328. data/spec/lib/auth0/api/v2/users_by_email_spec.rb +0 -21
  329. data/spec/lib/auth0/api/v2/users_spec.rb +0 -904
  330. data/spec/lib/auth0/client_spec.rb +0 -223
  331. data/spec/lib/auth0/mixins/httpproxy_spec.rb +0 -659
  332. data/spec/lib/auth0/mixins/initializer_spec.rb +0 -172
  333. data/spec/lib/auth0/mixins/token_management_spec.rb +0 -136
  334. data/spec/lib/auth0/mixins/validation_spec.rb +0 -562
  335. data/spec/spec_helper.rb +0 -70
  336. data/spec/support/credentials.rb +0 -11
  337. data/spec/support/dummy_class.rb +0 -18
  338. data/spec/support/dummy_class_for_proxy.rb +0 -5
  339. data/spec/support/dummy_class_for_restclient.rb +0 -2
  340. data/spec/support/dummy_class_for_tokens.rb +0 -20
  341. data/spec/support/import_users.json +0 -13
  342. data/spec/support/stub_response.rb +0 -1
@@ -1,562 +0,0 @@
1
- # rubocop:disable Metrics/BlockLength
2
- require 'spec_helper'
3
- require 'jwt'
4
-
5
- RSA_PUB_KEY_JWK_1 = { 'kty': "RSA", 'use': 'sig', 'n': "uGbXWiK3dQTyCbX5xdE4yCuYp0AF2d15Qq1JSXT_lx8CEcXb9RbDddl8jGDv-spi5qPa8qEHiK7FwV2KpRE983wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVsWXI9C-yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT69s7of9-I9l5lsJ9cozf1rxrXX4V1u_SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8AziMCxS-VrRPDM-zfvpIJg3JljAh3PJHDiLu902v9w-Iplu1WyoB2aPfitxEhRN0Yw", 'e': 'AQAB', 'kid': 'test-key-1' }.freeze
6
- RSA_PUB_KEY_JWK_2 = { 'kty': "RSA", 'use': 'sig', 'n': "uGbXWiK3dQTyCbX5xdE4yCuYp0AF2d15Qq1JSXT_lx8CEcXb9RbDddl8jGDv-spi5qPa8qEHiK7FwV2KpRE983wGPnYsAm9BxLFb4YrLYcDFOIGULuk2FtrPS512Qea1bXASuvYXEpQNpGbnTGVsWXI9C-yjHztqyL2h8P6mlThPY9E9ue2fCqdgixfTFIF9Dm4SLHbphUS2iw7w1JgT69s7of9-I9l5lsJ9cozf1rxrXX4V1u_SotUuNB3Fp8oB4C1fLBEhSlMcUJirz1E8AziMCxS-VrRPDM-zfvpIJg3JljAh3PJHDiLu902v9w-Iplu1WyoB2aPfitxEhRN0Yw", 'e': 'AQAB', 'kid': 'test-key-2' }.freeze
7
- JWKS_RESPONSE_1 = { 'keys': [RSA_PUB_KEY_JWK_1] }.freeze
8
- JWKS_RESPONSE_2 = { 'keys': [RSA_PUB_KEY_JWK_2] }.freeze
9
- JWKS_URL = 'https://tokens-test.auth0.com/.well-known/jwks.json'.freeze
10
- JWKS_URL_2 = 'https://tokens-test2.auth0.com/.well-known/jwks.json'.freeze
11
- HMAC_SHARED_SECRET = 'secret'.freeze
12
-
13
- LEEWAY = 60
14
- CLOCK = 1587592561 # Apr 22 2020 21:56:01 UTC
15
- CONTEXT = { algorithm: Auth0::Algorithm::HS256.secret(HMAC_SHARED_SECRET), leeway: LEEWAY, audience: 'tokens-test-123', issuer: 'https://tokens-test.auth0.com/', clock: CLOCK }.freeze
16
-
17
- def build_id_token(payload = {})
18
- default_payload = { iss: CONTEXT[:issuer], sub: 'user123', aud: CONTEXT[:audience], exp: CLOCK, iat: CLOCK }
19
- JWT.encode(default_payload.merge(payload), HMAC_SHARED_SECRET, 'HS256')
20
- end
21
-
22
- describe Auth0::Mixins::Validation::IdTokenValidator do
23
- subject { @instance }
24
- let (:minimal_id_token) { build_id_token }
25
-
26
- context 'instance' do
27
- it 'is expected respond to :validate' do
28
- instance = Auth0::Mixins::Validation::IdTokenValidator.new({})
29
-
30
- expect(instance).to respond_to(:validate)
31
- end
32
- end
33
-
34
- context 'ID token decoding' do
35
- expected_error = 'ID token could not be decoded'
36
- instance = Auth0::Mixins::Validation::IdTokenValidator.new({})
37
-
38
- it 'is expected to raise an error with a nil id_token' do
39
- expect { instance.validate(nil) }.to raise_exception(expected_error)
40
- end
41
-
42
- it 'is expected to raise an error with an empty id_token' do
43
- expect { instance.validate('') }.to raise_exception(expected_error)
44
- end
45
-
46
- it 'is expected to raise an error with an invalid format' do
47
- expect { instance.validate('a.b') }.to raise_exception(expected_error)
48
- expect { instance.validate('a.b.') }.to raise_exception(expected_error)
49
- expect { instance.validate('a.b.c.d') }.to raise_exception(expected_error)
50
- end
51
-
52
- it 'is expected to raise an error with an invalid encoding' do
53
- expect { instance.validate('a.b.c') }.to raise_exception(expected_error)
54
- end
55
- end
56
-
57
- context 'algorithm verification' do
58
- token = 'eyJhbGciOiJFUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.Hn38QVtN_mWN0c-jOa-Fqq69kXpbBp0THsvE-CQ47Ps'
59
-
60
- it 'is expected to raise an error with an unsupported algorithm' do
61
- instance = Auth0::Mixins::Validation::IdTokenValidator.new({ algorithm: 'ES256' })
62
-
63
- expect { instance.validate(token) }.to raise_exception('Signature algorithm of "ES256" is not supported')
64
- end
65
-
66
- it 'is expected to raise an error when the algorithm does not match the alg header value' do
67
- algorithm = Auth0::Algorithm::HS256.secret(HMAC_SHARED_SECRET)
68
- instance = Auth0::Mixins::Validation::IdTokenValidator.new({ algorithm: algorithm })
69
-
70
- expect { instance.validate(token) }.to raise_exception('Signature algorithm of "ES256" is not supported. Expected the ID token to be signed with "HS256"')
71
- end
72
- end
73
-
74
- context 'HS256 signature verification' do
75
- before :each do
76
- algorithm = Auth0::Algorithm::HS256.secret(HMAC_SHARED_SECRET)
77
- @instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ algorithm: algorithm }))
78
- end
79
-
80
- it 'is expected not to raise an error with a valid signature' do
81
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.Hn38QVtN_mWN0c-jOa-Fqq69kXpbBp0THsvE-CQ47Ps'
82
-
83
- expect { @instance.validate(token) }.not_to raise_exception
84
- end
85
-
86
- it 'is expected to raise an error with an invalid signature' do
87
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.invalidsignature'
88
-
89
- expect { @instance.validate(token) }.to raise_exception('Invalid ID token signature')
90
- end
91
- end
92
-
93
- context 'RS256 signature verification' do
94
- before :each do
95
- stub_jwks
96
- algorithm = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
97
- @instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ algorithm: algorithm }))
98
- end
99
-
100
- after :each do
101
- Auth0::Algorithm::RS256.remove_jwks
102
- WebMock.reset!
103
- end
104
-
105
- it 'is expected not to raise an error with a valid signature' do
106
- token = 'eyJhbGciOiJSUzI1NiIsImtpZCI6InRlc3Qta2V5LTEifQ.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.jE00ARUiAwrKEoAMwbioKYj4bUZjmg31V7McDtIPsJJ16rYcvI-e5mtSSMgCmAom6t-WA7dsSWCJUlBCW2nAMvyCZ-hj8HG9Z0RmQEiwig9Fk22avoX94zdx65TwAeDfn2uMRaX_ps3TJcn4nymUtMp8Lps_vMw15eJerKThlSO4KuLTrvDDdRaCRamAd7jxuzhiwOt0mB0TVD55b5itA02pGuyapbjQXvvLYEx8OgpyIaAkB9Ry25abgjev0bSw2kjFZckG3lv9QgvZM85m9l3Rbrc6msNPGfMDFWGyT3Tu2ObqnSEA-57hZeuCbFrOya3vUwgSlc66rfvZj2xpzg'
107
-
108
- expect { @instance.validate(token) }.not_to raise_exception
109
- end
110
-
111
- it 'is expected to raise an error with an invalid signature' do
112
- token = 'eyJhbGciOiJSUzI1NiIsImtpZCI6InRlc3Qta2V5LTEifQ.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.invalidsignature'
113
-
114
- expect { @instance.validate(token) }.to raise_exception('Invalid ID token signature')
115
- end
116
-
117
- it 'is expected to raise an error when the public key cannot be found' do
118
- token = 'eyJhbGciOiJSUzI1NiIsImtpZCI6InRlc3Qta2V5LTIifQ.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.r2ksgiiM8zGJ6byea_Fq_zWWEmUdOnwQLVdb5JzgdBv1GUQFp-4LNaRhcga4FIrbKgxaPeewGLTq2VqfjmNJUNfARcE3QEacQ_JEHkC6zKZIiqcu4msHl8X9HXyHxOPHMTTjYMjauPzET7UH_oLxF68DDDQqvKX9VqLsncpyC-KdTCFTLGlFSq6pxmYt6gwrF2Uo15Gzc6qe2I9-MTXCYd44VW1zQi6GhNJNKbXH6U3bf7nof0ot1PSjBXXuLgf6d3qumTStECCjIUmdBb6FiEX4SSRI4MgHWj4q0LyN28baRpYwYPhVnjzUxOP7OLjKiHs45ORBhuAWhrJnuR_uBQ'
119
-
120
- expect { @instance.validate(token) }.to raise_exception('Could not find a public key for Key ID (kid) "test-key-2"')
121
- end
122
-
123
- it 'is expected to fetch the JWK set from the url if the public key cannot be found and the cache is not empty' do
124
- token = 'eyJhbGciOiJSUzI1NiIsImtpZCI6InRlc3Qta2V5LTIifQ.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.r2ksgiiM8zGJ6byea_Fq_zWWEmUdOnwQLVdb5JzgdBv1GUQFp-4LNaRhcga4FIrbKgxaPeewGLTq2VqfjmNJUNfARcE3QEacQ_JEHkC6zKZIiqcu4msHl8X9HXyHxOPHMTTjYMjauPzET7UH_oLxF68DDDQqvKX9VqLsncpyC-KdTCFTLGlFSq6pxmYt6gwrF2Uo15Gzc6qe2I9-MTXCYd44VW1zQi6GhNJNKbXH6U3bf7nof0ot1PSjBXXuLgf6d3qumTStECCjIUmdBb6FiEX4SSRI4MgHWj4q0LyN28baRpYwYPhVnjzUxOP7OLjKiHs45ORBhuAWhrJnuR_uBQ'
125
- Auth0::Algorithm::RS256.jwks_url(JWKS_URL).jwks
126
- stub_jwks(JWKS_RESPONSE_2)
127
- @instance.validate(token)
128
-
129
- expect(a_request(:get, JWKS_URL)).to have_been_made.twice
130
- end
131
- end
132
-
133
- context 'context validation' do
134
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.Hn38QVtN_mWN0c-jOa-Fqq69kXpbBp0THsvE-CQ47Ps'
135
-
136
- it 'is expected to raise an error with a non-integer leeway' do
137
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ leeway: '1' }))
138
-
139
- expect { instance.validate(token) }.to raise_exception('Must supply a valid leeway')
140
- end
141
-
142
- it 'is expected to raise an error with a negative leeway' do
143
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ leeway: -1 }))
144
-
145
- expect { instance.validate(token) }.to raise_exception('Must supply a valid leeway')
146
- end
147
-
148
- it 'is expected to raise an error with an empty nonce' do
149
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ nonce: '' }))
150
-
151
- expect { instance.validate(token) }.to raise_exception('Must supply a valid nonce')
152
- end
153
-
154
- it 'is expected to raise an error with an empty organization' do
155
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: '' }))
156
-
157
- expect { instance.validate(token) }.to raise_exception('Must supply a valid organization')
158
- end
159
-
160
- it 'is expected to raise an error with an empty issuer' do
161
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ issuer: '' }))
162
-
163
- expect { instance.validate(token) }.to raise_exception('Must supply a valid issuer')
164
- end
165
-
166
- it 'is expected to raise an error with an empty audience' do
167
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ audience: '' }))
168
-
169
- expect { instance.validate(token) }.to raise_exception('Must supply a valid audience')
170
- end
171
-
172
- it 'is expected to raise an error with a non-integer max_age' do
173
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ max_age: '1' }))
174
-
175
- expect { instance.validate(token) }.to raise_exception('Must supply a valid max_age')
176
- end
177
-
178
- it 'is expected to raise an error with a negative max_age' do
179
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ max_age: -1 }))
180
-
181
- expect { instance.validate(token) }.to raise_exception('Must supply a valid max_age')
182
- end
183
- end
184
-
185
- context 'claims validation' do
186
- before :all do
187
- @instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT)
188
- end
189
-
190
- it 'is expected to raise an error with a missing iss' do
191
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.QL2B2tqJhlW9rc8HQ3PQKkjDufBeSvtRBtJmRPdQ5K8'
192
-
193
- expect { @instance.validate(token) }.to raise_exception('Issuer (iss) claim must be a string present in the ID token')
194
- end
195
-
196
- it 'is expected to raise an error with a invalid iss' do
197
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJzb21ldGhpbmctZWxzZSIsInN1YiI6ImF1dGgwfDEyMzQ1Njc4OSIsImF1ZCI6WyJ0b2tlbnMtdGVzdC0xMjMiLCJleHRlcm5hbC10ZXN0LTk5OSJdLCJleHAiOjE1ODc3NjUzNjEsImlhdCI6MTU4NzU5MjU2MSwibm9uY2UiOiJhMWIyYzNkNGU1IiwiYXpwIjoidG9rZW5zLXRlc3QtMTIzIiwiYXV0aF90aW1lIjoxNTg3Njc4OTYxfQ.AhMMouDlGMdxTYrY9Cn-p8svJ8ssKmsHeT6JNRVTh10'
198
-
199
- expect { @instance.validate(token) }.to raise_exception("Issuer (iss) claim mismatch in the ID token; expected \"#{CONTEXT[:issuer]}\", found \"something-else\"")
200
- end
201
-
202
- it 'is expected to raise an error with a missing sub' do
203
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0._4sUXtAZYpGrO3QaYArXnk2JivCqixa7hgHhH3w4SlY'
204
-
205
- expect { @instance.validate(token) }.to raise_exception('Subject (sub) claim must be a string present in the ID token')
206
- end
207
-
208
- it 'is expected to raise an error with a missing aud' do
209
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJleHAiOjE1ODc3NjUzNjEsImlhdCI6MTU4NzU5MjU2MSwibm9uY2UiOiJhMWIyYzNkNGU1IiwiYXpwIjoidG9rZW5zLXRlc3QtMTIzIiwiYXV0aF90aW1lIjoxNTg3Njc4OTYxfQ.TlwnBmGUKe0SElSYKxPqsG1mujkK2t1CwDJGGiWRdXA'
210
-
211
- expect { @instance.validate(token) }.to raise_exception('Audience (aud) claim must be a string or array of strings present in the ID token')
212
- end
213
-
214
- it 'is expected to raise an error with an invalid string aud' do
215
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOiJleHRlcm5hbC10ZXN0LTk5OSIsImV4cCI6MTU4Nzc2NTM2MSwiaWF0IjoxNTg3NTkyNTYxLCJub25jZSI6ImExYjJjM2Q0ZTUiLCJhenAiOiJ0b2tlbnMtdGVzdC0xMjMiLCJhdXRoX3RpbWUiOjE1ODc2Nzg5NjF9.-Tf5CIi2bZ51UdgqxFWQNXpJJmK5GgsetcVoVrQwHIA'
216
-
217
- expect { @instance.validate(token) }.to raise_exception("Audience (aud) claim mismatch in the ID token; expected \"#{CONTEXT[:audience]}\", found \"external-test-999\"")
218
- end
219
-
220
- it 'is expected to raise an error with an invalid array aud' do
221
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsiZXh0ZXJuYWwtdGVzdC05OTgiLCJleHRlcm5hbC10ZXN0LTk5OSJdLCJleHAiOjE1ODc3NjUzNjEsImlhdCI6MTU4NzU5MjU2MSwibm9uY2UiOiJhMWIyYzNkNGU1IiwiYXpwIjoidG9rZW5zLXRlc3QtMTIzIiwiYXV0aF90aW1lIjoxNTg3Njc4OTYxfQ.Q1GRVL5g3RLQqG5sEV_cc8WW_oiZzFIAfzRfBdxMW2s'
222
-
223
- expect { @instance.validate(token) }.to raise_exception("Audience (aud) claim mismatch in the ID token; expected \"#{CONTEXT[:audience]}\" but was not one of \"external-test-998, external-test-999\"")
224
- end
225
-
226
- it 'is expected to raise an error with a missing exp' do
227
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiaWF0IjoxNTg3NTkyNTYxLCJub25jZSI6ImExYjJjM2Q0ZTUiLCJhenAiOiJ0b2tlbnMtdGVzdC0xMjMiLCJhdXRoX3RpbWUiOjE1ODc2Nzg5NjF9.aoLiQX3sHsf1bEbc0axbjJ9qV6hhomtEzJq-FT8OGF0'
228
-
229
- expect { @instance.validate(token) }.to raise_exception('Expiration Time (exp) claim must be a number present in the ID token')
230
- end
231
-
232
- it 'is expected to raise an error with a invalid exp' do
233
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NTkyNTYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.A8Pc0vlCG5Ufez7VIoRqXTYpJehalTEgGX9cR2xJLkU'
234
- clock = CLOCK + LEEWAY + 1
235
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ clock: clock }))
236
-
237
- expect { instance.validate(token) }.to raise_exception("Expiration Time (exp) claim mismatch in the ID token; current time \"#{clock}\" is after expiration time \"1587592621\"")
238
- end
239
-
240
- it 'is expected to raise an error with a missing iat' do
241
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJub25jZSI6ImExYjJjM2Q0ZTUiLCJhenAiOiJ0b2tlbnMtdGVzdC0xMjMiLCJhdXRoX3RpbWUiOjE1ODc2Nzg5NjF9.Jea6UVJsAK7Hnb494f_WIQCIbaLTnnCvMenSY1Y2toc'
242
-
243
- expect { @instance.validate(token) }.to raise_exception('Issued At (iat) claim must be a number present in the ID token')
244
- end
245
-
246
- it 'is expected not to raise an error with a missing but not required nonce' do
247
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.-o5grnyODbBdRgzcrn7Sf9Hb6eOC0x_U2i3YjVgHN0U'
248
-
249
- expect { @instance.validate(token) }.not_to raise_exception
250
- end
251
-
252
- it 'is expected to raise an error with a missing but required nonce' do
253
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.-o5grnyODbBdRgzcrn7Sf9Hb6eOC0x_U2i3YjVgHN0U'
254
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ nonce: 'a1b2c3d4e5' }))
255
-
256
- expect { instance.validate(token) }.to raise_exception('Nonce (nonce) claim must be a string present in the ID token')
257
- end
258
-
259
- it 'is expected to raise an error with an invalid nonce' do
260
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiMDAwOTk5IiwiYXpwIjoidG9rZW5zLXRlc3QtMTIzIiwiYXV0aF90aW1lIjoxNTg3Njc4OTYxfQ.XqQPdFN4m5kmTUQQi_mAJu0LQOeUTS9lF2J_xWc_j-0'
261
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ nonce: 'a1b2c3d4e5' }))
262
-
263
- expect { instance.validate(token) }.to raise_exception('Nonce (nonce) claim mismatch in the ID token; expected "a1b2c3d4e5", found "000999"')
264
- end
265
-
266
- it 'is expected to raise an error with a missing azp' do
267
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF1dGhfdGltZSI6MTU4NzY3ODk2MX0.LrgYkIbWrxMq6jvvkL1lxWL237ii1IBhtN2o_tDxFns'
268
-
269
- expect { @instance.validate(token) }.to raise_exception('Authorized Party (azp) claim must be a string present in the ID token')
270
- end
271
-
272
- it 'is expected to raise an error with an invalid azp' do
273
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6ImV4dGVybmFsLXRlc3QtOTk5IiwiYXV0aF90aW1lIjoxNTg3Njc4OTYxfQ.3DX-LY3B4UngDML-9nv11Sv89ECJpRpOLeWnkF1vAFY'
274
-
275
- expect { @instance.validate(token) }.to raise_exception("Authorized Party (azp) claim mismatch in the ID token; expected \"tokens-test-123\", found \"external-test-999\"")
276
- end
277
-
278
- it 'is expected to raise an error with a missing auth_time' do
279
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyJ9.JqUotnjHbGW0FcHz1s1YsRkce9Sbpsv2AEBDMpcUhp8'
280
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ max_age: 120 }))
281
-
282
- expect { instance.validate(token) }.to raise_exception('Authentication Time (auth_time) claim must be a number present in the ID token when Max Age (max_age) is specified')
283
- end
284
-
285
- it 'is expected to raise an error with a invalid auth_time' do
286
- token = 'eyJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL3Rva2Vucy10ZXN0LmF1dGgwLmNvbS8iLCJzdWIiOiJhdXRoMHwxMjM0NTY3ODkiLCJhdWQiOlsidG9rZW5zLXRlc3QtMTIzIiwiZXh0ZXJuYWwtdGVzdC05OTkiXSwiZXhwIjoxNTg3NzY1MzYxLCJpYXQiOjE1ODc1OTI1NjEsIm5vbmNlIjoiYTFiMmMzZDRlNSIsImF6cCI6InRva2Vucy10ZXN0LTEyMyIsImF1dGhfdGltZSI6MTU4NzU5MjU2MX0.B7eWHJPHjhOh0ALjIQi0ro6zVsqGIeHd0gpRZsv6Hg8'
287
- max_age = 120
288
- auth_time = CLOCK + LEEWAY + max_age
289
- clock = auth_time + 1
290
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ max_age: max_age, clock: clock }))
291
-
292
- expect { instance.validate(token) }.to raise_exception("Authentication Time (auth_time) claim in the ID token indicates that too much time has passed since the last end-user authentication. Current time \"#{clock}\" is after last auth at \"#{auth_time}\"")
293
- end
294
-
295
- context 'Organization claims validation' do
296
- it 'is expected not to raise an error when org_id exsist in the token, but not required' do
297
- token = build_id_token org_id: 'org_123'
298
- expect { @instance.validate(token) }.not_to raise_exception
299
- end
300
-
301
- it 'is expected not to raise an error when org_name exists in the token, but not required' do
302
- token = build_id_token org_name: 'my-organization'
303
- expect { @instance.validate(token) }.not_to raise_exception
304
- end
305
-
306
- it 'is expected to raise an error with a missing but required organization ID' do
307
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'org_1234' }))
308
- expect { instance.validate(minimal_id_token) }.to raise_exception('Organization Id (org_id) claim must be a string present in the ID token')
309
- end
310
-
311
- it 'is expected to raise an error with a missing but required organization name' do
312
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'my-organization' }))
313
- expect { instance.validate(minimal_id_token) }.to raise_exception('Organization Name (org_name) claim must be a string present in the ID token')
314
- end
315
-
316
- it 'is expected to raise an error with an invalid organization ID' do
317
- token = build_id_token org_id: 'org_1234'
318
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'org_5678' }))
319
-
320
- expect { instance.validate(token) }.to raise_exception('Organization Id (org_id) claim value mismatch in the ID token; expected "org_5678", found "org_1234"')
321
- end
322
-
323
- it 'is expected to raise an error with an invalid organization name' do
324
- token = build_id_token org_name: 'another-organization'
325
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'my-organization' }))
326
-
327
- expect { instance.validate(token) }.to raise_exception('Organization Name (org_name) claim value mismatch in the ID token; expected "my-organization", found "another-organization"')
328
- end
329
-
330
- it 'is expected to NOT raise an error with a valid organization ID' do
331
- token = build_id_token org_id: 'org_1234'
332
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'org_1234' }))
333
-
334
- expect { instance.validate(token) }.not_to raise_exception
335
- end
336
-
337
- it 'is expected to NOT raise an error with a valid organization name' do
338
- token = build_id_token org_name: 'my-organization'
339
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'my-organization' }))
340
-
341
- expect { instance.validate(token) }.not_to raise_exception
342
- end
343
-
344
- it 'is expected to NOT raise an error with organization name in different casing' do
345
- token = build_id_token org_name: 'my-organization'
346
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'MY-ORGANIZATION' }))
347
-
348
- expect { instance.validate(token) }.not_to raise_exception
349
- end
350
-
351
- it 'validates org_id when both claims are present in the token' do
352
- token = build_id_token org_name: 'my-organization', org_id: 'org_1234'
353
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'org_1234' }))
354
- expect { instance.validate(token) }.not_to raise_exception
355
- end
356
-
357
- it 'validates org_name when both claims are present in the token' do
358
- token = build_id_token org_name: 'my-organization', org_id: 'org_1234'
359
- instance = Auth0::Mixins::Validation::IdTokenValidator.new(CONTEXT.merge({ organization: 'my-organization' }))
360
- expect { instance.validate(token) }.not_to raise_exception
361
- end
362
- end
363
- end
364
- end
365
-
366
- describe Auth0::Algorithm::HS256 do
367
- context 'class' do
368
- it 'is expected to respond to :secret' do
369
- expect(Auth0::Algorithm::HS256).to respond_to(:secret)
370
- end
371
-
372
- it 'is expected not to respond to :new' do
373
- expect(Auth0::Algorithm::HS256).not_to respond_to(:new)
374
- end
375
- end
376
-
377
- context 'instance' do
378
- it 'is expected to respond to :secret' do
379
- instance = Auth0::Algorithm::HS256.secret('secret')
380
-
381
- expect(instance).to respond_to(:secret)
382
- end
383
-
384
- it 'is expected to return the secret' do
385
- instance = Auth0::Algorithm::HS256.secret('secret')
386
-
387
- expect(instance.secret).to eq('secret')
388
- end
389
-
390
- it 'is expected to return the algorithm name' do
391
- instance = Auth0::Algorithm::HS256.secret('secret')
392
-
393
- expect(instance.name).to eq('HS256')
394
- end
395
- end
396
-
397
- context 'parameters' do
398
- expected_error = 'Must supply a valid secret'
399
-
400
- it 'is expected to raise an error with a nil secret' do
401
- expect { Auth0::Algorithm::HS256.secret(nil) }.to raise_exception(expected_error)
402
- end
403
-
404
- it 'is expected to raise an error with an empty secret' do
405
- expect { Auth0::Algorithm::HS256.secret('') }.to raise_exception(expected_error)
406
- end
407
- end
408
- end
409
-
410
- describe Auth0::Algorithm::RS256 do
411
- before :each do
412
- stub_jwks
413
- end
414
-
415
- after :each do
416
- Auth0::Algorithm::RS256.remove_jwks
417
- WebMock.reset!
418
- end
419
-
420
- context 'class' do
421
- it 'is expected to respond to :jwks_url' do
422
- expect(Auth0::Algorithm::RS256).to respond_to(:jwks_url)
423
- end
424
-
425
- it 'is expected not to respond to :new' do
426
- expect(Auth0::Algorithm::RS256).not_to respond_to(:new)
427
- end
428
- end
429
-
430
- context 'instance' do
431
- it 'is expected to respond to :jwks' do
432
- instance = Auth0::Algorithm::RS256.jwks_url('jwks url')
433
-
434
- expect(instance).to respond_to(:jwks)
435
- end
436
-
437
- it 'is expected to respond to :fetched_jwks?' do
438
- instance = Auth0::Algorithm::RS256.jwks_url('jwks url')
439
-
440
- expect(instance).to respond_to(:fetched_jwks?)
441
- end
442
-
443
- it 'is expected to return a jwks' do
444
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
445
-
446
- expect(instance.jwks).to have_key('keys') and contain_exactly(a_hash_including(kid: 'test-key-1'))
447
- end
448
-
449
- it 'is expected to return if the jwks was fetched from the url' do
450
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
451
- instance.jwks
452
-
453
- expect(instance.fetched_jwks?).to eq(true)
454
- end
455
-
456
- it 'is expected to return if the jwks was fetched from the cache' do
457
- Auth0::Algorithm::RS256.jwks_url(JWKS_URL).jwks
458
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
459
- instance.jwks
460
-
461
- expect(instance.fetched_jwks?).to eq(false)
462
- end
463
-
464
- it 'is expected to return the algorithm name' do
465
- instance = Auth0::Algorithm::RS256.jwks_url('jwks url')
466
-
467
- expect(instance.name).to eq('RS256')
468
- end
469
- end
470
-
471
- context 'parameters' do
472
- it 'is expected to raise an error with a nil jwks_url' do
473
- expect { Auth0::Algorithm::RS256.jwks_url(nil) }.to raise_exception('Must supply a valid jwks_url')
474
- end
475
-
476
- it 'is expected to raise an error with an empty jwks_url' do
477
- expect { Auth0::Algorithm::RS256.jwks_url('') }.to raise_exception('Must supply a valid jwks_url')
478
- end
479
-
480
- it 'is expected to raise an error with a non-integer lifetime' do
481
- expect { Auth0::Algorithm::RS256.jwks_url('jwks url', lifetime: '1') }.to raise_exception('Must supply a valid lifetime')
482
- end
483
-
484
- it 'is expected to raise an error with a negative lifetime' do
485
- expect { Auth0::Algorithm::RS256.jwks_url('jwks url', lifetime: -1) }.to raise_exception('Must supply a valid lifetime')
486
- end
487
- end
488
-
489
- context 'cache' do
490
- it 'is expected to fetch the jwks from the url when the cache is empty' do
491
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
492
- instance.jwks
493
-
494
- expect(a_request(:get, JWKS_URL)).to have_been_made.once
495
- end
496
-
497
- it 'is expected to fetch the jwks from the url when the cache is expired' do
498
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL, lifetime: 0)
499
- instance.jwks
500
- instance.jwks
501
-
502
- expect(a_request(:get, JWKS_URL)).to have_been_made.twice
503
- end
504
-
505
- it 'is not expected to fetch the jwks from the url when there is a value cached' do
506
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
507
- instance.jwks
508
- instance.jwks
509
-
510
- expect(a_request(:get, JWKS_URL)).to have_been_made.once
511
- end
512
-
513
- it 'is expected to fetch the jwks from multiple urls' do
514
- stub_jwks(JWKS_RESPONSE_2, JWKS_URL_2)
515
-
516
- instance1 = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
517
- instance2 = Auth0::Algorithm::RS256.jwks_url(JWKS_URL_2)
518
- instance1.jwks
519
- instance2.jwks
520
- instance1.jwks
521
-
522
- expect(a_request(:get, JWKS_URL)).to have_been_made.once
523
- expect(a_request(:get, JWKS_URL_2)).to have_been_made.once
524
- end
525
-
526
- it 'is expected to forcibly fetch the jwks from the url' do
527
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
528
- instance.jwks
529
- instance.jwks(force: true)
530
-
531
- expect(a_request(:get, JWKS_URL)).to have_been_made.twice
532
- end
533
-
534
- it 'is expected to forcibly fetch the jwks from the url and cache it' do
535
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
536
- instance.jwks(force: true)
537
- instance.jwks
538
-
539
- expect(a_request(:get, JWKS_URL)).to have_been_made.once
540
- end
541
-
542
- it 'is expected to return the last cached value if the jwks could not be fetched' do
543
- Auth0::Algorithm::RS256.jwks_url(JWKS_URL).jwks
544
- stub_request(:get, JWKS_URL).to_return(body: 'invalid')
545
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
546
-
547
- expect(instance.jwks).to have_key('keys') and contain_exactly(a_hash_including(kid: 'test-key-1'))
548
- end
549
-
550
- it 'is expected to raise an error if the jwks could not be fetched and the cache is empty' do
551
- stub_request(:get, JWKS_URL).to_return(body: 'invalid')
552
- instance = Auth0::Algorithm::RS256.jwks_url(JWKS_URL)
553
-
554
- expect { instance.jwks }.to raise_exception('Could not fetch the JWK set')
555
- end
556
- end
557
- end
558
- # rubocop:enable Metrics/BlockLength
559
-
560
- def stub_jwks(stub = JWKS_RESPONSE_1, url = JWKS_URL)
561
- stub_request(:get, url).to_return(body: stub.to_json)
562
- end
data/spec/spec_helper.rb DELETED
@@ -1,70 +0,0 @@
1
- require 'faker'
2
- require 'json'
3
- require 'auth0'
4
-
5
- if RUBY_VERSION >= '2.7.2'
6
- # NOTE: https://bugs.ruby-lang.org/issues/17000
7
- Warning[:deprecated] = true
8
- end
9
-
10
- require 'simplecov'
11
- SimpleCov.start
12
-
13
- if ENV['CI'] == 'true'
14
- require 'simplecov-cobertura'
15
- SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
16
- end
17
-
18
- require 'dotenv'
19
- Dotenv.load
20
-
21
- require 'webmock/rspec'
22
- WebMock.allow_net_connect!
23
-
24
- require 'vcr'
25
- VCR.configure do |config|
26
- # Uncomment the line below to record new VCR cassettes.
27
- # When this is commented out, VCR will reject all outbound HTTP calls.
28
- config.allow_http_connections_when_no_cassette = true
29
- config.cassette_library_dir = 'spec/fixtures/vcr_cassettes'
30
- config.configure_rspec_metadata!
31
- config.hook_into :webmock
32
- config.filter_sensitive_data('CLIENT_SECRET') { ENV['CLIENT_SECRET'] }
33
- config.filter_sensitive_data('API_TOKEN') { ENV['MASTER_JWT'] }
34
-
35
- ENV['DOMAIN'] = 'auth0-sdk-tests.auth0.com'
36
- ENV['CLIENT_ID'] = '2cnWuug6zaFX1j0ge1P99jAUn0F4XSuI'
37
- end
38
-
39
- $LOAD_PATH.unshift File.expand_path('..', __FILE__)
40
- $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
41
-
42
- Dir['./lib/*.rb'].each { |f| require f }
43
- Dir['./lib/api/**/*.rb'].each { |f| require f }
44
- Dir['./spec/support/**/*.rb'].each { |f| require f }
45
- Dir['./spec/support/*.rb'].each { |f| require f }
46
-
47
- require 'rspec'
48
- RSpec.configure do |config|
49
- config.filter_run focus: true
50
- config.run_all_when_everything_filtered = true
51
- config.include Credentials
52
-
53
- config.expect_with :rspec do |c|
54
- c.max_formatted_output_length = 1000000
55
- end
56
- end
57
-
58
- def wait(time, increment = 5, elapsed_time = 0, &block)
59
- yield
60
- rescue RSpec::Expectations::ExpectationNotMetError => e
61
- raise e if elapsed_time >= time
62
- sleep increment
63
- wait(time, increment, elapsed_time + increment, &block)
64
- end
65
-
66
- def entity_suffix
67
- 'rubytest-210908'
68
- end
69
-
70
- puts "Entity suffix is #{entity_suffix}"
@@ -1,11 +0,0 @@
1
- module Credentials
2
- module_function
3
- def v2_creds
4
- {
5
- domain: ENV.fetch( 'DOMAIN', 'DOMAIN' ),
6
- client_id: ENV.fetch( 'CLIENT_ID', 'CLIENT_ID' ),
7
- client_secret: ENV.fetch( 'CLIENT_SECRET', 'TEST_CLIENT_SECRET' ),
8
- token: ENV.fetch( 'MASTER_JWT', 'TEST_MASTER_JWT' )
9
- }
10
- end
11
- end
@@ -1,18 +0,0 @@
1
- class DummyClass
2
- include Auth0::Mixins::Headers
3
-
4
- attr_reader :domain, :client_id, :client_secret, :audience
5
-
6
- def initialize
7
- @domain = 'test.auth0.com'
8
- @client_id = '__test_client_id__'
9
- @client_secret = '__test_client_secret__'
10
- @audience = "https://#{@domain}/api/v2/"
11
- end
12
-
13
- %i(get post put patch delete delete_with_body).each do |method|
14
- define_method(method) do |_path, _body = {}|
15
- true
16
- end
17
- end
18
- end
@@ -1,5 +0,0 @@
1
- class DummyClassForProxy
2
- include Auth0::Mixins::HTTPProxy
3
- include Auth0::Mixins::Headers
4
- include Auth0::Mixins::TokenManagement
5
- end