doorkeeper 4.2.0 → 5.5.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of doorkeeper might be problematic. Click here for more details.

Files changed (271) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1038 -0
  3. data/README.md +110 -348
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +6 -7
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +7 -11
  7. data/app/controllers/doorkeeper/applications_controller.rb +65 -20
  8. data/app/controllers/doorkeeper/authorizations_controller.rb +97 -17
  9. data/app/controllers/doorkeeper/authorized_applications_controller.rb +22 -3
  10. data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
  11. data/app/controllers/doorkeeper/tokens_controller.rb +112 -35
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +10 -6
  13. data/app/views/doorkeeper/applications/_delete_form.html.erb +4 -3
  14. data/app/views/doorkeeper/applications/_form.html.erb +33 -21
  15. data/app/views/doorkeeper/applications/edit.html.erb +1 -1
  16. data/app/views/doorkeeper/applications/index.html.erb +18 -6
  17. data/app/views/doorkeeper/applications/new.html.erb +1 -1
  18. data/app/views/doorkeeper/applications/show.html.erb +40 -16
  19. data/app/views/doorkeeper/authorizations/error.html.erb +1 -1
  20. data/app/views/doorkeeper/authorizations/form_post.html.erb +15 -0
  21. data/app/views/doorkeeper/authorizations/new.html.erb +7 -1
  22. data/app/views/doorkeeper/authorized_applications/_delete_form.html.erb +1 -2
  23. data/app/views/doorkeeper/authorized_applications/index.html.erb +0 -1
  24. data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
  25. data/config/locales/en.yml +33 -9
  26. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  27. data/lib/doorkeeper/config/option.rb +82 -0
  28. data/lib/doorkeeper/config/validations.rb +53 -0
  29. data/lib/doorkeeper/config.rb +545 -143
  30. data/lib/doorkeeper/engine.rb +11 -5
  31. data/lib/doorkeeper/errors.rb +37 -10
  32. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  33. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  34. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  35. data/lib/doorkeeper/grant_flow.rb +45 -0
  36. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  37. data/lib/doorkeeper/grape/helpers.rb +24 -12
  38. data/lib/doorkeeper/helpers/controller.rb +49 -27
  39. data/lib/doorkeeper/models/access_grant_mixin.rb +100 -21
  40. data/lib/doorkeeper/models/access_token_mixin.rb +379 -75
  41. data/lib/doorkeeper/models/application_mixin.rb +72 -25
  42. data/lib/doorkeeper/models/concerns/accessible.rb +6 -0
  43. data/lib/doorkeeper/models/concerns/expirable.rb +20 -6
  44. data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
  45. data/lib/doorkeeper/models/concerns/ownership.rb +4 -7
  46. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  47. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  48. data/lib/doorkeeper/models/concerns/revocable.rb +12 -18
  49. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  50. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  51. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  52. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  53. data/lib/doorkeeper/oauth/authorization/token.rb +66 -28
  54. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
  55. data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
  56. data/lib/doorkeeper/oauth/base_request.rb +66 -0
  57. data/lib/doorkeeper/oauth/base_response.rb +31 -0
  58. data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
  59. data/lib/doorkeeper/oauth/client.rb +10 -12
  60. data/lib/doorkeeper/oauth/client_credentials/creator.rb +47 -4
  61. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +16 -9
  62. data/lib/doorkeeper/oauth/client_credentials/validator.rb +56 -0
  63. data/lib/doorkeeper/oauth/client_credentials_request.rb +11 -15
  64. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  65. data/lib/doorkeeper/oauth/code_response.rb +28 -15
  66. data/lib/doorkeeper/oauth/error.rb +5 -3
  67. data/lib/doorkeeper/oauth/error_response.rb +41 -20
  68. data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
  69. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
  70. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  71. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +53 -3
  72. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  73. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  74. data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
  75. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  76. data/lib/doorkeeper/oauth/password_access_token_request.rb +45 -13
  77. data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
  78. data/lib/doorkeeper/oauth/refresh_token_request.rb +61 -36
  79. data/lib/doorkeeper/oauth/scopes.rb +26 -12
  80. data/lib/doorkeeper/oauth/token.rb +25 -23
  81. data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
  82. data/lib/doorkeeper/oauth/token_request.rb +8 -21
  83. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  84. data/lib/doorkeeper/oauth.rb +13 -0
  85. data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
  86. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -25
  87. data/lib/doorkeeper/orm/active_record/application.rb +6 -15
  88. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  89. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  90. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  91. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  92. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  93. data/lib/doorkeeper/orm/active_record.rb +37 -8
  94. data/lib/doorkeeper/rails/helpers.rb +14 -15
  95. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  96. data/lib/doorkeeper/rails/routes/mapper.rb +3 -1
  97. data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
  98. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  99. data/lib/doorkeeper/rails/routes.rb +42 -30
  100. data/lib/doorkeeper/rake/db.rake +40 -0
  101. data/lib/doorkeeper/rake/setup.rake +11 -0
  102. data/lib/doorkeeper/rake.rb +14 -0
  103. data/lib/doorkeeper/request/authorization_code.rb +12 -4
  104. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  105. data/lib/doorkeeper/request/code.rb +1 -1
  106. data/lib/doorkeeper/request/password.rb +5 -14
  107. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  108. data/lib/doorkeeper/request/strategy.rb +4 -2
  109. data/lib/doorkeeper/request/token.rb +1 -1
  110. data/lib/doorkeeper/request.rb +62 -29
  111. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  112. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  113. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  114. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  115. data/lib/doorkeeper/server.rb +9 -19
  116. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  117. data/lib/doorkeeper/validations.rb +5 -2
  118. data/lib/doorkeeper/version.rb +12 -1
  119. data/lib/doorkeeper.rb +111 -56
  120. data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
  121. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  122. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  123. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  124. data/lib/generators/doorkeeper/migration_generator.rb +27 -10
  125. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  126. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +31 -19
  127. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  128. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
  129. data/lib/generators/doorkeeper/templates/{add_previous_refresh_token_to_access_tokens.rb → add_previous_refresh_token_to_access_tokens.rb.erb} +3 -1
  130. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  131. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  132. data/lib/generators/doorkeeper/templates/initializer.rb +410 -31
  133. data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
  134. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  135. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  136. metadata +132 -286
  137. data/.gitignore +0 -14
  138. data/.hound.yml +0 -13
  139. data/.rspec +0 -1
  140. data/.travis.yml +0 -20
  141. data/CONTRIBUTING.md +0 -47
  142. data/Gemfile +0 -14
  143. data/NEWS.md +0 -593
  144. data/RELEASING.md +0 -17
  145. data/Rakefile +0 -20
  146. data/app/validators/redirect_uri_validator.rb +0 -34
  147. data/doorkeeper.gemspec +0 -28
  148. data/lib/doorkeeper/oauth/client/methods.rb +0 -18
  149. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  150. data/lib/doorkeeper/oauth/request_concern.rb +0 -48
  151. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
  152. data/lib/generators/doorkeeper/templates/migration.rb +0 -68
  153. data/spec/controllers/application_metal_controller.rb +0 -10
  154. data/spec/controllers/applications_controller_spec.rb +0 -58
  155. data/spec/controllers/authorizations_controller_spec.rb +0 -189
  156. data/spec/controllers/protected_resources_controller_spec.rb +0 -300
  157. data/spec/controllers/token_info_controller_spec.rb +0 -52
  158. data/spec/controllers/tokens_controller_spec.rb +0 -88
  159. data/spec/dummy/Rakefile +0 -7
  160. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  161. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  162. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  163. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  164. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  165. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  166. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  167. data/spec/dummy/app/models/user.rb +0 -5
  168. data/spec/dummy/app/views/home/index.html.erb +0 -0
  169. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  170. data/spec/dummy/config/application.rb +0 -23
  171. data/spec/dummy/config/boot.rb +0 -9
  172. data/spec/dummy/config/database.yml +0 -15
  173. data/spec/dummy/config/environment.rb +0 -5
  174. data/spec/dummy/config/environments/development.rb +0 -29
  175. data/spec/dummy/config/environments/production.rb +0 -62
  176. data/spec/dummy/config/environments/test.rb +0 -44
  177. data/spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb +0 -6
  178. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  179. data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
  180. data/spec/dummy/config/initializers/secret_token.rb +0 -9
  181. data/spec/dummy/config/initializers/session_store.rb +0 -8
  182. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  183. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  184. data/spec/dummy/config/routes.rb +0 -52
  185. data/spec/dummy/config.ru +0 -4
  186. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
  187. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
  188. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -60
  189. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -7
  190. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -11
  191. data/spec/dummy/db/schema.rb +0 -67
  192. data/spec/dummy/public/404.html +0 -26
  193. data/spec/dummy/public/422.html +0 -26
  194. data/spec/dummy/public/500.html +0 -26
  195. data/spec/dummy/public/favicon.ico +0 -0
  196. data/spec/dummy/script/rails +0 -6
  197. data/spec/factories.rb +0 -28
  198. data/spec/generators/application_owner_generator_spec.rb +0 -22
  199. data/spec/generators/install_generator_spec.rb +0 -31
  200. data/spec/generators/migration_generator_spec.rb +0 -20
  201. data/spec/generators/templates/routes.rb +0 -3
  202. data/spec/generators/views_generator_spec.rb +0 -27
  203. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  204. data/spec/lib/config_spec.rb +0 -334
  205. data/spec/lib/doorkeeper_spec.rb +0 -28
  206. data/spec/lib/models/expirable_spec.rb +0 -51
  207. data/spec/lib/models/revocable_spec.rb +0 -59
  208. data/spec/lib/models/scopes_spec.rb +0 -43
  209. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
  210. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
  211. data/spec/lib/oauth/client/credentials_spec.rb +0 -47
  212. data/spec/lib/oauth/client/methods_spec.rb +0 -54
  213. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  214. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  215. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  216. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  217. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
  218. data/spec/lib/oauth/client_spec.rb +0 -39
  219. data/spec/lib/oauth/code_request_spec.rb +0 -45
  220. data/spec/lib/oauth/code_response_spec.rb +0 -34
  221. data/spec/lib/oauth/error_response_spec.rb +0 -61
  222. data/spec/lib/oauth/error_spec.rb +0 -23
  223. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
  224. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
  225. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
  226. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -104
  227. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -28
  228. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -90
  229. data/spec/lib/oauth/pre_authorization_spec.rb +0 -155
  230. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -154
  231. data/spec/lib/oauth/scopes_spec.rb +0 -122
  232. data/spec/lib/oauth/token_request_spec.rb +0 -98
  233. data/spec/lib/oauth/token_response_spec.rb +0 -85
  234. data/spec/lib/oauth/token_spec.rb +0 -116
  235. data/spec/lib/request/strategy_spec.rb +0 -53
  236. data/spec/lib/server_spec.rb +0 -52
  237. data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
  238. data/spec/models/doorkeeper/access_token_spec.rb +0 -394
  239. data/spec/models/doorkeeper/application_spec.rb +0 -179
  240. data/spec/requests/applications/applications_request_spec.rb +0 -94
  241. data/spec/requests/applications/authorized_applications_spec.rb +0 -30
  242. data/spec/requests/endpoints/authorization_spec.rb +0 -72
  243. data/spec/requests/endpoints/token_spec.rb +0 -64
  244. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -66
  245. data/spec/requests/flows/authorization_code_spec.rb +0 -156
  246. data/spec/requests/flows/client_credentials_spec.rb +0 -58
  247. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
  248. data/spec/requests/flows/implicit_grant_spec.rb +0 -61
  249. data/spec/requests/flows/password_spec.rb +0 -115
  250. data/spec/requests/flows/refresh_token_spec.rb +0 -174
  251. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  252. data/spec/requests/flows/skip_authorization_spec.rb +0 -59
  253. data/spec/requests/protected_resources/metal_spec.rb +0 -14
  254. data/spec/requests/protected_resources/private_api_spec.rb +0 -81
  255. data/spec/routing/custom_controller_routes_spec.rb +0 -71
  256. data/spec/routing/default_routes_spec.rb +0 -35
  257. data/spec/routing/scoped_routes_spec.rb +0 -31
  258. data/spec/spec_helper.rb +0 -2
  259. data/spec/spec_helper_integration.rb +0 -59
  260. data/spec/support/dependencies/factory_girl.rb +0 -2
  261. data/spec/support/helpers/access_token_request_helper.rb +0 -11
  262. data/spec/support/helpers/authorization_request_helper.rb +0 -41
  263. data/spec/support/helpers/config_helper.rb +0 -9
  264. data/spec/support/helpers/model_helper.rb +0 -67
  265. data/spec/support/helpers/request_spec_helper.rb +0 -76
  266. data/spec/support/helpers/url_helper.rb +0 -55
  267. data/spec/support/http_method_shim.rb +0 -24
  268. data/spec/support/orm/active_record.rb +0 -3
  269. data/spec/support/shared/controllers_shared_context.rb +0 -69
  270. data/spec/support/shared/models_shared_examples.rb +0 -52
  271. data/spec/validators/redirect_uri_validator_spec.rb +0 -78
data/README.md CHANGED
@@ -1,366 +1,154 @@
1
- # Doorkeeper - awesome oauth provider for your Rails app.
1
+ # Doorkeeper awesome OAuth 2 provider for your Rails / Grape app.
2
2
 
3
- [![Build Status](https://travis-ci.org/doorkeeper-gem/doorkeeper.svg?branch=master)](https://travis-ci.org/doorkeeper-gem/doorkeeper)
4
- [![Dependency Status](https://gemnasium.com/doorkeeper-gem/doorkeeper.svg?travis)](https://gemnasium.com/doorkeeper-gem/doorkeeper)
5
- [![Code Climate](https://codeclimate.com/github/doorkeeper-gem/doorkeeper.svg)](https://codeclimate.com/github/doorkeeper-gem/doorkeeper)
6
3
  [![Gem Version](https://badge.fury.io/rb/doorkeeper.svg)](https://rubygems.org/gems/doorkeeper)
7
- [![Security](https://hakiri.io/github/doorkeeper-gem/doorkeeper/master.svg)](https://hakiri.io/github/doorkeeper-gem/doorkeeper/master)
8
-
9
- Doorkeeper is a gem that makes it easy to introduce OAuth 2 provider
10
- functionality to your Rails or Grape application.
11
-
12
- [PR 567]: https://github.com/doorkeeper-gem/doorkeeper/pull/567
13
-
14
-
15
- ## Documentation valid for `master` branch
16
-
17
- Please check the documentation for the version of doorkeeper you are using in:
18
- https://github.com/doorkeeper-gem/doorkeeper/releases
19
-
20
- - See the [wiki](https://github.com/doorkeeper-gem/doorkeeper/wiki)
21
- - For general questions, please post in [Stack Overflow](http://stackoverflow.com/questions/tagged/doorkeeper)
4
+ [![Build Status](https://travis-ci.org/doorkeeper-gem/doorkeeper.svg?branch=main)](https://travis-ci.org/doorkeeper-gem/doorkeeper)
5
+ [![Code Climate](https://codeclimate.com/github/doorkeeper-gem/doorkeeper.svg)](https://codeclimate.com/github/doorkeeper-gem/doorkeeper)
6
+ [![Coverage Status](https://coveralls.io/repos/github/doorkeeper-gem/doorkeeper/badge.svg?branch=main)](https://coveralls.io/github/doorkeeper-gem/doorkeeper?branch=main)
7
+ [![Security](https://hakiri.io/github/doorkeeper-gem/doorkeeper/main.svg)](https://hakiri.io/github/doorkeeper-gem/doorkeeper/main)
8
+ [![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com)
9
+ [![GuardRails badge](https://badges.guardrails.io/doorkeeper-gem/doorkeeper.svg?token=66768ce8f6995814df81f65a2cff40f739f688492704f973e62809e15599bb62)](https://dashboard.guardrails.io/default/gh/doorkeeper-gem/doorkeeper)
10
+ [![Dependabot](https://img.shields.io/badge/dependabot-enabled-success.svg)](https://dependabot.com)
11
+
12
+ Doorkeeper is a gem (Rails engine) that makes it easy to introduce OAuth 2 provider
13
+ functionality to your Ruby on Rails or Grape application.
14
+
15
+ Supported features:
16
+
17
+ - [The OAuth 2.0 Authorization Framework](https://tools.ietf.org/html/rfc6749)
18
+ - [Authorization Code Flow](http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-4.1)
19
+ - [Access Token Scopes](http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-3.3)
20
+ - [Refresh token](http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-1.5)
21
+ - [Implicit grant](http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-4.2)
22
+ - [Resource Owner Password Credentials](http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-4.3)
23
+ - [Client Credentials](http://tools.ietf.org/html/draft-ietf-oauth-v2-22#section-4.4)
24
+ - [OAuth 2.0 Token Revocation](http://tools.ietf.org/html/rfc7009)
25
+ - [OAuth 2.0 Token Introspection](https://tools.ietf.org/html/rfc7662)
26
+ - [OAuth 2.0 Threat Model and Security Considerations](http://tools.ietf.org/html/rfc6819)
27
+ - [OAuth 2.0 for Native Apps](https://tools.ietf.org/html/draft-ietf-oauth-native-apps-10)
28
+ - [Proof Key for Code Exchange by OAuth Public Clients](https://tools.ietf.org/html/rfc7636)
22
29
 
23
30
  ## Table of Contents
24
31
 
25
32
  <!-- START doctoc generated TOC please keep comment here to allow auto update -->
26
33
  <!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
27
34
 
35
+
36
+ - [Documentation](#documentation)
28
37
  - [Installation](#installation)
29
- - [Configuration](#configuration)
30
- - [Active Record](#active-record)
31
- - [Other ORMs](#other-orms)
32
- - [Routes](#routes)
33
- - [Authenticating](#authenticating)
34
- - [Internationalization (I18n)](#internationalization-i18n)
35
- - [Protecting resources with OAuth (a.k.a your API endpoint)](#protecting-resources-with-oauth-aka-your-api-endpoint)
36
- - [Protect your API with OAuth when using Grape](#protect-your-api-with-oauth-when-using-grape)
37
- - [Route Constraints and other integrations](#route-constraints-and-other-integrations)
38
- - [Access Token Scopes](#access-token-scopes)
39
- - [Custom Access Token Generator](#custom-access-token-generator)
40
- - [Authenticated resource owner](#authenticated-resource-owner)
41
- - [Applications list](#applications-list)
42
- - [Other customizations](#other-customizations)
43
- - [Upgrading](#upgrading)
38
+ - [Ruby on Rails](#ruby-on-rails)
39
+ - [Grape](#grape)
40
+ - [ORMs](#orms)
41
+ - [Extensions](#extensions)
42
+ - [Example Applications](#example-applications)
43
+ - [Tutorials](#tutorials)
44
+ - [Sponsors](#sponsors)
44
45
  - [Development](#development)
45
46
  - [Contributing](#contributing)
46
- - [Other resources](#other-resources)
47
- - [Wiki](#wiki)
48
- - [Screencast](#screencast)
49
- - [Client applications](#client-applications)
50
- - [Contributors](#contributors)
51
- - [IETF Standards](#ietf-standards)
52
- - [License](#license)
47
+ - [Contributors](#contributors)
48
+ - [License](#license)
53
49
 
54
50
  <!-- END doctoc generated TOC please keep comment here to allow auto update -->
55
51
 
56
- ## Installation
57
-
58
- Put this in your Gemfile:
59
-
60
- ``` ruby
61
- gem 'doorkeeper'
62
- ```
63
-
64
- Run the installation generator with:
65
-
66
- rails generate doorkeeper:install
67
-
68
- This will install the doorkeeper initializer into `config/initializers/doorkeeper.rb`.
69
-
70
- ## Configuration
71
-
72
- ### Active Record
73
-
74
- By default doorkeeper is configured to use active record, so to start you have
75
- to generate the migration tables:
76
-
77
- rails generate doorkeeper:migration
78
-
79
- You may want to add foreign keys to your migration. For example, if you plan on
80
- using `User` as the resource owner, add the following line to the migration file
81
- for each table that includes a `resource_owner_id` column:
82
-
83
- ```ruby
84
- add_foreign_key :table_name, :users, column: :resource_owner_id
85
- ```
86
-
87
- Then run migrations:
88
-
89
- ```sh
90
- rake db:migrate
91
- ```
92
-
93
- ### Other ORMs
94
-
95
- See [doorkeeper-mongodb project] for Mongoid and MongoMapper support. Follow along
96
- the implementation in that repository to extend doorkeeper with other ORMs.
97
-
98
- [doorkeeper-mongodb project]: https://github.com/doorkeeper-gem/doorkeeper-mongodb
99
-
100
- If you are using [Sequel gem] then you can add [doorkeeper-sequel extension] to your project.
101
- Follow configuration instructions for setting up the necessary Doorkeeper ORM.
102
-
103
- [Sequel gem]: https://github.com/jeremyevans/sequel/
104
- [doorkeeper-sequel extension]: https://github.com/nbulaj/doorkeeper-sequel
105
-
106
- ### Routes
107
-
108
- The installation script will also automatically add the Doorkeeper routes into
109
- your app, like this:
110
-
111
- ``` ruby
112
- Rails.application.routes.draw do
113
- use_doorkeeper
114
- # your routes
115
- end
116
- ```
117
-
118
- This will mount following routes:
119
-
120
- GET /oauth/authorize/:code
121
- GET /oauth/authorize
122
- POST /oauth/authorize
123
- DELETE /oauth/authorize
124
- POST /oauth/token
125
- POST /oauth/revoke
126
- resources /oauth/applications
127
- GET /oauth/authorized_applications
128
- DELETE /oauth/authorized_applications/:id
129
- GET /oauth/token/info
130
-
131
- For more information on how to customize routes, check out [this page on the
132
- wiki](https://github.com/doorkeeper-gem/doorkeeper/wiki/Customizing-routes).
133
-
134
- ### Authenticating
135
-
136
- You need to configure Doorkeeper in order to provide `resource_owner` model
137
- and authentication block in `config/initializers/doorkeeper.rb`:
138
-
139
- ``` ruby
140
- Doorkeeper.configure do
141
- resource_owner_authenticator do
142
- User.find_by_id(session[:current_user_id]) || redirect_to(login_url)
143
- end
144
- end
145
- ```
146
-
147
- This code is run in the context of your application so you have access to your
148
- models, session or routes helpers. However, since this code is not run in the
149
- context of your application's `ApplicationController` it doesn't have access to
150
- the methods defined over there.
151
-
152
- You may want to check other ways of authentication
153
- [here](https://github.com/doorkeeper-gem/doorkeeper/wiki/Authenticating-using-Clearance-or-DIY).
154
-
155
-
156
- ### Internationalization (I18n)
157
-
158
- See language files in [the I18n repository](https://github.com/doorkeeper-gem/doorkeeper-i18n).
159
-
160
-
161
- ## Protecting resources with OAuth (a.k.a your API endpoint)
162
-
163
- To protect your API with OAuth, you just need to setup `before_action`s
164
- specifying the actions you want to protect. For example:
165
-
166
- ``` ruby
167
- class Api::V1::ProductsController < Api::V1::ApiController
168
- before_action :doorkeeper_authorize! # Require access token for all actions
169
-
170
- # your actions
171
- end
172
- ```
173
-
174
- You can pass any option `before_action` accepts, such as `if`, `only`,
175
- `except`, and others.
52
+ ## Documentation
176
53
 
177
- ### Protect your API with OAuth when using Grape
54
+ This documentation is valid for `main` branch. Please check the documentation for the version of doorkeeper you are using in:
55
+ https://github.com/doorkeeper-gem/doorkeeper/releases.
178
56
 
179
- As of [PR 567] doorkeeper has helpers for Grape. One of them is
180
- `doorkeeper_authorize!` and can be used in a similar way as an example above.
181
- Note that you have to use `require 'doorkeeper/grape/helpers'` and
182
- `helpers Doorkeeper::Grape::Helpers`.
183
-
184
- For more information about integration with Grape see the [Wiki].
185
-
186
- [PR 567]: https://github.com/doorkeeper-gem/doorkeeper/pull/567
187
- [Wiki]: https://github.com/doorkeeper-gem/doorkeeper/wiki/Grape-Integration
188
-
189
- ``` ruby
190
- require 'doorkeeper/grape/helpers'
191
-
192
- module API
193
- module V1
194
- class Users < Grape::API
195
- helpers Doorkeeper::Grape::Helpers
196
-
197
- before do
198
- doorkeeper_authorize!
199
- end
200
-
201
- # ...
202
- end
203
- end
204
- end
205
- ```
57
+ Additionally, other resources can be found on:
206
58
 
59
+ - [Guides](https://doorkeeper.gitbook.io/guides/) with how-to get started and configuration documentation
60
+ - See the [Wiki](https://github.com/doorkeeper-gem/doorkeeper/wiki) with articles and other documentation
61
+ - Screencast from [railscasts.com](http://railscasts.com/): [#353
62
+ OAuth with
63
+ Doorkeeper](http://railscasts.com/episodes/353-oauth-with-doorkeeper)
64
+ - See [upgrade guides](https://github.com/doorkeeper-gem/doorkeeper/wiki/Migration-from-old-versions)
65
+ - For general questions, please post on [Stack Overflow](http://stackoverflow.com/questions/tagged/doorkeeper)
66
+ - See [SECURITY.md](SECURITY.md) for this project's security disclose
67
+ policy
207
68
 
208
- ### Route Constraints and other integrations
69
+ ## Installation
209
70
 
210
- You can leverage the `Doorkeeper.authenticate` facade to easily extract a
211
- `Doorkeeper::OAuth::Token` based on the current request. You can then ensure
212
- that token is still good, find its associated `#resource_owner_id`, etc.
71
+ Installation depends on the framework you're using. The first step is to add the following to your Gemfile:
213
72
 
214
73
  ```ruby
215
- module Constraint
216
- class Authenticated
217
-
218
- def matches?(request)
219
- token = Doorkeeper.authenticate(request)
220
- token && token.accessible?
221
- end
222
-
223
- end
224
- end
74
+ gem 'doorkeeper'
225
75
  ```
226
76
 
227
- For more information about integration and other integrations, check out [the
228
- related wiki
229
- page](https://github.com/doorkeeper-gem/doorkeeper/wiki/ActionController::Metal-with-doorkeeper).
77
+ And run `bundle install`. After this, check out the guide related to the framework you're using.
230
78
 
231
- ### Access Token Scopes
79
+ ### Ruby on Rails
232
80
 
233
- You can also require the access token to have specific scopes in certain
234
- actions:
81
+ Doorkeeper currently supports Ruby on Rails >= 5.0. See the guide [here](https://doorkeeper.gitbook.io/guides/ruby-on-rails/getting-started).
235
82
 
236
- First configure the scopes in `initializers/doorkeeper.rb`
83
+ ### Grape
237
84
 
238
- ```ruby
239
- Doorkeeper.configure do
240
- default_scopes :public # if no scope was requested, this will be the default
241
- optional_scopes :admin, :write
242
- end
243
- ```
85
+ Guide for integration with Grape framework can be found [here](https://doorkeeper.gitbook.io/guides/grape/grape).
244
86
 
245
- And in your controllers:
87
+ ## ORMs
246
88
 
247
- ```ruby
248
- class Api::V1::ProductsController < Api::V1::ApiController
249
- before_action -> { doorkeeper_authorize! :public }, only: :index
250
- before_action only: [:create, :update, :destroy] do
251
- doorkeeper_authorize! :admin, :write
252
- end
253
- end
254
- ```
89
+ Doorkeeper supports Active Record by default, but can be configured to work with the following ORMs:
255
90
 
256
- Please note that there is a logical OR between multiple required scopes. In the
257
- above example, `doorkeeper_authorize! :admin, :write` means that the access
258
- token is required to have either `:admin` scope or `:write` scope, but does not
259
- need have both of them.
91
+ | ORM | Support via |
92
+ | :--- | :--- |
93
+ | Active Record | by default |
94
+ | MongoDB | [doorkeeper-gem/doorkeeper-mongodb](https://github.com/doorkeeper-gem/doorkeeper-mongodb) |
95
+ | Sequel | [nbulaj/doorkeeper-sequel](https://github.com/nbulaj/doorkeeper-sequel) |
96
+ | Couchbase | [acaprojects/doorkeeper-couchbase](https://github.com/acaprojects/doorkeeper-couchbase) |
97
+ | RethinkDB | [aca-labs/doorkeeper-rethinkdb](https://github.com/aca-labs/doorkeeper-rethinkdb) |
260
98
 
261
- If you want to require the access token to have multiple scopes at the same
262
- time, use multiple `doorkeeper_authorize!`, for example:
99
+ ## Extensions
263
100
 
264
- ```ruby
265
- class Api::V1::ProductsController < Api::V1::ApiController
266
- before_action -> { doorkeeper_authorize! :public }, only: :index
267
- before_action only: [:create, :update, :destroy] do
268
- doorkeeper_authorize! :admin
269
- doorkeeper_authorize! :write
270
- end
271
- end
272
- ```
101
+ Extensions that are not included by default and can be installed separately.
273
102
 
274
- In the above example, a client can call `:create` action only if its access token
275
- has both `:admin` and `:write` scopes.
103
+ | | Link |
104
+ | :--- | :--- |
105
+ | OpenID Connect extension | [doorkeeper-gem/doorkeeper-openid\_connect](https://github.com/doorkeeper-gem/doorkeeper-openid_connect) |
106
+ | JWT Token support | [doorkeeper-gem/doorkeeper-jwt](https://github.com/doorkeeper-gem/doorkeeper-jwt) |
107
+ | Assertion grant extension | [doorkeeper-gem/doorkeeper-grants\_assertion](https://github.com/doorkeeper-gem/doorkeeper-grants_assertion) |
108
+ | I18n translations | [doorkeeper-gem/doorkeeper-i18n](https://github.com/doorkeeper-gem/doorkeeper-i18n) |
276
109
 
277
- ### Custom Access Token Generator
110
+ ## Example Applications
278
111
 
279
- By default a 128 bit access token will be generated. If you require a custom
280
- token, such as [JWT](http://jwt.io), specify an object that responds to
281
- `.generate(options = {})` and returns a string to be used as the token.
112
+ These applications show how Doorkeeper works and how to integrate with it. Start with the oAuth2 server and use the clients to connect with the server.
282
113
 
283
- ```ruby
284
- Doorkeeper.configure do
285
- access_token_generator "Doorkeeper::JWT"
286
- end
287
- ```
288
-
289
- JWT token support is available with
290
- [Doorkeeper-JWT](https://github.com/chriswarren/doorkeeper-jwt).
291
-
292
- ### Custom Base Controller
114
+ | Application | Link |
115
+ | :--- | :--- |
116
+ | OAuth2 Server with Doorkeeper | [doorkeeper-gem/doorkeeper-provider-app](https://github.com/doorkeeper-gem/doorkeeper-provider-app) |
117
+ | Sinatra Client connected to Provider App | [doorkeeper-gem/doorkeeper-sinatra-client](https://github.com/doorkeeper-gem/doorkeeper-sinatra-client) |
118
+ | Devise + Omniauth Client | [doorkeeper-gem/doorkeeper-devise-client](https://github.com/doorkeeper-gem/doorkeeper-devise-client) |
293
119
 
294
- By default Doorkeeper's main controller `Doorkeeper::ApplicationController` inherits from `ActionController::Base`.
295
- You may want to use your own controller to inherit from, to keep Doorkeeper controllers in the same context than the rest your app:
296
-
297
- ```ruby
298
- Doorkeeper.configure do
299
- base_controller 'ApplicationController'
300
- end
301
- ```
120
+ You may want to create a client application to
121
+ test the integration. Check out these [client
122
+ examples](https://github.com/doorkeeper-gem/doorkeeper/wiki/Example-Applications)
123
+ in our wiki or follow this [tutorial
124
+ here](https://github.com/doorkeeper-gem/doorkeeper/wiki/Testing-your-provider-with-OAuth2-gem).
302
125
 
303
- ### Authenticated resource owner
126
+ ## Tutorials
304
127
 
305
- If you want to return data based on the current resource owner, in other
306
- words, the access token owner, you may want to define a method in your
307
- controller that returns the resource owner instance:
128
+ See [list of tutorials](https://github.com/doorkeeper-gem/doorkeeper/wiki#how-tos--tutorials) in order to learn how to use the gem or integrate it with other solutions / gems.
308
129
 
309
- ``` ruby
310
- class Api::V1::CredentialsController < Api::V1::ApiController
311
- before_action :doorkeeper_authorize!
312
- respond_to :json
130
+ ## Sponsors
313
131
 
314
- # GET /me.json
315
- def me
316
- respond_with current_resource_owner
317
- end
132
+ [![OpenCollective](https://opencollective.com/doorkeeper-gem/backers/badge.svg)](#backers)
133
+ [![OpenCollective](https://opencollective.com/doorkeeper-gem/sponsors/badge.svg)](#sponsors)
318
134
 
319
- private
135
+ Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/doorkeeper-gem#sponsor)]
320
136
 
321
- # Find the user that owns the access token
322
- def current_resource_owner
323
- User.find(doorkeeper_token.resource_owner_id) if doorkeeper_token
324
- end
325
- end
326
- ```
137
+ <a href="https://codecademy.com/about/careers?utm_source=doorkeeper-gem" target="_blank"><img src="https://static-assets.codecademy.com/marketing/codecademy_logo_padded.png"/></a>
327
138
 
328
- In this example, we're returning the credentials (`me.json`) of the access
329
- token owner.
139
+ > Codecademy supports open source as part of its mission to democratize tech. Come help us build the education the world deserves: [https://codecademy.com/about/careers](https://codecademy.com/about/careers?utm_source=doorkeeper-gem)
330
140
 
331
- ### Applications list
141
+ <br>
332
142
 
333
- By default, the applications list (`/oauth/applications`) is publicly available.
334
- To protect the endpoint you should uncomment these lines:
143
+ <a href="https://oauth.io/?utm_source=doorkeeper-gem" target="_blank"><img src="https://oauth.io/img/logo_text.png"/></a>
335
144
 
336
- ```ruby
337
- # config/initializers/doorkeeper.rb
338
- Doorkeeper.configure do
339
- admin_authenticator do |routes|
340
- Admin.find_by_id(session[:admin_id]) || redirect_to(routes.new_admin_session_url)
341
- end
342
- end
343
- ```
145
+ > If you prefer not to deal with the gory details of OAuth 2, need dedicated customer support & consulting, try the cloud-based SaaS version: [https://oauth.io](https://oauth.io/?utm_source=doorkeeper-gem)
344
146
 
345
- The logic is the same as the `resource_owner_authenticator` block. **Note:**
346
- since the application list is just a scaffold, it's recommended to either
347
- customize the controller used by the list or skip the controller all together.
348
- For more information see the page
349
- [in the wiki](https://github.com/doorkeeper-gem/doorkeeper/wiki/Customizing-routes).
147
+ <br>
350
148
 
351
- ## Other customizations
149
+ <a href="https://www.wealthsimple.com/?utm_source=doorkeeper-gem" target="_blank"><img src="https://wealthsimple.s3.amazonaws.com/branding/medium-black.svg"/></a>
352
150
 
353
- - [Associate users to OAuth applications (ownership)](https://github.com/doorkeeper-gem/doorkeeper/wiki/Associate-users-to-OAuth-applications-%28ownership%29)
354
- - [CORS - Cross Origin Resource Sharing](https://github.com/doorkeeper-gem/doorkeeper/wiki/%5BCORS%5D-Cross-Origin-Resource-Sharing)
355
-
356
- ## Upgrading
357
-
358
- If you want to upgrade doorkeeper to a new version, check out the [upgrading
359
- notes](https://github.com/doorkeeper-gem/doorkeeper/wiki/Migration-from-old-versions)
360
- and take a look at the
361
- [changelog](https://github.com/doorkeeper-gem/doorkeeper/blob/master/NEWS.md).
362
-
363
- Doorkeeper follows [semantic versioning](http://semver.org/).
151
+ > Wealthsimple is a financial company on a mission to help everyone achieve financial freedom by providing products and advice that are accessible and affordable. Using smart technology, Wealthsimple takes financial services that are often confusing, opaque and expensive and makes them simple, transparent, and low-cost. See what Investing on Autopilot is all about: [https://www.wealthsimple.com](https://www.wealthsimple.com/?utm_source=doorkeeper-gem)
364
152
 
365
153
  ## Development
366
154
 
@@ -368,17 +156,18 @@ To run the local engine server:
368
156
 
369
157
  ```
370
158
  bundle install
371
- bundle exec rails server
159
+ bundle exec rake doorkeeper:server
372
160
  ````
373
161
 
374
162
  By default, it uses the latest Rails version with ActiveRecord. To run the
375
- tests with a specific ORM and Rails version:
163
+ tests with a specific Rails version:
376
164
 
377
165
  ```
378
- rails=4.2.0 orm=active_record bundle exec rake
166
+ BUNDLE_GEMFILE=gemfiles/rails_6_0.gemfile bundle exec rake
379
167
  ```
380
168
 
381
- Or you might prefer to run `script/run_all` to integrate against all ORMs.
169
+ You can also experiment with the changes using `bin/console`. It uses in-memory SQLite database and default
170
+ Doorkeeper config, but you can reestablish connection or reconfigure the gem if you need.
382
171
 
383
172
  ## Contributing
384
173
 
@@ -388,42 +177,15 @@ create [example
388
177
  apps](https://github.com/doorkeeper-gem/doorkeeper/wiki/Example-Applications),
389
178
  integrate the gem with your app and let us know!
390
179
 
391
- Also, check out our [contributing guidelines
392
- page](https://github.com/doorkeeper-gem/doorkeeper/wiki/Contributing).
393
-
394
- ## Other resources
395
-
396
- ### Wiki
397
-
398
- You can find everything about doorkeeper in our [wiki
399
- here](https://github.com/doorkeeper-gem/doorkeeper/wiki).
180
+ Also, check out our [contributing guidelines page](CONTRIBUTING.md).
400
181
 
401
- ### Screencast
402
-
403
- Check out this screencast from [railscasts.com](http://railscasts.com/): [#353
404
- OAuth with
405
- Doorkeeper](http://railscasts.com/episodes/353-oauth-with-doorkeeper)
406
-
407
- ### Client applications
408
-
409
- After you set up the provider, you may want to create a client application to
410
- test the integration. Check out these [client
411
- examples](https://github.com/doorkeeper-gem/doorkeeper/wiki/Example-Applications)
412
- in our wiki or follow this [tutorial
413
- here](https://github.com/doorkeeper-gem/doorkeeper/wiki/Testing-your-provider-with-OAuth2-gem).
414
-
415
- ### Contributors
182
+ ## Contributors
416
183
 
417
184
  Thanks to all our [awesome
418
185
  contributors](https://github.com/doorkeeper-gem/doorkeeper/graphs/contributors)!
419
186
 
187
+ <a href="https://github.com/doorkeeper-gem/doorkeeper/graphs/contributors"><img src="https://opencollective.com/doorkeeper-gem/contributors.svg?width=890&button=false" /></a>
420
188
 
421
- ### IETF Standards
422
-
423
- * [The OAuth 2.0 Authorization Framework](http://tools.ietf.org/html/rfc6749)
424
- * [OAuth 2.0 Threat Model and Security Considerations](http://tools.ietf.org/html/rfc6819)
425
- * [OAuth 2.0 Token Revocation](http://tools.ietf.org/html/rfc7009)
426
-
427
- ### License
189
+ ## License
428
190
 
429
191
  MIT License. Copyright 2011 Applicake.
@@ -5,6 +5,6 @@
5
5
  *= require_tree .
6
6
  */
7
7
 
8
- td {
9
- vertical-align: middle !important;
8
+ .doorkeeper-admin .form-group > .field_with_errors {
9
+ width: 16.66667%;
10
10
  }
@@ -1,15 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
4
  class ApplicationController <
3
- Doorkeeper.configuration.base_controller.constantize
4
-
5
+ Doorkeeper.config.resolve_controller(:base)
5
6
  include Helpers::Controller
7
+ include ActionController::MimeResponds if Doorkeeper.config.api_only
6
8
 
7
- if ::Rails.version.to_i < 4
8
- protect_from_forgery
9
- else
9
+ unless Doorkeeper.config.api_only
10
10
  protect_from_forgery with: :exception
11
+ helper "doorkeeper/dashboard"
11
12
  end
12
-
13
- helper 'doorkeeper/dashboard'
14
13
  end
15
14
  end
@@ -1,16 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Doorkeeper
2
- class ApplicationMetalController < ActionController::Metal
3
- MODULES = [
4
- ActionController::Instrumentation,
5
- AbstractController::Rendering,
6
- ActionController::Rendering,
7
- ActionController::Renderers::All,
8
- Helpers::Controller
9
- ].freeze
4
+ class ApplicationMetalController <
5
+ Doorkeeper.config.resolve_controller(:base_metal)
6
+ include Helpers::Controller
10
7
 
11
- MODULES.each do |mod|
12
- include mod
13
- end
8
+ before_action :enforce_content_type,
9
+ if: -> { Doorkeeper.config.enforce_content_type }
14
10
 
15
11
  ActiveSupport.run_load_hooks(:doorkeeper_metal_controller, self)
16
12
  end