doorkeeper 4.4.3 → 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 (282) hide show
  1. checksums.yaml +5 -5
  2. data/{NEWS.md → CHANGELOG.md} +393 -19
  3. data/README.md +97 -393
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +8 -5
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +7 -11
  7. data/app/controllers/doorkeeper/applications_controller.rb +62 -27
  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 +98 -32
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +9 -7
  13. data/app/views/doorkeeper/applications/_delete_form.html.erb +3 -1
  14. data/app/views/doorkeeper/applications/_form.html.erb +27 -26
  15. data/app/views/doorkeeper/applications/edit.html.erb +1 -1
  16. data/app/views/doorkeeper/applications/index.html.erb +17 -7
  17. data/app/views/doorkeeper/applications/new.html.erb +1 -1
  18. data/app/views/doorkeeper/applications/show.html.erb +38 -17
  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 +6 -0
  22. data/app/views/layouts/doorkeeper/admin.html.erb +16 -14
  23. data/config/locales/en.yml +23 -3
  24. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  25. data/lib/doorkeeper/config/option.rb +82 -0
  26. data/lib/doorkeeper/config/validations.rb +53 -0
  27. data/lib/doorkeeper/config.rb +471 -140
  28. data/lib/doorkeeper/engine.rb +8 -2
  29. data/lib/doorkeeper/errors.rb +25 -16
  30. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  31. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  32. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  33. data/lib/doorkeeper/grant_flow.rb +45 -0
  34. data/lib/doorkeeper/grape/authorization_decorator.rb +6 -4
  35. data/lib/doorkeeper/grape/helpers.rb +13 -7
  36. data/lib/doorkeeper/helpers/controller.rb +43 -10
  37. data/lib/doorkeeper/models/access_grant_mixin.rb +97 -3
  38. data/lib/doorkeeper/models/access_token_mixin.rb +272 -66
  39. data/lib/doorkeeper/models/application_mixin.rb +50 -5
  40. data/lib/doorkeeper/models/concerns/accessible.rb +2 -0
  41. data/lib/doorkeeper/models/concerns/expirable.rb +7 -3
  42. data/lib/doorkeeper/models/concerns/orderable.rb +2 -0
  43. data/lib/doorkeeper/models/concerns/ownership.rb +4 -7
  44. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  45. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  46. data/lib/doorkeeper/models/concerns/revocable.rb +3 -27
  47. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  48. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  49. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  50. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  51. data/lib/doorkeeper/oauth/authorization/token.rb +58 -24
  52. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +7 -5
  53. data/lib/doorkeeper/oauth/authorization_code_request.rb +58 -10
  54. data/lib/doorkeeper/oauth/base_request.rb +35 -24
  55. data/lib/doorkeeper/oauth/base_response.rb +2 -0
  56. data/lib/doorkeeper/oauth/client/credentials.rb +5 -5
  57. data/lib/doorkeeper/oauth/client.rb +10 -11
  58. data/lib/doorkeeper/oauth/client_credentials/creator.rb +47 -4
  59. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +16 -9
  60. data/lib/doorkeeper/oauth/client_credentials/validator.rb +56 -0
  61. data/lib/doorkeeper/oauth/client_credentials_request.rb +10 -11
  62. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  63. data/lib/doorkeeper/oauth/code_response.rb +27 -15
  64. data/lib/doorkeeper/oauth/error.rb +3 -1
  65. data/lib/doorkeeper/oauth/error_response.rb +35 -14
  66. data/lib/doorkeeper/oauth/forbidden_token_response.rb +10 -3
  67. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +23 -18
  68. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  69. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +42 -7
  70. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  71. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  72. data/lib/doorkeeper/oauth/invalid_token_response.rb +29 -4
  73. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  74. data/lib/doorkeeper/oauth/password_access_token_request.rb +43 -10
  75. data/lib/doorkeeper/oauth/pre_authorization.rb +133 -26
  76. data/lib/doorkeeper/oauth/refresh_token_request.rb +59 -31
  77. data/lib/doorkeeper/oauth/scopes.rb +8 -4
  78. data/lib/doorkeeper/oauth/token.rb +12 -8
  79. data/lib/doorkeeper/oauth/token_introspection.rb +97 -23
  80. data/lib/doorkeeper/oauth/token_request.rb +8 -20
  81. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  82. data/lib/doorkeeper/oauth.rb +13 -0
  83. data/lib/doorkeeper/orm/active_record/access_grant.rb +5 -30
  84. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -43
  85. data/lib/doorkeeper/orm/active_record/application.rb +6 -57
  86. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  87. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  88. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  89. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  90. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  91. data/lib/doorkeeper/orm/active_record.rb +27 -9
  92. data/lib/doorkeeper/rails/helpers.rb +10 -8
  93. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  94. data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
  95. data/lib/doorkeeper/rails/routes/mapping.rb +9 -7
  96. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  97. data/lib/doorkeeper/rails/routes.rb +37 -30
  98. data/lib/doorkeeper/rake/db.rake +40 -0
  99. data/lib/doorkeeper/rake/setup.rake +11 -0
  100. data/lib/doorkeeper/rake.rb +14 -0
  101. data/lib/doorkeeper/request/authorization_code.rb +6 -4
  102. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  103. data/lib/doorkeeper/request/code.rb +1 -1
  104. data/lib/doorkeeper/request/password.rb +4 -3
  105. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  106. data/lib/doorkeeper/request/strategy.rb +4 -2
  107. data/lib/doorkeeper/request/token.rb +1 -1
  108. data/lib/doorkeeper/request.rb +61 -34
  109. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  110. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  111. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  112. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  113. data/lib/doorkeeper/server.rb +9 -11
  114. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  115. data/lib/doorkeeper/validations.rb +2 -0
  116. data/lib/doorkeeper/version.rb +7 -29
  117. data/lib/doorkeeper.rb +111 -64
  118. data/lib/generators/doorkeeper/application_owner_generator.rb +24 -18
  119. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  120. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  121. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  122. data/lib/generators/doorkeeper/migration_generator.rb +23 -18
  123. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  124. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +28 -22
  125. data/{spec/dummy/db/migrate/20180210183654_add_confidential_to_application.rb → lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb} +2 -2
  126. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
  127. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  128. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  129. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  130. data/lib/generators/doorkeeper/templates/initializer.rb +382 -30
  131. data/lib/generators/doorkeeper/templates/migration.rb.erb +35 -16
  132. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  133. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  134. metadata +95 -309
  135. data/.coveralls.yml +0 -1
  136. data/.github/ISSUE_TEMPLATE.md +0 -25
  137. data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  138. data/.gitignore +0 -19
  139. data/.hound.yml +0 -2
  140. data/.rspec +0 -1
  141. data/.rubocop.yml +0 -17
  142. data/.travis.yml +0 -38
  143. data/Appraisals +0 -18
  144. data/CODE_OF_CONDUCT.md +0 -46
  145. data/CONTRIBUTING.md +0 -47
  146. data/Gemfile +0 -10
  147. data/RELEASING.md +0 -10
  148. data/Rakefile +0 -20
  149. data/SECURITY.md +0 -15
  150. data/app/validators/redirect_uri_validator.rb +0 -44
  151. data/doorkeeper.gemspec +0 -32
  152. data/gemfiles/rails_4_2.gemfile +0 -13
  153. data/gemfiles/rails_5_0.gemfile +0 -12
  154. data/gemfiles/rails_5_1.gemfile +0 -12
  155. data/gemfiles/rails_5_2.gemfile +0 -12
  156. data/gemfiles/rails_master.gemfile +0 -14
  157. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  158. data/lib/generators/doorkeeper/add_client_confidentiality_generator.rb +0 -31
  159. data/lib/generators/doorkeeper/templates/add_confidential_to_application_migration.rb.erb +0 -11
  160. data/spec/controllers/application_metal_controller.rb +0 -10
  161. data/spec/controllers/applications_controller_spec.rb +0 -69
  162. data/spec/controllers/authorizations_controller_spec.rb +0 -250
  163. data/spec/controllers/protected_resources_controller_spec.rb +0 -309
  164. data/spec/controllers/token_info_controller_spec.rb +0 -56
  165. data/spec/controllers/tokens_controller_spec.rb +0 -274
  166. data/spec/dummy/Rakefile +0 -7
  167. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  168. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  169. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  170. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  171. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  172. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  173. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  174. data/spec/dummy/app/models/user.rb +0 -5
  175. data/spec/dummy/app/views/home/index.html.erb +0 -0
  176. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  177. data/spec/dummy/config/application.rb +0 -23
  178. data/spec/dummy/config/boot.rb +0 -9
  179. data/spec/dummy/config/database.yml +0 -15
  180. data/spec/dummy/config/environment.rb +0 -5
  181. data/spec/dummy/config/environments/development.rb +0 -29
  182. data/spec/dummy/config/environments/production.rb +0 -62
  183. data/spec/dummy/config/environments/test.rb +0 -44
  184. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  185. data/spec/dummy/config/initializers/doorkeeper.rb +0 -112
  186. data/spec/dummy/config/initializers/new_framework_defaults.rb +0 -6
  187. data/spec/dummy/config/initializers/secret_token.rb +0 -8
  188. data/spec/dummy/config/initializers/session_store.rb +0 -8
  189. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  190. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  191. data/spec/dummy/config/routes.rb +0 -52
  192. data/spec/dummy/config.ru +0 -4
  193. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  194. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  195. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -62
  196. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  197. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  198. data/spec/dummy/db/schema.rb +0 -68
  199. data/spec/dummy/public/404.html +0 -26
  200. data/spec/dummy/public/422.html +0 -26
  201. data/spec/dummy/public/500.html +0 -26
  202. data/spec/dummy/public/favicon.ico +0 -0
  203. data/spec/dummy/script/rails +0 -6
  204. data/spec/factories.rb +0 -28
  205. data/spec/generators/application_owner_generator_spec.rb +0 -41
  206. data/spec/generators/install_generator_spec.rb +0 -31
  207. data/spec/generators/migration_generator_spec.rb +0 -41
  208. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -57
  209. data/spec/generators/templates/routes.rb +0 -3
  210. data/spec/generators/views_generator_spec.rb +0 -27
  211. data/spec/grape/grape_integration_spec.rb +0 -135
  212. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  213. data/spec/lib/config_spec.rb +0 -462
  214. data/spec/lib/doorkeeper_spec.rb +0 -150
  215. data/spec/lib/models/expirable_spec.rb +0 -50
  216. data/spec/lib/models/revocable_spec.rb +0 -59
  217. data/spec/lib/models/scopes_spec.rb +0 -43
  218. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -41
  219. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -123
  220. data/spec/lib/oauth/base_request_spec.rb +0 -155
  221. data/spec/lib/oauth/base_response_spec.rb +0 -45
  222. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  223. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  224. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  225. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  226. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  227. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -105
  228. data/spec/lib/oauth/client_spec.rb +0 -39
  229. data/spec/lib/oauth/code_request_spec.rb +0 -43
  230. data/spec/lib/oauth/code_response_spec.rb +0 -34
  231. data/spec/lib/oauth/error_response_spec.rb +0 -61
  232. data/spec/lib/oauth/error_spec.rb +0 -23
  233. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -23
  234. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -64
  235. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -20
  236. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -218
  237. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -56
  238. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -96
  239. data/spec/lib/oauth/pre_authorization_spec.rb +0 -160
  240. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -166
  241. data/spec/lib/oauth/scopes_spec.rb +0 -149
  242. data/spec/lib/oauth/token_request_spec.rb +0 -96
  243. data/spec/lib/oauth/token_response_spec.rb +0 -85
  244. data/spec/lib/oauth/token_spec.rb +0 -116
  245. data/spec/lib/request/strategy_spec.rb +0 -53
  246. data/spec/lib/server_spec.rb +0 -59
  247. data/spec/models/doorkeeper/access_grant_spec.rb +0 -36
  248. data/spec/models/doorkeeper/access_token_spec.rb +0 -418
  249. data/spec/models/doorkeeper/application_spec.rb +0 -303
  250. data/spec/requests/applications/applications_request_spec.rb +0 -94
  251. data/spec/requests/applications/authorized_applications_spec.rb +0 -30
  252. data/spec/requests/endpoints/authorization_spec.rb +0 -71
  253. data/spec/requests/endpoints/token_spec.rb +0 -71
  254. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -76
  255. data/spec/requests/flows/authorization_code_spec.rb +0 -149
  256. data/spec/requests/flows/client_credentials_spec.rb +0 -86
  257. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -32
  258. data/spec/requests/flows/implicit_grant_spec.rb +0 -61
  259. data/spec/requests/flows/password_spec.rb +0 -197
  260. data/spec/requests/flows/refresh_token_spec.rb +0 -174
  261. data/spec/requests/flows/revoke_token_spec.rb +0 -157
  262. data/spec/requests/flows/skip_authorization_spec.rb +0 -59
  263. data/spec/requests/protected_resources/metal_spec.rb +0 -14
  264. data/spec/requests/protected_resources/private_api_spec.rb +0 -81
  265. data/spec/routing/custom_controller_routes_spec.rb +0 -75
  266. data/spec/routing/default_routes_spec.rb +0 -39
  267. data/spec/routing/scoped_routes_spec.rb +0 -31
  268. data/spec/spec_helper.rb +0 -4
  269. data/spec/spec_helper_integration.rb +0 -74
  270. data/spec/support/dependencies/factory_girl.rb +0 -2
  271. data/spec/support/helpers/access_token_request_helper.rb +0 -11
  272. data/spec/support/helpers/authorization_request_helper.rb +0 -41
  273. data/spec/support/helpers/config_helper.rb +0 -9
  274. data/spec/support/helpers/model_helper.rb +0 -72
  275. data/spec/support/helpers/request_spec_helper.rb +0 -88
  276. data/spec/support/helpers/url_helper.rb +0 -56
  277. data/spec/support/http_method_shim.rb +0 -38
  278. data/spec/support/orm/active_record.rb +0 -3
  279. data/spec/support/shared/controllers_shared_context.rb +0 -65
  280. data/spec/support/shared/models_shared_examples.rb +0 -52
  281. data/spec/validators/redirect_uri_validator_spec.rb +0 -123
  282. data/spec/version/version_spec.rb +0 -15
@@ -1,56 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe Doorkeeper::TokenInfoController do
4
- describe 'when requesting token info with valid token' do
5
- let(:doorkeeper_token) { FactoryBot.create(:access_token) }
6
-
7
- before(:each) do
8
- allow(controller).to receive(:doorkeeper_token) { doorkeeper_token }
9
- end
10
-
11
- describe 'successful request' do
12
- it 'responds with tokeninfo' do
13
- get :show
14
-
15
- expect(response.body).to eq(doorkeeper_token.to_json)
16
- end
17
-
18
- it 'responds with a 200 status' do
19
- get :show
20
-
21
- expect(response.status).to eq 200
22
- end
23
- end
24
-
25
- describe 'invalid token response' do
26
- before(:each) do
27
- allow(controller).to receive(:doorkeeper_token).and_return(nil)
28
- end
29
-
30
- it 'responds with 401 when doorkeeper_token is not valid' do
31
- get :show
32
-
33
- expect(response.status).to eq 401
34
- expect(response.headers['WWW-Authenticate']).to match(/^Bearer/)
35
- end
36
-
37
- it 'responds with 401 when doorkeeper_token is invalid, expired or revoked' do
38
- allow(controller).to receive(:doorkeeper_token).and_return(doorkeeper_token)
39
- allow(doorkeeper_token).to receive(:accessible?).and_return(false)
40
-
41
- get :show
42
-
43
- expect(response.status).to eq 401
44
- expect(response.headers['WWW-Authenticate']).to match(/^Bearer/)
45
- end
46
-
47
- it 'responds body message for error' do
48
- get :show
49
-
50
- expect(response.body).to eq(
51
- Doorkeeper::OAuth::ErrorResponse.new(name: :invalid_request, status: :unauthorized).body.to_json
52
- )
53
- end
54
- end
55
- end
56
- end
@@ -1,274 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe Doorkeeper::TokensController do
4
- describe 'when authorization has succeeded' do
5
- let(:token) { double(:token, authorize: true) }
6
-
7
- before do
8
- allow(controller).to receive(:token) { token }
9
- end
10
-
11
- it 'returns the authorization' do
12
- skip 'verify need of these specs'
13
-
14
- expect(token).to receive(:authorization)
15
-
16
- post :create
17
- end
18
- end
19
-
20
- describe 'when authorization has failed' do
21
- it 'returns the error response' do
22
- token = double(:token, authorize: false)
23
- allow(controller).to receive(:token) { token }
24
-
25
- post :create
26
-
27
- expect(response.status).to eq 401
28
- expect(response.headers['WWW-Authenticate']).to match(/Bearer/)
29
- end
30
- end
31
-
32
- describe 'when there is a failure due to a custom error' do
33
- it 'returns the error response with a custom message' do
34
- # I18n looks for `doorkeeper.errors.messages.custom_message` in locale files
35
- custom_message = "my_message"
36
- allow(I18n).to receive(:translate).
37
- with(
38
- custom_message,
39
- hash_including(scope: %i[doorkeeper errors messages]),
40
- ).
41
- and_return('Authorization custom message')
42
-
43
- doorkeeper_error = Doorkeeper::Errors::DoorkeeperError.new(custom_message)
44
-
45
- strategy = double(:strategy)
46
- request = double(token_request: strategy)
47
- allow(strategy).to receive(:authorize).and_raise(doorkeeper_error)
48
- allow(controller).to receive(:server).and_return(request)
49
-
50
- post :create
51
-
52
- expected_response_body = {
53
- "error" => custom_message,
54
- "error_description" => "Authorization custom message"
55
- }
56
- expect(response.status).to eq 401
57
- expect(response.headers['WWW-Authenticate']).to match(/Bearer/)
58
- expect(JSON.parse(response.body)).to eq expected_response_body
59
- end
60
- end
61
-
62
- # http://tools.ietf.org/html/rfc7009#section-2.2
63
- describe 'revoking tokens' do
64
- let(:client) { FactoryBot.create(:application) }
65
- let(:access_token) { FactoryBot.create(:access_token, application: client) }
66
-
67
- before(:each) do
68
- allow(controller).to receive(:token) { access_token }
69
- end
70
-
71
- context 'when associated app is public' do
72
- let(:client) { FactoryBot.create(:application, confidential: false) }
73
-
74
- it 'returns 200' do
75
- post :revoke
76
-
77
- expect(response.status).to eq 200
78
- end
79
-
80
- it 'revokes the access token' do
81
- post :revoke
82
-
83
- expect(access_token.reload).to have_attributes(revoked?: true)
84
- end
85
- end
86
-
87
- context 'when associated app is confidential' do
88
- let(:client) { FactoryBot.create(:application, confidential: true) }
89
- let(:oauth_client) { Doorkeeper::OAuth::Client.new(client) }
90
-
91
- before(:each) do
92
- allow_any_instance_of(Doorkeeper::Server).to receive(:client) { oauth_client }
93
- end
94
-
95
- it 'returns 200' do
96
- post :revoke
97
-
98
- expect(response.status).to eq 200
99
- end
100
-
101
- it 'revokes the access token' do
102
- post :revoke
103
-
104
- expect(access_token.reload).to have_attributes(revoked?: true)
105
- end
106
-
107
- context 'when authorization fails' do
108
- let(:some_other_client) { FactoryBot.create(:application, confidential: true) }
109
- let(:oauth_client) { Doorkeeper::OAuth::Client.new(some_other_client) }
110
-
111
- it 'returns 200' do
112
- post :revoke
113
-
114
- expect(response.status).to eq 200
115
- end
116
-
117
- it 'does not revoke the access token' do
118
- post :revoke
119
-
120
- expect(access_token.reload).to have_attributes(revoked?: false)
121
- end
122
- end
123
- end
124
- end
125
-
126
- describe 'authorize response memoization' do
127
- it "memoizes the result of the authorization" do
128
- strategy = double(:strategy, authorize: true)
129
- expect(strategy).to receive(:authorize).once
130
- allow(controller).to receive(:strategy) { strategy }
131
- allow(controller).to receive(:create) do
132
- controller.send :authorize_response
133
- end
134
-
135
- post :create
136
- end
137
- end
138
-
139
- describe 'when requested token introspection' do
140
- context 'authorized using Bearer token' do
141
- let(:client) { FactoryBot.create(:application) }
142
- let(:access_token) { FactoryBot.create(:access_token, application: client) }
143
-
144
- it 'responds with full token introspection' do
145
- request.headers['Authorization'] = "Bearer #{access_token.token}"
146
-
147
- post :introspect, token: access_token.token
148
-
149
- should_have_json 'active', true
150
- expect(json_response).to include('client_id', 'token_type', 'exp', 'iat')
151
- end
152
- end
153
-
154
- context 'authorized using Client Authentication' do
155
- let(:client) { FactoryBot.create(:application) }
156
- let(:access_token) { FactoryBot.create(:access_token, application: client) }
157
-
158
- it 'responds with full token introspection' do
159
- request.headers['Authorization'] = basic_auth_header_for_client(client)
160
-
161
- post :introspect, token: access_token.token
162
-
163
- should_have_json 'active', true
164
- expect(json_response).to include('client_id', 'token_type', 'exp', 'iat')
165
- should_have_json 'client_id', client.uid
166
- end
167
- end
168
-
169
- context 'public access token' do
170
- let(:client) { FactoryBot.create(:application) }
171
- let(:access_token) { FactoryBot.create(:access_token, application: nil) }
172
-
173
- it 'responds with full token introspection' do
174
- request.headers['Authorization'] = basic_auth_header_for_client(client)
175
-
176
- post :introspect, token: access_token.token
177
-
178
- should_have_json 'active', true
179
- expect(json_response).to include('client_id', 'token_type', 'exp', 'iat')
180
- should_have_json 'client_id', nil
181
- end
182
- end
183
-
184
- context 'token was issued to a different client than is making this request' do
185
- let(:client) { FactoryBot.create(:application) }
186
- let(:different_client) { FactoryBot.create(:application) }
187
- let(:access_token) { FactoryBot.create(:access_token, application: client) }
188
-
189
- it 'responds with only active state' do
190
- request.headers['Authorization'] = basic_auth_header_for_client(different_client)
191
-
192
- post :introspect, token: access_token.token
193
-
194
- expect(response).to be_successful
195
-
196
- should_have_json 'active', false
197
- expect(json_response).not_to include('client_id', 'token_type', 'exp', 'iat')
198
- end
199
- end
200
-
201
- context 'using invalid credentials to authorize' do
202
- let(:client) { double(uid: '123123', secret: '666999') }
203
- let(:access_token) { FactoryBot.create(:access_token) }
204
-
205
- it 'responds with invalid_client error' do
206
- request.headers['Authorization'] = basic_auth_header_for_client(client)
207
-
208
- post :introspect, token: access_token.token
209
-
210
- expect(response).not_to be_successful
211
- response_status_should_be 401
212
-
213
- should_not_have_json 'active'
214
- should_have_json 'error', 'invalid_client'
215
- end
216
- end
217
-
218
- context 'using wrong token value' do
219
- let(:client) { FactoryBot.create(:application) }
220
- let(:access_token) { FactoryBot.create(:access_token, application: client) }
221
-
222
- it 'responds with only active state' do
223
- request.headers['Authorization'] = basic_auth_header_for_client(client)
224
-
225
- post :introspect, token: SecureRandom.hex(16)
226
-
227
- should_have_json 'active', false
228
- expect(json_response).not_to include('client_id', 'token_type', 'exp', 'iat')
229
- end
230
- end
231
-
232
- context 'when requested Access Token expired' do
233
- let(:client) { FactoryBot.create(:application) }
234
- let(:access_token) { FactoryBot.create(:access_token, application: client, created_at: 1.year.ago) }
235
-
236
- it 'responds with only active state' do
237
- request.headers['Authorization'] = basic_auth_header_for_client(client)
238
-
239
- post :introspect, token: access_token.token
240
-
241
- should_have_json 'active', false
242
- expect(json_response).not_to include('client_id', 'token_type', 'exp', 'iat')
243
- end
244
- end
245
-
246
- context 'when requested Access Token revoked' do
247
- let(:client) { FactoryBot.create(:application) }
248
- let(:access_token) { FactoryBot.create(:access_token, application: client, revoked_at: 1.year.ago) }
249
-
250
- it 'responds with only active state' do
251
- request.headers['Authorization'] = basic_auth_header_for_client(client)
252
-
253
- post :introspect, token: access_token.token
254
-
255
- should_have_json 'active', false
256
- expect(json_response).not_to include('client_id', 'token_type', 'exp', 'iat')
257
- end
258
- end
259
-
260
- context 'unauthorized (no bearer token or client credentials)' do
261
- let(:access_token) { FactoryBot.create(:access_token) }
262
-
263
- it 'responds with invalid_request error' do
264
- post :introspect, token: access_token.token
265
-
266
- expect(response).not_to be_successful
267
- response_status_should_be 401
268
-
269
- should_not_have_json 'active'
270
- should_have_json 'error', 'invalid_request'
271
- end
272
- end
273
- end
274
- end
data/spec/dummy/Rakefile DELETED
@@ -1,7 +0,0 @@
1
- #!/usr/bin/env rake
2
- # Add your own tasks in files placed in lib/tasks ending in .rake,
3
- # for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.
4
-
5
- require File.expand_path('../config/application', __FILE__)
6
-
7
- Dummy::Application.load_tasks
@@ -1,3 +0,0 @@
1
- class ApplicationController < ActionController::Base
2
- protect_from_forgery
3
- end
@@ -1,7 +0,0 @@
1
- class CustomAuthorizationsController < ::ApplicationController
2
- %w(index show new create edit update destroy).each do |action|
3
- define_method action do
4
- render nothing: true
5
- end
6
- end
7
- end
@@ -1,12 +0,0 @@
1
- class FullProtectedResourcesController < ApplicationController
2
- before_action -> { doorkeeper_authorize! :write, :admin }, only: :show
3
- before_action :doorkeeper_authorize!, only: :index
4
-
5
- def index
6
- render plain: 'index'
7
- end
8
-
9
- def show
10
- render plain: 'show'
11
- end
12
- end
@@ -1,17 +0,0 @@
1
- class HomeController < ApplicationController
2
- def index
3
- end
4
-
5
- def sign_in
6
- session[:user_id] = if Rails.env.development?
7
- User.first || User.create!(name: 'Joe', password: 'sekret')
8
- else
9
- User.first
10
- end
11
- redirect_to '/'
12
- end
13
-
14
- def callback
15
- render plain: 'ok'
16
- end
17
- end
@@ -1,11 +0,0 @@
1
- class MetalController < ActionController::Metal
2
- include AbstractController::Callbacks
3
- include ActionController::Head
4
- include Doorkeeper::Rails::Helpers
5
-
6
- before_action :doorkeeper_authorize!
7
-
8
- def index
9
- self.response_body = { ok: true }.to_json
10
- end
11
- end
@@ -1,11 +0,0 @@
1
- class SemiProtectedResourcesController < ApplicationController
2
- before_action :doorkeeper_authorize!, only: :index
3
-
4
- def index
5
- render plain: 'protected index'
6
- end
7
-
8
- def show
9
- render plain: 'non protected show'
10
- end
11
- end
@@ -1,5 +0,0 @@
1
- module ApplicationHelper
2
- def current_user
3
- @current_user ||= User.find_by_id(session[:user_id])
4
- end
5
- end
@@ -1,5 +0,0 @@
1
- class User < ActiveRecord::Base
2
- def self.authenticate!(name, password)
3
- User.where(name: name, password: password).first
4
- end
5
- end
File without changes
@@ -1,14 +0,0 @@
1
- <!DOCTYPE html>
2
- <html>
3
- <head>
4
- <title>Dummy</title>
5
- <%= csrf_meta_tags %>
6
- </head>
7
- <body>
8
-
9
- <%= link_to "Sign in", '/sign_in' %>
10
-
11
- <%= yield %>
12
-
13
- </body>
14
- </html>
@@ -1,23 +0,0 @@
1
- require File.expand_path('../boot', __FILE__)
2
-
3
- require 'rails/all'
4
-
5
- Bundler.require(*Rails.groups)
6
-
7
- require 'yaml'
8
-
9
- orm = if DOORKEEPER_ORM =~ /mongoid/
10
- Mongoid.load!(File.join(File.dirname(File.expand_path(__FILE__)), "#{DOORKEEPER_ORM}.yml"))
11
- :mongoid
12
- else
13
- DOORKEEPER_ORM
14
- end
15
- require "#{orm}/railtie"
16
-
17
- module Dummy
18
- class Application < Rails::Application
19
- # Settings in config/environments/* take precedence over those specified here.
20
- # Application configuration should go into files in config/initializers
21
- # -- all .rb files in that directory are automatically loaded.
22
- end
23
- end