doorkeeper 5.1.0 → 5.5.0

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 (265) hide show
  1. checksums.yaml +4 -4
  2. data/{NEWS.md → CHANGELOG.md} +234 -25
  3. data/README.md +21 -11
  4. data/app/controllers/doorkeeper/application_controller.rb +2 -2
  5. data/app/controllers/doorkeeper/application_metal_controller.rb +3 -2
  6. data/app/controllers/doorkeeper/applications_controller.rb +8 -7
  7. data/app/controllers/doorkeeper/authorizations_controller.rb +56 -19
  8. data/app/controllers/doorkeeper/authorized_applications_controller.rb +5 -5
  9. data/app/controllers/doorkeeper/token_info_controller.rb +12 -2
  10. data/app/controllers/doorkeeper/tokens_controller.rb +93 -25
  11. data/app/views/doorkeeper/applications/_form.html.erb +1 -7
  12. data/app/views/doorkeeper/applications/show.html.erb +35 -14
  13. data/app/views/doorkeeper/authorizations/form_post.html.erb +11 -0
  14. data/config/locales/en.yml +13 -3
  15. data/lib/doorkeeper/config/abstract_builder.rb +28 -0
  16. data/lib/doorkeeper/config/option.rb +20 -2
  17. data/lib/doorkeeper/config/validations.rb +53 -0
  18. data/lib/doorkeeper/config.rb +291 -121
  19. data/lib/doorkeeper/engine.rb +1 -1
  20. data/lib/doorkeeper/errors.rb +13 -18
  21. data/lib/doorkeeper/grant_flow/fallback_flow.rb +15 -0
  22. data/lib/doorkeeper/grant_flow/flow.rb +44 -0
  23. data/lib/doorkeeper/grant_flow/registry.rb +50 -0
  24. data/lib/doorkeeper/grant_flow.rb +45 -0
  25. data/lib/doorkeeper/grape/helpers.rb +7 -3
  26. data/lib/doorkeeper/helpers/controller.rb +36 -11
  27. data/lib/doorkeeper/models/access_grant_mixin.rb +22 -18
  28. data/lib/doorkeeper/models/access_token_mixin.rb +194 -51
  29. data/lib/doorkeeper/models/application_mixin.rb +8 -7
  30. data/lib/doorkeeper/models/concerns/ownership.rb +1 -1
  31. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  32. data/lib/doorkeeper/models/concerns/reusable.rb +1 -1
  33. data/lib/doorkeeper/models/concerns/revocable.rb +1 -28
  34. data/lib/doorkeeper/models/concerns/scopes.rb +5 -1
  35. data/lib/doorkeeper/models/concerns/secret_storable.rb +1 -3
  36. data/lib/doorkeeper/oauth/authorization/code.rb +25 -14
  37. data/lib/doorkeeper/oauth/authorization/context.rb +5 -5
  38. data/lib/doorkeeper/oauth/authorization/token.rb +24 -19
  39. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +4 -4
  40. data/lib/doorkeeper/oauth/authorization_code_request.rb +40 -21
  41. data/lib/doorkeeper/oauth/base_request.rb +21 -23
  42. data/lib/doorkeeper/oauth/client/credentials.rb +2 -4
  43. data/lib/doorkeeper/oauth/client.rb +8 -9
  44. data/lib/doorkeeper/oauth/client_credentials/creator.rb +45 -5
  45. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +10 -8
  46. data/lib/doorkeeper/oauth/client_credentials/{validation.rb → validator.rb} +13 -3
  47. data/lib/doorkeeper/oauth/client_credentials_request.rb +8 -7
  48. data/lib/doorkeeper/oauth/code_request.rb +6 -12
  49. data/lib/doorkeeper/oauth/code_response.rb +24 -14
  50. data/lib/doorkeeper/oauth/error.rb +1 -1
  51. data/lib/doorkeeper/oauth/error_response.rb +10 -11
  52. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +8 -12
  53. data/lib/doorkeeper/oauth/helpers/unique_token.rb +8 -5
  54. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +19 -5
  55. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  56. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  57. data/lib/doorkeeper/oauth/invalid_token_response.rb +7 -4
  58. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  59. data/lib/doorkeeper/oauth/password_access_token_request.rb +32 -10
  60. data/lib/doorkeeper/oauth/pre_authorization.rb +111 -42
  61. data/lib/doorkeeper/oauth/refresh_token_request.rb +45 -33
  62. data/lib/doorkeeper/oauth/token.rb +6 -7
  63. data/lib/doorkeeper/oauth/token_introspection.rb +24 -18
  64. data/lib/doorkeeper/oauth/token_request.rb +6 -20
  65. data/lib/doorkeeper/oauth/token_response.rb +1 -1
  66. data/lib/doorkeeper/orm/active_record/access_grant.rb +4 -43
  67. data/lib/doorkeeper/orm/active_record/access_token.rb +4 -35
  68. data/lib/doorkeeper/orm/active_record/application.rb +5 -83
  69. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +68 -0
  70. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +59 -0
  71. data/lib/doorkeeper/orm/active_record/mixins/application.rb +198 -0
  72. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  73. data/lib/doorkeeper/orm/active_record.rb +20 -6
  74. data/lib/doorkeeper/rails/helpers.rb +4 -4
  75. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  76. data/lib/doorkeeper/rails/routes/mapper.rb +2 -2
  77. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  78. data/lib/doorkeeper/rails/routes.rb +17 -25
  79. data/lib/doorkeeper/rake/db.rake +6 -6
  80. data/lib/doorkeeper/rake/setup.rake +5 -0
  81. data/lib/doorkeeper/request/authorization_code.rb +5 -3
  82. data/lib/doorkeeper/request/client_credentials.rb +2 -2
  83. data/lib/doorkeeper/request/password.rb +2 -2
  84. data/lib/doorkeeper/request/refresh_token.rb +5 -4
  85. data/lib/doorkeeper/request/strategy.rb +2 -2
  86. data/lib/doorkeeper/request.rb +49 -17
  87. data/lib/doorkeeper/server.rb +7 -11
  88. data/lib/doorkeeper/stale_records_cleaner.rb +6 -2
  89. data/lib/doorkeeper/version.rb +1 -5
  90. data/lib/doorkeeper.rb +114 -79
  91. data/lib/generators/doorkeeper/application_owner_generator.rb +1 -1
  92. data/lib/generators/doorkeeper/confidential_applications_generator.rb +2 -2
  93. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  94. data/lib/generators/doorkeeper/migration_generator.rb +1 -1
  95. data/lib/generators/doorkeeper/pkce_generator.rb +1 -1
  96. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +7 -7
  97. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +3 -1
  98. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +2 -0
  99. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +2 -0
  100. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  101. data/lib/generators/doorkeeper/templates/initializer.rb +205 -43
  102. data/lib/generators/doorkeeper/templates/migration.rb.erb +18 -6
  103. metadata +43 -310
  104. data/.coveralls.yml +0 -1
  105. data/.github/ISSUE_TEMPLATE.md +0 -25
  106. data/.github/PULL_REQUEST_TEMPLATE.md +0 -17
  107. data/.gitignore +0 -20
  108. data/.gitlab-ci.yml +0 -16
  109. data/.hound.yml +0 -3
  110. data/.rspec +0 -1
  111. data/.rubocop.yml +0 -50
  112. data/.travis.yml +0 -35
  113. data/Appraisals +0 -40
  114. data/CODE_OF_CONDUCT.md +0 -46
  115. data/CONTRIBUTING.md +0 -47
  116. data/Dangerfile +0 -67
  117. data/Gemfile +0 -24
  118. data/RELEASING.md +0 -10
  119. data/Rakefile +0 -28
  120. data/SECURITY.md +0 -15
  121. data/UPGRADE.md +0 -2
  122. data/app/validators/redirect_uri_validator.rb +0 -50
  123. data/bin/console +0 -16
  124. data/doorkeeper.gemspec +0 -34
  125. data/gemfiles/rails_5_0.gemfile +0 -17
  126. data/gemfiles/rails_5_1.gemfile +0 -17
  127. data/gemfiles/rails_5_2.gemfile +0 -17
  128. data/gemfiles/rails_6_0.gemfile +0 -17
  129. data/gemfiles/rails_master.gemfile +0 -17
  130. data/spec/controllers/application_metal_controller_spec.rb +0 -64
  131. data/spec/controllers/applications_controller_spec.rb +0 -180
  132. data/spec/controllers/authorizations_controller_spec.rb +0 -527
  133. data/spec/controllers/protected_resources_controller_spec.rb +0 -353
  134. data/spec/controllers/token_info_controller_spec.rb +0 -50
  135. data/spec/controllers/tokens_controller_spec.rb +0 -330
  136. data/spec/dummy/Rakefile +0 -9
  137. data/spec/dummy/app/assets/config/manifest.js +0 -2
  138. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  139. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -9
  140. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -14
  141. data/spec/dummy/app/controllers/home_controller.rb +0 -18
  142. data/spec/dummy/app/controllers/metal_controller.rb +0 -13
  143. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -13
  144. data/spec/dummy/app/helpers/application_helper.rb +0 -7
  145. data/spec/dummy/app/models/user.rb +0 -7
  146. data/spec/dummy/app/views/home/index.html.erb +0 -0
  147. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  148. data/spec/dummy/config/application.rb +0 -47
  149. data/spec/dummy/config/boot.rb +0 -7
  150. data/spec/dummy/config/database.yml +0 -15
  151. data/spec/dummy/config/environment.rb +0 -5
  152. data/spec/dummy/config/environments/development.rb +0 -31
  153. data/spec/dummy/config/environments/production.rb +0 -64
  154. data/spec/dummy/config/environments/test.rb +0 -45
  155. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -9
  156. data/spec/dummy/config/initializers/doorkeeper.rb +0 -121
  157. data/spec/dummy/config/initializers/secret_token.rb +0 -10
  158. data/spec/dummy/config/initializers/session_store.rb +0 -10
  159. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -16
  160. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  161. data/spec/dummy/config/routes.rb +0 -13
  162. data/spec/dummy/config.ru +0 -6
  163. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -11
  164. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -7
  165. data/spec/dummy/db/migrate/20151223192035_create_doorkeeper_tables.rb +0 -69
  166. data/spec/dummy/db/migrate/20151223200000_add_owner_to_application.rb +0 -9
  167. data/spec/dummy/db/migrate/20160320211015_add_previous_refresh_token_to_access_tokens.rb +0 -13
  168. data/spec/dummy/db/migrate/20170822064514_enable_pkce.rb +0 -8
  169. data/spec/dummy/db/migrate/20180210183654_add_confidential_to_applications.rb +0 -13
  170. data/spec/dummy/db/schema.rb +0 -68
  171. data/spec/dummy/public/404.html +0 -26
  172. data/spec/dummy/public/422.html +0 -26
  173. data/spec/dummy/public/500.html +0 -26
  174. data/spec/dummy/public/favicon.ico +0 -0
  175. data/spec/dummy/script/rails +0 -9
  176. data/spec/factories.rb +0 -30
  177. data/spec/generators/application_owner_generator_spec.rb +0 -28
  178. data/spec/generators/confidential_applications_generator_spec.rb +0 -29
  179. data/spec/generators/install_generator_spec.rb +0 -36
  180. data/spec/generators/migration_generator_spec.rb +0 -28
  181. data/spec/generators/pkce_generator_spec.rb +0 -28
  182. data/spec/generators/previous_refresh_token_generator_spec.rb +0 -44
  183. data/spec/generators/templates/routes.rb +0 -4
  184. data/spec/generators/views_generator_spec.rb +0 -29
  185. data/spec/grape/grape_integration_spec.rb +0 -137
  186. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -26
  187. data/spec/lib/config_spec.rb +0 -697
  188. data/spec/lib/doorkeeper_spec.rb +0 -27
  189. data/spec/lib/models/expirable_spec.rb +0 -61
  190. data/spec/lib/models/reusable_spec.rb +0 -40
  191. data/spec/lib/models/revocable_spec.rb +0 -59
  192. data/spec/lib/models/scopes_spec.rb +0 -53
  193. data/spec/lib/models/secret_storable_spec.rb +0 -135
  194. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -39
  195. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -156
  196. data/spec/lib/oauth/base_request_spec.rb +0 -205
  197. data/spec/lib/oauth/base_response_spec.rb +0 -47
  198. data/spec/lib/oauth/client/credentials_spec.rb +0 -90
  199. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -94
  200. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -112
  201. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -59
  202. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -29
  203. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -109
  204. data/spec/lib/oauth/client_spec.rb +0 -38
  205. data/spec/lib/oauth/code_request_spec.rb +0 -47
  206. data/spec/lib/oauth/code_response_spec.rb +0 -36
  207. data/spec/lib/oauth/error_response_spec.rb +0 -66
  208. data/spec/lib/oauth/error_spec.rb +0 -23
  209. data/spec/lib/oauth/forbidden_token_response_spec.rb +0 -22
  210. data/spec/lib/oauth/helpers/scope_checker_spec.rb +0 -98
  211. data/spec/lib/oauth/helpers/unique_token_spec.rb +0 -21
  212. data/spec/lib/oauth/helpers/uri_checker_spec.rb +0 -247
  213. data/spec/lib/oauth/invalid_token_response_spec.rb +0 -55
  214. data/spec/lib/oauth/password_access_token_request_spec.rb +0 -192
  215. data/spec/lib/oauth/pre_authorization_spec.rb +0 -215
  216. data/spec/lib/oauth/refresh_token_request_spec.rb +0 -177
  217. data/spec/lib/oauth/scopes_spec.rb +0 -148
  218. data/spec/lib/oauth/token_request_spec.rb +0 -150
  219. data/spec/lib/oauth/token_response_spec.rb +0 -86
  220. data/spec/lib/oauth/token_spec.rb +0 -158
  221. data/spec/lib/request/strategy_spec.rb +0 -54
  222. data/spec/lib/secret_storing/base_spec.rb +0 -60
  223. data/spec/lib/secret_storing/bcrypt_spec.rb +0 -49
  224. data/spec/lib/secret_storing/plain_spec.rb +0 -44
  225. data/spec/lib/secret_storing/sha256_hash_spec.rb +0 -48
  226. data/spec/lib/server_spec.rb +0 -61
  227. data/spec/lib/stale_records_cleaner_spec.rb +0 -89
  228. data/spec/models/doorkeeper/access_grant_spec.rb +0 -144
  229. data/spec/models/doorkeeper/access_token_spec.rb +0 -591
  230. data/spec/models/doorkeeper/application_spec.rb +0 -367
  231. data/spec/requests/applications/applications_request_spec.rb +0 -259
  232. data/spec/requests/applications/authorized_applications_spec.rb +0 -32
  233. data/spec/requests/endpoints/authorization_spec.rb +0 -73
  234. data/spec/requests/endpoints/token_spec.rb +0 -75
  235. data/spec/requests/flows/authorization_code_errors_spec.rb +0 -78
  236. data/spec/requests/flows/authorization_code_spec.rb +0 -447
  237. data/spec/requests/flows/client_credentials_spec.rb +0 -128
  238. data/spec/requests/flows/implicit_grant_errors_spec.rb +0 -34
  239. data/spec/requests/flows/implicit_grant_spec.rb +0 -90
  240. data/spec/requests/flows/password_spec.rb +0 -259
  241. data/spec/requests/flows/refresh_token_spec.rb +0 -233
  242. data/spec/requests/flows/revoke_token_spec.rb +0 -143
  243. data/spec/requests/flows/skip_authorization_spec.rb +0 -66
  244. data/spec/requests/protected_resources/metal_spec.rb +0 -16
  245. data/spec/requests/protected_resources/private_api_spec.rb +0 -83
  246. data/spec/routing/custom_controller_routes_spec.rb +0 -133
  247. data/spec/routing/default_routes_spec.rb +0 -41
  248. data/spec/routing/scoped_routes_spec.rb +0 -47
  249. data/spec/spec_helper.rb +0 -57
  250. data/spec/spec_helper_integration.rb +0 -4
  251. data/spec/support/dependencies/factory_bot.rb +0 -4
  252. data/spec/support/doorkeeper_rspec.rb +0 -22
  253. data/spec/support/helpers/access_token_request_helper.rb +0 -13
  254. data/spec/support/helpers/authorization_request_helper.rb +0 -43
  255. data/spec/support/helpers/config_helper.rb +0 -11
  256. data/spec/support/helpers/model_helper.rb +0 -78
  257. data/spec/support/helpers/request_spec_helper.rb +0 -98
  258. data/spec/support/helpers/url_helper.rb +0 -62
  259. data/spec/support/http_method_shim.rb +0 -29
  260. data/spec/support/orm/active_record.rb +0 -5
  261. data/spec/support/shared/controllers_shared_context.rb +0 -123
  262. data/spec/support/shared/hashing_shared_context.rb +0 -36
  263. data/spec/support/shared/models_shared_examples.rb +0 -54
  264. data/spec/validators/redirect_uri_validator_spec.rb +0 -158
  265. data/spec/version/version_spec.rb +0 -17
@@ -1,128 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe "Client Credentials Request" do
6
- let(:client) { FactoryBot.create :application }
7
-
8
- context "a valid request" do
9
- it "authorizes the client and returns the token response" do
10
- headers = authorization client.uid, client.secret
11
- params = { grant_type: "client_credentials" }
12
-
13
- post "/oauth/token", params: params, headers: headers
14
-
15
- should_have_json "access_token", Doorkeeper::AccessToken.first.token
16
- should_have_json_within "expires_in", Doorkeeper.configuration.access_token_expires_in, 1
17
- should_not_have_json "scope"
18
- should_not_have_json "refresh_token"
19
-
20
- should_not_have_json "error"
21
- should_not_have_json "error_description"
22
- end
23
-
24
- context "with scopes" do
25
- before do
26
- optional_scopes_exist :write
27
- default_scopes_exist :public
28
- end
29
-
30
- it "adds the scope to the token an returns in the response" do
31
- headers = authorization client.uid, client.secret
32
- params = { grant_type: "client_credentials", scope: "write" }
33
-
34
- post "/oauth/token", params: params, headers: headers
35
-
36
- should_have_json "access_token", Doorkeeper::AccessToken.first.token
37
- should_have_json "scope", "write"
38
- end
39
-
40
- context "that are default" do
41
- it "adds the scope to the token an returns in the response" do
42
- headers = authorization client.uid, client.secret
43
- params = { grant_type: "client_credentials", scope: "public" }
44
-
45
- post "/oauth/token", params: params, headers: headers
46
-
47
- should_have_json "access_token", Doorkeeper::AccessToken.first.token
48
- should_have_json "scope", "public"
49
- end
50
- end
51
-
52
- context "that are invalid" do
53
- it "does not authorize the client and returns the error" do
54
- headers = authorization client.uid, client.secret
55
- params = { grant_type: "client_credentials", scope: "random" }
56
-
57
- post "/oauth/token", params: params, headers: headers
58
-
59
- should_have_json "error", "invalid_scope"
60
- should_have_json "error_description", translated_error_message(:invalid_scope)
61
- should_not_have_json "access_token"
62
-
63
- expect(response.status).to eq(400)
64
- end
65
- end
66
- end
67
- end
68
-
69
- context "when application scopes contain some of the default scopes and no scope is passed" do
70
- before do
71
- client.update(scopes: "read write public")
72
- end
73
-
74
- it "issues new token with one default scope that are present in application scopes" do
75
- default_scopes_exist :public
76
-
77
- headers = authorization client.uid, client.secret
78
- params = { grant_type: "client_credentials" }
79
-
80
- expect do
81
- post "/oauth/token", params: params, headers: headers
82
- end.to change { Doorkeeper::AccessToken.count }.by(1)
83
-
84
- token = Doorkeeper::AccessToken.first
85
-
86
- expect(token.application_id).to eq client.id
87
- should_have_json "access_token", token.token
88
- should_have_json "scope", "public"
89
- end
90
-
91
- it "issues new token with multiple default scopes that are present in application scopes" do
92
- default_scopes_exist :public, :read, :update
93
-
94
- headers = authorization client.uid, client.secret
95
- params = { grant_type: "client_credentials" }
96
-
97
- expect do
98
- post "/oauth/token", params: params, headers: headers
99
- end.to change { Doorkeeper::AccessToken.count }.by(1)
100
-
101
- token = Doorkeeper::AccessToken.first
102
-
103
- expect(token.application_id).to eq client.id
104
- should_have_json "access_token", token.token
105
- should_have_json "scope", "public read"
106
- end
107
- end
108
-
109
- context "an invalid request" do
110
- it "does not authorize the client and returns the error" do
111
- headers = {}
112
- params = { grant_type: "client_credentials" }
113
-
114
- post "/oauth/token", params: params, headers: headers
115
-
116
- should_have_json "error", "invalid_client"
117
- should_have_json "error_description", translated_error_message(:invalid_client)
118
- should_not_have_json "access_token"
119
-
120
- expect(response.status).to eq(401)
121
- end
122
- end
123
-
124
- def authorization(username, password)
125
- credentials = ActionController::HttpAuthentication::Basic.encode_credentials username, password
126
- { "HTTP_AUTHORIZATION" => credentials }
127
- end
128
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- feature "Implicit Grant Flow Errors" do
6
- background do
7
- config_is_set(:authenticate_resource_owner) { User.first || redirect_to("/sign_in") }
8
- config_is_set(:grant_flows, ["implicit"])
9
- client_exists
10
- create_resource_owner
11
- sign_in
12
- end
13
-
14
- after do
15
- access_token_should_not_exist
16
- end
17
-
18
- [
19
- %i[client_id invalid_client],
20
- %i[redirect_uri invalid_redirect_uri],
21
- ].each do |error|
22
- scenario "displays #{error.last} error for invalid #{error.first}" do
23
- visit authorization_endpoint_url(client: @client, error.first => "invalid", response_type: "token")
24
- i_should_not_see "Authorize"
25
- i_should_see_translated_error_message error.last
26
- end
27
-
28
- scenario "displays #{error.last} error when #{error.first} is missing" do
29
- visit authorization_endpoint_url(client: @client, error.first => "", response_type: "token")
30
- i_should_not_see "Authorize"
31
- i_should_see_translated_error_message error.last
32
- end
33
- end
34
- end
@@ -1,90 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- feature "Implicit Grant Flow (feature spec)" do
6
- background do
7
- config_is_set(:authenticate_resource_owner) { User.first || redirect_to("/sign_in") }
8
- config_is_set(:grant_flows, ["implicit"])
9
- client_exists
10
- create_resource_owner
11
- sign_in
12
- end
13
-
14
- scenario "resource owner authorizes the client" do
15
- visit authorization_endpoint_url(client: @client, response_type: "token")
16
- click_on "Authorize"
17
-
18
- access_token_should_exist_for @client, @resource_owner
19
-
20
- i_should_be_on_client_callback @client
21
- end
22
-
23
- context "when application scopes are present and no scope is passed" do
24
- background do
25
- @client.update(scopes: "public write read")
26
- end
27
-
28
- scenario "access token has no scopes" do
29
- default_scopes_exist :admin
30
- visit authorization_endpoint_url(client: @client, response_type: "token")
31
- click_on "Authorize"
32
- access_token_should_exist_for @client, @resource_owner
33
- token = Doorkeeper::AccessToken.first
34
- expect(token.scopes).to be_empty
35
- end
36
-
37
- scenario "access token has scopes which are common in application scopees and default scopes" do
38
- default_scopes_exist :public, :write
39
- visit authorization_endpoint_url(client: @client, response_type: "token")
40
- click_on "Authorize"
41
- access_token_should_exist_for @client, @resource_owner
42
- access_token_should_have_scopes :public, :write
43
- end
44
- end
45
- end
46
-
47
- describe "Implicit Grant Flow (request spec)" do
48
- before do
49
- config_is_set(:authenticate_resource_owner) { User.first || redirect_to("/sign_in") }
50
- config_is_set(:grant_flows, ["implicit"])
51
- client_exists
52
- create_resource_owner
53
- end
54
-
55
- context "token reuse" do
56
- it "should return a new token each request" do
57
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(false)
58
-
59
- token = client_is_authorized(@client, @resource_owner)
60
-
61
- post "/oauth/authorize",
62
- params: {
63
- client_id: @client.uid,
64
- state: "",
65
- redirect_uri: @client.redirect_uri,
66
- response_type: "token",
67
- commit: "Authorize",
68
- }
69
-
70
- expect(response.location).not_to include(token.token)
71
- end
72
-
73
- it "should return the same token if it is still accessible" do
74
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
75
-
76
- token = client_is_authorized(@client, @resource_owner)
77
-
78
- post "/oauth/authorize",
79
- params: {
80
- client_id: @client.uid,
81
- state: "",
82
- redirect_uri: @client.redirect_uri,
83
- response_type: "token",
84
- commit: "Authorize",
85
- }
86
-
87
- expect(response.location).to include(token.token)
88
- end
89
- end
90
- end
@@ -1,259 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "spec_helper"
4
-
5
- describe "Resource Owner Password Credentials Flow not set up" do
6
- before do
7
- client_exists
8
- create_resource_owner
9
- end
10
-
11
- context "with valid user credentials" do
12
- it "does not issue new token" do
13
- expect do
14
- post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
15
- end.to_not(change { Doorkeeper::AccessToken.count })
16
- end
17
- end
18
- end
19
-
20
- describe "Resource Owner Password Credentials Flow" do
21
- let(:client_attributes) { { redirect_uri: nil } }
22
-
23
- before do
24
- config_is_set(:grant_flows, ["password"])
25
- config_is_set(:resource_owner_from_credentials) { User.authenticate! params[:username], params[:password] }
26
- client_exists(client_attributes)
27
- create_resource_owner
28
- end
29
-
30
- context "with valid user credentials" do
31
- context "with non-confidential/public client" do
32
- let(:client_attributes) { { confidential: false } }
33
-
34
- context "when client_secret absent" do
35
- it "should issue new token" do
36
- expect do
37
- post password_token_endpoint_url(client_id: @client.uid, resource_owner: @resource_owner)
38
- end.to change { Doorkeeper::AccessToken.count }.by(1)
39
-
40
- token = Doorkeeper::AccessToken.first
41
-
42
- expect(token.application_id).to eq @client.id
43
- should_have_json "access_token", token.token
44
- end
45
- end
46
-
47
- context "when client_secret present" do
48
- it "should issue new token" do
49
- expect do
50
- post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
51
- end.to change { Doorkeeper::AccessToken.count }.by(1)
52
-
53
- token = Doorkeeper::AccessToken.first
54
-
55
- expect(token.application_id).to eq @client.id
56
- should_have_json "access_token", token.token
57
- end
58
-
59
- context "when client_secret incorrect" do
60
- it "should not issue new token" do
61
- expect do
62
- post password_token_endpoint_url(
63
- client_id: @client.uid,
64
- client_secret: "foobar",
65
- resource_owner: @resource_owner
66
- )
67
- end.not_to(change { Doorkeeper::AccessToken.count })
68
-
69
- expect(response.status).to eq(401)
70
- should_have_json "error", "invalid_client"
71
- end
72
- end
73
- end
74
- end
75
-
76
- context "with confidential/private client" do
77
- it "should issue new token" do
78
- expect do
79
- post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
80
- end.to change { Doorkeeper::AccessToken.count }.by(1)
81
-
82
- token = Doorkeeper::AccessToken.first
83
-
84
- expect(token.application_id).to eq @client.id
85
- should_have_json "access_token", token.token
86
- end
87
-
88
- context "when client_secret absent" do
89
- it "should not issue new token" do
90
- expect do
91
- post password_token_endpoint_url(client_id: @client.uid, resource_owner: @resource_owner)
92
- end.not_to(change { Doorkeeper::AccessToken.count })
93
-
94
- expect(response.status).to eq(401)
95
- should_have_json "error", "invalid_client"
96
- end
97
- end
98
- end
99
-
100
- it "should issue new token without client credentials" do
101
- expect do
102
- post password_token_endpoint_url(resource_owner: @resource_owner)
103
- end.to(change { Doorkeeper::AccessToken.count }.by(1))
104
-
105
- token = Doorkeeper::AccessToken.first
106
-
107
- expect(token.application_id).to be_nil
108
- should_have_json "access_token", token.token
109
- end
110
-
111
- it "should issue a refresh token if enabled" do
112
- config_is_set(:refresh_token_enabled, true)
113
-
114
- post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
115
-
116
- token = Doorkeeper::AccessToken.first
117
-
118
- should_have_json "refresh_token", token.refresh_token
119
- end
120
-
121
- it "should return the same token if it is still accessible" do
122
- allow(Doorkeeper.configuration).to receive(:reuse_access_token).and_return(true)
123
-
124
- client_is_authorized(@client, @resource_owner)
125
-
126
- post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
127
-
128
- expect(Doorkeeper::AccessToken.count).to be(1)
129
- should_have_json "access_token", Doorkeeper::AccessToken.first.token
130
- end
131
-
132
- context "with valid, default scope" do
133
- before do
134
- default_scopes_exist :public
135
- end
136
-
137
- it "should issue new token" do
138
- expect do
139
- post password_token_endpoint_url(client: @client, resource_owner: @resource_owner, scope: "public")
140
- end.to change { Doorkeeper::AccessToken.count }.by(1)
141
-
142
- token = Doorkeeper::AccessToken.first
143
-
144
- expect(token.application_id).to eq @client.id
145
- should_have_json "access_token", token.token
146
- should_have_json "scope", "public"
147
- end
148
- end
149
- end
150
-
151
- context "when application scopes are present and differs from configured default scopes and no scope is passed" do
152
- before do
153
- default_scopes_exist :public
154
- @client.update(scopes: "abc")
155
- end
156
-
157
- it "issues new token without any scope" do
158
- expect do
159
- post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
160
- end.to change { Doorkeeper::AccessToken.count }.by(1)
161
-
162
- token = Doorkeeper::AccessToken.first
163
-
164
- expect(token.application_id).to eq @client.id
165
- expect(token.scopes).to be_empty
166
- should_have_json "access_token", token.token
167
- should_not_have_json "scope"
168
- end
169
- end
170
-
171
- context "when application scopes contain some of the default scopes and no scope is passed" do
172
- before do
173
- @client.update(scopes: "read write public")
174
- end
175
-
176
- it "issues new token with one default scope that are present in application scopes" do
177
- default_scopes_exist :public, :admin
178
-
179
- expect do
180
- post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
181
- end.to change { Doorkeeper::AccessToken.count }.by(1)
182
-
183
- token = Doorkeeper::AccessToken.first
184
-
185
- expect(token.application_id).to eq @client.id
186
- should_have_json "access_token", token.token
187
- should_have_json "scope", "public"
188
- end
189
-
190
- it "issues new token with multiple default scopes that are present in application scopes" do
191
- default_scopes_exist :public, :read, :update
192
-
193
- expect do
194
- post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
195
- end.to change { Doorkeeper::AccessToken.count }.by(1)
196
-
197
- token = Doorkeeper::AccessToken.first
198
-
199
- expect(token.application_id).to eq @client.id
200
- should_have_json "access_token", token.token
201
- should_have_json "scope", "public read"
202
- end
203
- end
204
-
205
- context "with invalid scopes" do
206
- subject do
207
- post password_token_endpoint_url(client: @client,
208
- resource_owner: @resource_owner,
209
- scope: "random")
210
- end
211
-
212
- it "should not issue new token" do
213
- expect { subject }.to_not(change { Doorkeeper::AccessToken.count })
214
- end
215
-
216
- it "should return invalid_scope error" do
217
- subject
218
- should_have_json "error", "invalid_scope"
219
- should_have_json "error_description", translated_error_message(:invalid_scope)
220
- should_not_have_json "access_token"
221
-
222
- expect(response.status).to eq(400)
223
- end
224
- end
225
-
226
- context "with invalid user credentials" do
227
- it "should not issue new token with bad password" do
228
- expect do
229
- post password_token_endpoint_url(client: @client,
230
- resource_owner_username: @resource_owner.name,
231
- resource_owner_password: "wrongpassword")
232
- end.to_not(change { Doorkeeper::AccessToken.count })
233
- end
234
-
235
- it "should not issue new token without credentials" do
236
- expect do
237
- post password_token_endpoint_url(client: @client)
238
- end.to_not(change { Doorkeeper::AccessToken.count })
239
- end
240
- end
241
-
242
- context "with invalid confidential client credentials" do
243
- it "should not issue new token with bad client credentials" do
244
- expect do
245
- post password_token_endpoint_url(client_id: @client.uid,
246
- client_secret: "bad_secret",
247
- resource_owner: @resource_owner)
248
- end.to_not(change { Doorkeeper::AccessToken.count })
249
- end
250
- end
251
-
252
- context "with invalid public client id" do
253
- it "should not issue new token with bad client id" do
254
- expect do
255
- post password_token_endpoint_url(client_id: "bad_id", resource_owner: @resource_owner)
256
- end.to_not(change { Doorkeeper::AccessToken.count })
257
- end
258
- end
259
- end