doorkeeper 3.1.0 → 5.6.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 (270) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +1079 -0
  3. data/README.md +114 -326
  4. data/app/assets/stylesheets/doorkeeper/admin/application.css +2 -2
  5. data/app/controllers/doorkeeper/application_controller.rb +7 -6
  6. data/app/controllers/doorkeeper/application_metal_controller.rb +9 -12
  7. data/app/controllers/doorkeeper/applications_controller.rb +66 -21
  8. data/app/controllers/doorkeeper/authorizations_controller.rb +100 -18
  9. data/app/controllers/doorkeeper/authorized_applications_controller.rb +23 -4
  10. data/app/controllers/doorkeeper/token_info_controller.rb +16 -4
  11. data/app/controllers/doorkeeper/tokens_controller.rb +138 -22
  12. data/app/helpers/doorkeeper/dashboard_helper.rb +15 -9
  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 +17 -11
  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 +37 -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 +602 -142
  30. data/lib/doorkeeper/engine.rb +22 -7
  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 +99 -16
  40. data/lib/doorkeeper/models/access_token_mixin.rb +386 -77
  41. data/lib/doorkeeper/models/application_mixin.rb +73 -30
  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/expiration_time_sql_math.rb +88 -0
  45. data/lib/doorkeeper/models/concerns/orderable.rb +15 -0
  46. data/lib/doorkeeper/models/concerns/ownership.rb +4 -2
  47. data/lib/doorkeeper/models/concerns/resource_ownerable.rb +47 -0
  48. data/lib/doorkeeper/models/concerns/reusable.rb +19 -0
  49. data/lib/doorkeeper/models/concerns/revocable.rb +13 -2
  50. data/lib/doorkeeper/models/concerns/scopes.rb +12 -2
  51. data/lib/doorkeeper/models/concerns/secret_storable.rb +106 -0
  52. data/lib/doorkeeper/oauth/authorization/code.rb +48 -12
  53. data/lib/doorkeeper/oauth/authorization/context.rb +17 -0
  54. data/lib/doorkeeper/oauth/authorization/token.rb +72 -28
  55. data/lib/doorkeeper/oauth/authorization/uri_builder.rb +22 -18
  56. data/lib/doorkeeper/oauth/authorization_code_request.rb +64 -14
  57. data/lib/doorkeeper/oauth/base_request.rb +66 -0
  58. data/lib/doorkeeper/oauth/base_response.rb +31 -0
  59. data/lib/doorkeeper/oauth/client/credentials.rb +23 -10
  60. data/lib/doorkeeper/oauth/client.rb +10 -12
  61. data/lib/doorkeeper/oauth/client_credentials/creator.rb +48 -4
  62. data/lib/doorkeeper/oauth/client_credentials/issuer.rb +17 -9
  63. data/lib/doorkeeper/oauth/client_credentials/validator.rb +55 -0
  64. data/lib/doorkeeper/oauth/client_credentials_request.rb +14 -15
  65. data/lib/doorkeeper/oauth/code_request.rb +8 -12
  66. data/lib/doorkeeper/oauth/code_response.rb +31 -19
  67. data/lib/doorkeeper/oauth/error.rb +5 -3
  68. data/lib/doorkeeper/oauth/error_response.rb +41 -20
  69. data/lib/doorkeeper/oauth/forbidden_token_response.rb +11 -3
  70. data/lib/doorkeeper/oauth/helpers/scope_checker.rb +24 -19
  71. data/lib/doorkeeper/oauth/helpers/unique_token.rb +20 -3
  72. data/lib/doorkeeper/oauth/helpers/uri_checker.rb +55 -4
  73. data/lib/doorkeeper/oauth/hooks/context.rb +21 -0
  74. data/lib/doorkeeper/oauth/invalid_request_response.rb +43 -0
  75. data/lib/doorkeeper/oauth/invalid_token_response.rb +31 -5
  76. data/lib/doorkeeper/oauth/nonstandard.rb +39 -0
  77. data/lib/doorkeeper/oauth/password_access_token_request.rb +46 -18
  78. data/lib/doorkeeper/oauth/pre_authorization.rb +135 -26
  79. data/lib/doorkeeper/oauth/refresh_token_request.rb +67 -30
  80. data/lib/doorkeeper/oauth/scopes.rb +26 -12
  81. data/lib/doorkeeper/oauth/token.rb +28 -25
  82. data/lib/doorkeeper/oauth/token_introspection.rb +202 -0
  83. data/lib/doorkeeper/oauth/token_request.rb +8 -21
  84. data/lib/doorkeeper/oauth/token_response.rb +14 -10
  85. data/lib/doorkeeper/oauth.rb +13 -0
  86. data/lib/doorkeeper/orm/active_record/access_grant.rb +6 -4
  87. data/lib/doorkeeper/orm/active_record/access_token.rb +5 -17
  88. data/lib/doorkeeper/orm/active_record/application.rb +6 -20
  89. data/lib/doorkeeper/orm/active_record/mixins/access_grant.rb +69 -0
  90. data/lib/doorkeeper/orm/active_record/mixins/access_token.rb +81 -0
  91. data/lib/doorkeeper/orm/active_record/mixins/application.rb +214 -0
  92. data/lib/doorkeeper/orm/active_record/redirect_uri_validator.rb +66 -0
  93. data/lib/doorkeeper/orm/active_record/stale_records_cleaner.rb +33 -0
  94. data/lib/doorkeeper/orm/active_record.rb +36 -26
  95. data/lib/doorkeeper/rails/helpers.rb +14 -15
  96. data/lib/doorkeeper/rails/routes/abstract_router.rb +35 -0
  97. data/lib/doorkeeper/rails/routes/mapper.rb +4 -2
  98. data/lib/doorkeeper/rails/routes/mapping.rb +10 -8
  99. data/lib/doorkeeper/rails/routes/registry.rb +45 -0
  100. data/lib/doorkeeper/rails/routes.rb +45 -28
  101. data/lib/doorkeeper/rake/db.rake +40 -0
  102. data/lib/doorkeeper/rake/setup.rake +6 -0
  103. data/lib/doorkeeper/rake.rb +14 -0
  104. data/lib/doorkeeper/request/authorization_code.rb +12 -4
  105. data/lib/doorkeeper/request/client_credentials.rb +3 -3
  106. data/lib/doorkeeper/request/code.rb +1 -1
  107. data/lib/doorkeeper/request/password.rb +5 -4
  108. data/lib/doorkeeper/request/refresh_token.rb +6 -5
  109. data/lib/doorkeeper/request/strategy.rb +4 -2
  110. data/lib/doorkeeper/request/token.rb +1 -1
  111. data/lib/doorkeeper/request.rb +62 -29
  112. data/lib/doorkeeper/secret_storing/base.rb +64 -0
  113. data/lib/doorkeeper/secret_storing/bcrypt.rb +60 -0
  114. data/lib/doorkeeper/secret_storing/plain.rb +33 -0
  115. data/lib/doorkeeper/secret_storing/sha256_hash.rb +26 -0
  116. data/lib/doorkeeper/server.rb +9 -19
  117. data/lib/doorkeeper/stale_records_cleaner.rb +24 -0
  118. data/lib/doorkeeper/validations.rb +5 -2
  119. data/lib/doorkeeper/version.rb +12 -1
  120. data/lib/doorkeeper.rb +112 -56
  121. data/lib/generators/doorkeeper/application_owner_generator.rb +28 -13
  122. data/lib/generators/doorkeeper/confidential_applications_generator.rb +33 -0
  123. data/lib/generators/doorkeeper/enable_polymorphic_resource_owner_generator.rb +39 -0
  124. data/lib/generators/doorkeeper/install_generator.rb +19 -9
  125. data/lib/generators/doorkeeper/migration_generator.rb +27 -10
  126. data/lib/generators/doorkeeper/pkce_generator.rb +33 -0
  127. data/lib/generators/doorkeeper/previous_refresh_token_generator.rb +41 -0
  128. data/lib/generators/doorkeeper/templates/add_confidential_to_applications.rb.erb +13 -0
  129. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb.erb +9 -0
  130. data/lib/generators/doorkeeper/templates/add_previous_refresh_token_to_access_tokens.rb.erb +13 -0
  131. data/lib/generators/doorkeeper/templates/enable_pkce_migration.rb.erb +8 -0
  132. data/lib/generators/doorkeeper/templates/enable_polymorphic_resource_owner_migration.rb.erb +17 -0
  133. data/lib/generators/doorkeeper/templates/initializer.rb +417 -32
  134. data/lib/generators/doorkeeper/templates/migration.rb.erb +88 -0
  135. data/lib/generators/doorkeeper/views_generator.rb +8 -4
  136. data/vendor/assets/stylesheets/doorkeeper/bootstrap.min.css +4 -5
  137. metadata +163 -280
  138. data/.gitignore +0 -14
  139. data/.hound.yml +0 -13
  140. data/.rspec +0 -1
  141. data/.travis.yml +0 -22
  142. data/CONTRIBUTING.md +0 -45
  143. data/Gemfile +0 -10
  144. data/NEWS.md +0 -525
  145. data/RELEASING.md +0 -17
  146. data/Rakefile +0 -20
  147. data/app/validators/redirect_uri_validator.rb +0 -34
  148. data/doorkeeper.gemspec +0 -27
  149. data/lib/doorkeeper/oauth/client/methods.rb +0 -18
  150. data/lib/doorkeeper/oauth/client_credentials/validation.rb +0 -45
  151. data/lib/doorkeeper/oauth/request_concern.rb +0 -48
  152. data/lib/generators/doorkeeper/application_scopes_generator.rb +0 -34
  153. data/lib/generators/doorkeeper/templates/add_owner_to_application_migration.rb +0 -7
  154. data/lib/generators/doorkeeper/templates/add_scopes_to_oauth_applications.rb +0 -5
  155. data/lib/generators/doorkeeper/templates/migration.rb +0 -50
  156. data/spec/controllers/applications_controller_spec.rb +0 -58
  157. data/spec/controllers/authorizations_controller_spec.rb +0 -203
  158. data/spec/controllers/protected_resources_controller_spec.rb +0 -271
  159. data/spec/controllers/token_info_controller_spec.rb +0 -52
  160. data/spec/controllers/tokens_controller_spec.rb +0 -88
  161. data/spec/dummy/Rakefile +0 -7
  162. data/spec/dummy/app/controllers/application_controller.rb +0 -3
  163. data/spec/dummy/app/controllers/custom_authorizations_controller.rb +0 -7
  164. data/spec/dummy/app/controllers/full_protected_resources_controller.rb +0 -12
  165. data/spec/dummy/app/controllers/home_controller.rb +0 -17
  166. data/spec/dummy/app/controllers/metal_controller.rb +0 -11
  167. data/spec/dummy/app/controllers/semi_protected_resources_controller.rb +0 -11
  168. data/spec/dummy/app/helpers/application_helper.rb +0 -5
  169. data/spec/dummy/app/models/user.rb +0 -9
  170. data/spec/dummy/app/views/home/index.html.erb +0 -0
  171. data/spec/dummy/app/views/layouts/application.html.erb +0 -14
  172. data/spec/dummy/config/application.rb +0 -57
  173. data/spec/dummy/config/boot.rb +0 -9
  174. data/spec/dummy/config/database.yml +0 -15
  175. data/spec/dummy/config/environment.rb +0 -5
  176. data/spec/dummy/config/environments/development.rb +0 -29
  177. data/spec/dummy/config/environments/production.rb +0 -62
  178. data/spec/dummy/config/environments/test.rb +0 -55
  179. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  180. data/spec/dummy/config/initializers/doorkeeper.rb +0 -96
  181. data/spec/dummy/config/initializers/secret_token.rb +0 -9
  182. data/spec/dummy/config/initializers/session_store.rb +0 -8
  183. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  184. data/spec/dummy/config/locales/doorkeeper.en.yml +0 -5
  185. data/spec/dummy/config/routes.rb +0 -52
  186. data/spec/dummy/config.ru +0 -4
  187. data/spec/dummy/db/migrate/20111122132257_create_users.rb +0 -9
  188. data/spec/dummy/db/migrate/20120312140401_add_password_to_users.rb +0 -5
  189. data/spec/dummy/db/migrate/20130902165751_create_doorkeeper_tables.rb +0 -41
  190. data/spec/dummy/db/migrate/20130902175349_add_owner_to_application.rb +0 -7
  191. data/spec/dummy/db/migrate/20141209001746_add_scopes_to_oauth_applications.rb +0 -5
  192. data/spec/dummy/db/schema.rb +0 -66
  193. data/spec/dummy/public/404.html +0 -26
  194. data/spec/dummy/public/422.html +0 -26
  195. data/spec/dummy/public/500.html +0 -26
  196. data/spec/dummy/public/favicon.ico +0 -0
  197. data/spec/dummy/script/rails +0 -6
  198. data/spec/factories.rb +0 -26
  199. data/spec/generators/application_owner_generator_spec.rb +0 -22
  200. data/spec/generators/install_generator_spec.rb +0 -31
  201. data/spec/generators/migration_generator_spec.rb +0 -20
  202. data/spec/generators/templates/routes.rb +0 -3
  203. data/spec/generators/views_generator_spec.rb +0 -27
  204. data/spec/helpers/doorkeeper/dashboard_helper_spec.rb +0 -24
  205. data/spec/lib/config_spec.rb +0 -317
  206. data/spec/lib/doorkeeper_spec.rb +0 -28
  207. data/spec/lib/models/expirable_spec.rb +0 -51
  208. data/spec/lib/models/revocable_spec.rb +0 -36
  209. data/spec/lib/models/scopes_spec.rb +0 -43
  210. data/spec/lib/oauth/authorization/uri_builder_spec.rb +0 -42
  211. data/spec/lib/oauth/authorization_code_request_spec.rb +0 -80
  212. data/spec/lib/oauth/client/credentials_spec.rb +0 -47
  213. data/spec/lib/oauth/client/methods_spec.rb +0 -54
  214. data/spec/lib/oauth/client_credentials/creator_spec.rb +0 -44
  215. data/spec/lib/oauth/client_credentials/issuer_spec.rb +0 -86
  216. data/spec/lib/oauth/client_credentials/validation_spec.rb +0 -54
  217. data/spec/lib/oauth/client_credentials_integration_spec.rb +0 -27
  218. data/spec/lib/oauth/client_credentials_request_spec.rb +0 -104
  219. data/spec/lib/oauth/client_spec.rb +0 -39
  220. data/spec/lib/oauth/code_request_spec.rb +0 -45
  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 -123
  231. data/spec/lib/oauth/scopes_spec.rb +0 -123
  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 -109
  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 -350
  239. data/spec/models/doorkeeper/application_spec.rb +0 -187
  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 -94
  250. data/spec/requests/flows/refresh_token_spec.rb +0 -104
  251. data/spec/requests/flows/revoke_token_spec.rb +0 -143
  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 -56
  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 -45
  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/orm/active_record.rb +0 -3
  268. data/spec/support/shared/controllers_shared_context.rb +0 -60
  269. data/spec/support/shared/models_shared_examples.rb +0 -52
  270. data/spec/validators/redirect_uri_validator_spec.rb +0 -78
@@ -1,104 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe 'Refresh Token Flow' do
4
- before do
5
- Doorkeeper.configure do
6
- orm DOORKEEPER_ORM
7
- use_refresh_token
8
- end
9
- client_exists
10
- end
11
-
12
- context 'issuing a refresh token' do
13
- before do
14
- authorization_code_exists application: @client
15
- end
16
-
17
- it 'client gets the refresh token and refreshses it' do
18
- post token_endpoint_url(code: @authorization.token, client: @client)
19
-
20
- token = Doorkeeper::AccessToken.first
21
-
22
- should_have_json 'access_token', token.token
23
- should_have_json 'refresh_token', token.refresh_token
24
-
25
- expect(@authorization.reload).to be_revoked
26
-
27
- post refresh_token_endpoint_url(client: @client, refresh_token: token.refresh_token)
28
-
29
- new_token = Doorkeeper::AccessToken.last
30
- should_have_json 'access_token', new_token.token
31
- should_have_json 'refresh_token', new_token.refresh_token
32
-
33
- expect(token.token).not_to eq(new_token.token)
34
- expect(token.refresh_token).not_to eq(new_token.refresh_token)
35
- end
36
- end
37
-
38
- context 'refreshing the token' do
39
- before do
40
- @token = FactoryGirl.create(:access_token, application: @client, resource_owner_id: 1, use_refresh_token: true)
41
- end
42
-
43
- it 'client request a token with refresh token' do
44
- post refresh_token_endpoint_url(client: @client, refresh_token: @token.refresh_token)
45
- should_have_json 'refresh_token', Doorkeeper::AccessToken.last.refresh_token
46
- expect(@token.reload).to be_revoked
47
- end
48
-
49
- it 'client request a token with expired access token' do
50
- @token.update_attribute :expires_in, -100
51
- post refresh_token_endpoint_url(client: @client, refresh_token: @token.refresh_token)
52
- should_have_json 'refresh_token', Doorkeeper::AccessToken.last.refresh_token
53
- expect(@token.reload).to be_revoked
54
- end
55
-
56
- it 'client gets an error for invalid refresh token' do
57
- post refresh_token_endpoint_url(client: @client, refresh_token: 'invalid')
58
- should_not_have_json 'refresh_token'
59
- should_have_json 'error', 'invalid_grant'
60
- end
61
-
62
- it 'client gets an error for revoked acccess token' do
63
- @token.revoke
64
- post refresh_token_endpoint_url(client: @client, refresh_token: @token.refresh_token)
65
- should_not_have_json 'refresh_token'
66
- should_have_json 'error', 'invalid_grant'
67
- end
68
-
69
- it 'second of simultaneous client requests get an error for revoked acccess token' do
70
- allow_any_instance_of(Doorkeeper::AccessToken).to receive(:revoked?).and_return(false, true)
71
- post refresh_token_endpoint_url(client: @client, refresh_token: @token.refresh_token)
72
-
73
- should_not_have_json 'refresh_token'
74
- should_have_json 'error', 'invalid_request'
75
- end
76
- end
77
-
78
- context 'refreshing the token with multiple sessions (devices)' do
79
- before do
80
- # enable password auth to simulate other devices
81
- config_is_set(:grant_flows, ["password"])
82
- config_is_set(:resource_owner_from_credentials) { User.authenticate! params[:username], params[:password] }
83
- create_resource_owner
84
- _another_token = post password_token_endpoint_url(client: @client, resource_owner: @resource_owner)
85
- last_token.update_attribute :created_at, 5.seconds.ago
86
-
87
- @token = FactoryGirl.create(:access_token, application: @client, resource_owner_id: @resource_owner.id, use_refresh_token: true)
88
- @token.update_attribute :expires_in, -100
89
- end
90
-
91
- it 'client request a token after creating another token with the same user' do
92
- post refresh_token_endpoint_url(client: @client, refresh_token: @token.refresh_token)
93
-
94
- should_have_json 'refresh_token', last_token.refresh_token
95
- expect(@token.reload).to be_revoked
96
- end
97
-
98
- def last_token
99
- Doorkeeper::AccessToken.last_authorized_token_for(
100
- @client.id, @resource_owner.id
101
- )
102
- end
103
- end
104
- end
@@ -1,143 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe 'Revoke Token Flow' do
4
- before do
5
- Doorkeeper.configure { orm DOORKEEPER_ORM }
6
- end
7
-
8
- context 'with default parameters' do
9
- let(:client_application) { FactoryGirl.create :application }
10
- let(:resource_owner) { User.create!(name: 'John', password: 'sekret') }
11
- let(:authorization_access_token) do
12
- FactoryGirl.create(:access_token,
13
- application: client_application,
14
- resource_owner_id: resource_owner.id,
15
- use_refresh_token: true)
16
- end
17
- let(:headers) { { 'HTTP_AUTHORIZATION' => "Bearer #{authorization_access_token.token}" } }
18
-
19
- context 'With invalid token to revoke' do
20
- it 'client wants to revoke the given access token' do
21
- post revocation_token_endpoint_url, { token: 'I_AM_AN_INVALIDE_TOKEN' }, headers
22
-
23
- authorization_access_token.reload
24
- # The authorization server responds with HTTP status code 200 if the token
25
- # has been revoked successfully or if the client submitted an invalid token.
26
- expect(response).to be_success
27
- expect(authorization_access_token).to_not be_revoked
28
- end
29
- end
30
-
31
- context 'The access token to revoke is the same than the authorization access token' do
32
- let(:token_to_revoke) { authorization_access_token }
33
-
34
- it 'client wants to revoke the given access token' do
35
- post revocation_token_endpoint_url, { token: token_to_revoke.token }, headers
36
-
37
- token_to_revoke.reload
38
- authorization_access_token.reload
39
-
40
- expect(response).to be_success
41
- expect(token_to_revoke.revoked?).to be_truthy
42
- expect(Doorkeeper::AccessToken.by_refresh_token(token_to_revoke.refresh_token).revoked?).to be_truthy
43
- end
44
-
45
- it 'client wants to revoke the given access token using the POST query string' do
46
- url_with_query_string = revocation_token_endpoint_url + '?' + Rack::Utils.build_query(token: token_to_revoke.token)
47
- post url_with_query_string, {}, headers
48
-
49
- token_to_revoke.reload
50
- authorization_access_token.reload
51
-
52
- expect(response).to be_success
53
- expect(token_to_revoke.revoked?).to be_falsey
54
- expect(Doorkeeper::AccessToken.by_refresh_token(token_to_revoke.refresh_token).revoked?).to be_falsey
55
- expect(authorization_access_token.revoked?).to be_falsey
56
- end
57
- end
58
-
59
- context 'The access token to revoke app and owners are the same than the authorization access token' do
60
- let(:token_to_revoke) do
61
- FactoryGirl.create(:access_token,
62
- application: client_application,
63
- resource_owner_id: resource_owner.id,
64
- use_refresh_token: true)
65
- end
66
-
67
- it 'client wants to revoke the given access token' do
68
- post revocation_token_endpoint_url, { token: token_to_revoke.token }, headers
69
-
70
- token_to_revoke.reload
71
- authorization_access_token.reload
72
-
73
- expect(response).to be_success
74
- expect(token_to_revoke.revoked?).to be_truthy
75
- expect(Doorkeeper::AccessToken.by_refresh_token(token_to_revoke.refresh_token).revoked?).to be_truthy
76
- expect(authorization_access_token.revoked?).to be_falsey
77
- end
78
- end
79
-
80
- context 'The access token to revoke authorization owner is the same than the authorization access token' do
81
- let(:other_client_application) { FactoryGirl.create :application }
82
- let(:token_to_revoke) do
83
- FactoryGirl.create(:access_token,
84
- application: other_client_application,
85
- resource_owner_id: resource_owner.id,
86
- use_refresh_token: true)
87
- end
88
-
89
- it 'client wants to revoke the given access token' do
90
- post revocation_token_endpoint_url, { token: token_to_revoke.token }, headers
91
-
92
- token_to_revoke.reload
93
- authorization_access_token.reload
94
-
95
- expect(response).to be_success
96
- expect(token_to_revoke.revoked?).to be_falsey
97
- expect(Doorkeeper::AccessToken.by_refresh_token(token_to_revoke.refresh_token).revoked?).to be_falsey
98
- expect(authorization_access_token.revoked?).to be_falsey
99
- end
100
- end
101
-
102
- context 'The access token to revoke app is the same than the authorization access token' do
103
- let(:other_resource_owner) { User.create!(name: 'Matheo', password: 'pareto') }
104
- let(:token_to_revoke) do
105
- FactoryGirl.create(:access_token,
106
- application: client_application,
107
- resource_owner_id: other_resource_owner.id,
108
- use_refresh_token: true)
109
- end
110
-
111
- it 'client wants to revoke the given access token' do
112
- post revocation_token_endpoint_url, { token: token_to_revoke.token }, headers
113
-
114
- token_to_revoke.reload
115
- authorization_access_token.reload
116
-
117
- expect(response).to be_success
118
- expect(token_to_revoke.revoked?).to be_falsey
119
- expect(Doorkeeper::AccessToken.by_refresh_token(token_to_revoke.refresh_token).revoked?).to be_falsey
120
- expect(authorization_access_token.revoked?).to be_falsey
121
- end
122
- end
123
-
124
- context 'With valid refresh token to revoke' do
125
- let(:token_to_revoke) do
126
- FactoryGirl.create(:access_token,
127
- application: client_application,
128
- resource_owner_id: resource_owner.id,
129
- use_refresh_token: true)
130
- end
131
-
132
- it 'client wants to revoke the given refresh token' do
133
- post revocation_token_endpoint_url, { token: token_to_revoke.refresh_token, token_type_hint: 'refresh_token' }, headers
134
- authorization_access_token.reload
135
- token_to_revoke.reload
136
-
137
- expect(response).to be_success
138
- expect(Doorkeeper::AccessToken.by_refresh_token(token_to_revoke.refresh_token).revoked?).to be_truthy
139
- expect(authorization_access_token).to_not be_revoked
140
- end
141
- end
142
- end
143
- end
@@ -1,59 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- feature 'Skip authorization form' do
4
- background do
5
- config_is_set(:authenticate_resource_owner) { User.first || redirect_to('/sign_in') }
6
- client_exists
7
- default_scopes_exist :public
8
- optional_scopes_exist :write
9
- end
10
-
11
- context 'for previously authorized clients' do
12
- background do
13
- create_resource_owner
14
- sign_in
15
- end
16
-
17
- scenario 'skips the authorization and return a new grant code' do
18
- client_is_authorized(@client, @resource_owner, scopes: 'public')
19
- visit authorization_endpoint_url(client: @client)
20
-
21
- i_should_not_see 'Authorize'
22
- client_should_be_authorized @client
23
- i_should_be_on_client_callback @client
24
- url_should_have_param 'code', Doorkeeper::AccessGrant.first.token
25
- end
26
-
27
- scenario 'does not skip authorization when scopes differ (new request has fewer scopes)' do
28
- client_is_authorized(@client, @resource_owner, scopes: 'public write')
29
- visit authorization_endpoint_url(client: @client, scope: 'public')
30
- i_should_see 'Authorize'
31
- end
32
-
33
- scenario 'does not skip authorization when scopes differ (new request has more scopes)' do
34
- client_is_authorized(@client, @resource_owner, scopes: 'public write')
35
- visit authorization_endpoint_url(client: @client, scopes: 'public write email')
36
- i_should_see 'Authorize'
37
- end
38
-
39
- scenario 'creates grant with new scope when scopes differ' do
40
- client_is_authorized(@client, @resource_owner, scopes: 'public write')
41
- visit authorization_endpoint_url(client: @client, scope: 'public')
42
- click_on 'Authorize'
43
- access_grant_should_have_scopes :public
44
- end
45
-
46
- scenario 'doesn not skip authorization when scopes are greater' do
47
- client_is_authorized(@client, @resource_owner, scopes: 'public')
48
- visit authorization_endpoint_url(client: @client, scope: 'public write')
49
- i_should_see 'Authorize'
50
- end
51
-
52
- scenario 'creates grant with new scope when scopes are greater' do
53
- client_is_authorized(@client, @resource_owner, scopes: 'public')
54
- visit authorization_endpoint_url(client: @client, scope: 'public write')
55
- click_on 'Authorize'
56
- access_grant_should_have_scopes :public, :write
57
- end
58
- end
59
- end
@@ -1,14 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe 'ActionController::Metal API' do
4
- before do
5
- @client = FactoryGirl.create(:application)
6
- @resource = User.create!(name: 'Joe', password: 'sekret')
7
- @token = client_is_authorized(@client, @resource)
8
- end
9
-
10
- it 'client requests protected resource with valid token' do
11
- get "/metal.json?access_token=#{@token.token}"
12
- should_have_json 'ok', true
13
- end
14
- end
@@ -1,81 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- feature 'Private API' do
4
- background do
5
- @client = FactoryGirl.create(:application)
6
- @resource = User.create!(name: 'Joe', password: 'sekret')
7
- @token = client_is_authorized(@client, @resource)
8
- end
9
-
10
- scenario 'client requests protected resource with valid token' do
11
- with_access_token_header @token.token
12
- visit '/full_protected_resources'
13
- expect(page.body).to have_content('index')
14
- end
15
-
16
- scenario 'client requests protected resource with disabled header authentication' do
17
- config_is_set :access_token_methods, [:from_access_token_param]
18
- with_access_token_header @token.token
19
- visit '/full_protected_resources'
20
- response_status_should_be 401
21
- end
22
-
23
- scenario 'client attempts to request protected resource with invalid token' do
24
- with_access_token_header 'invalid'
25
- visit '/full_protected_resources'
26
- response_status_should_be 401
27
- end
28
-
29
- scenario 'client attempts to request protected resource with expired token' do
30
- @token.update_attribute :expires_in, -100 # expires token
31
- with_access_token_header @token.token
32
- visit '/full_protected_resources'
33
- response_status_should_be 401
34
- end
35
-
36
- scenario 'client requests protected resource with permanent token' do
37
- @token.update_attribute :expires_in, nil # never expires
38
- with_access_token_header @token.token
39
- visit '/full_protected_resources'
40
- expect(page.body).to have_content('index')
41
- end
42
-
43
- scenario 'access token with no default scopes' do
44
- Doorkeeper.configuration.instance_eval {
45
- @default_scopes = Doorkeeper::OAuth::Scopes.from_array([:public])
46
- @scopes = default_scopes + optional_scopes
47
- }
48
- @token.update_attribute :scopes, 'dummy'
49
- with_access_token_header @token.token
50
- visit '/full_protected_resources'
51
- response_status_should_be 403
52
- end
53
-
54
- scenario 'access token with no allowed scopes' do
55
- @token.update_attribute :scopes, nil
56
- with_access_token_header @token.token
57
- visit '/full_protected_resources/1.json'
58
- response_status_should_be 403
59
- end
60
-
61
- scenario 'access token with one of allowed scopes' do
62
- @token.update_attribute :scopes, 'admin'
63
- with_access_token_header @token.token
64
- visit '/full_protected_resources/1.json'
65
- expect(page.body).to have_content('show')
66
- end
67
-
68
- scenario 'access token with another of allowed scopes' do
69
- @token.update_attribute :scopes, 'write'
70
- with_access_token_header @token.token
71
- visit '/full_protected_resources/1.json'
72
- expect(page.body).to have_content('show')
73
- end
74
-
75
- scenario 'access token with both allowed scopes' do
76
- @token.update_attribute :scopes, 'write admin'
77
- with_access_token_header @token.token
78
- visit '/full_protected_resources/1.json'
79
- expect(page.body).to have_content('show')
80
- end
81
- end
@@ -1,71 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe 'Custom controller for routes' do
4
- it 'GET /space/scope/authorize routes to custom authorizations controller' do
5
- expect(get('/inner_space/scope/authorize')).to route_to('custom_authorizations#new')
6
- end
7
-
8
- it 'POST /space/scope/authorize routes to custom authorizations controller' do
9
- expect(post('/inner_space/scope/authorize')).to route_to('custom_authorizations#create')
10
- end
11
-
12
- it 'DELETE /space/scope/authorize routes to custom authorizations controller' do
13
- expect(delete('/inner_space/scope/authorize')).to route_to('custom_authorizations#destroy')
14
- end
15
-
16
- it 'POST /space/scope/token routes to tokens controller' do
17
- expect(post('/inner_space/scope/token')).to route_to('custom_authorizations#create')
18
- end
19
-
20
- it 'GET /space/scope/applications routes to applications controller' do
21
- expect(get('/inner_space/scope/applications')).to route_to('custom_authorizations#index')
22
- end
23
-
24
- it 'GET /space/scope/token/info routes to the token_info controller' do
25
- expect(get('/inner_space/scope/token/info')).to route_to('custom_authorizations#show')
26
- end
27
-
28
- it 'GET /space/oauth/authorize routes to custom authorizations controller' do
29
- expect(get('/space/oauth/authorize')).to route_to('custom_authorizations#new')
30
- end
31
-
32
- it 'POST /space/oauth/authorize routes to custom authorizations controller' do
33
- expect(post('/space/oauth/authorize')).to route_to('custom_authorizations#create')
34
- end
35
-
36
- it 'DELETE /space/oauth/authorize routes to custom authorizations controller' do
37
- expect(delete('/space/oauth/authorize')).to route_to('custom_authorizations#destroy')
38
- end
39
-
40
- it 'POST /space/oauth/token routes to tokens controller' do
41
- expect(post('/space/oauth/token')).to route_to('custom_authorizations#create')
42
- end
43
-
44
- it 'POST /space/oauth/revoke routes to tokens controller' do
45
- expect(post('/space/oauth/revoke')).to route_to('custom_authorizations#revoke')
46
- end
47
-
48
- it 'GET /space/oauth/applications routes to applications controller' do
49
- expect(get('/space/oauth/applications')).to route_to('custom_authorizations#index')
50
- end
51
-
52
- it 'GET /space/oauth/token/info routes to the token_info controller' do
53
- expect(get('/space/oauth/token/info')).to route_to('custom_authorizations#show')
54
- end
55
-
56
- it 'POST /outer_space/oauth/token is not be routable' do
57
- expect(post('/outer_space/oauth/token')).not_to be_routable
58
- end
59
-
60
- it 'GET /outer_space/oauth/authorize routes to custom authorizations controller' do
61
- expect(get('/outer_space/oauth/authorize')).to be_routable
62
- end
63
-
64
- it 'GET /outer_space/oauth/applications is not routable' do
65
- expect(get('/outer_space/oauth/applications')).not_to be_routable
66
- end
67
-
68
- it 'GET /outer_space/oauth/token_info is not routable' do
69
- expect(get('/outer_space/oauth/token/info')).not_to be_routable
70
- end
71
- end
@@ -1,35 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe 'Default routes' do
4
- it 'GET /oauth/authorize routes to authorizations controller' do
5
- expect(get('/oauth/authorize')).to route_to('doorkeeper/authorizations#new')
6
- end
7
-
8
- it 'POST /oauth/authorize routes to authorizations controller' do
9
- expect(post('/oauth/authorize')).to route_to('doorkeeper/authorizations#create')
10
- end
11
-
12
- it 'DELETE /oauth/authorize routes to authorizations controller' do
13
- expect(delete('/oauth/authorize')).to route_to('doorkeeper/authorizations#destroy')
14
- end
15
-
16
- it 'POST /oauth/token routes to tokens controller' do
17
- expect(post('/oauth/token')).to route_to('doorkeeper/tokens#create')
18
- end
19
-
20
- it 'POST /oauth/revoke routes to tokens controller' do
21
- expect(post('/oauth/revoke')).to route_to('doorkeeper/tokens#revoke')
22
- end
23
-
24
- it 'GET /oauth/applications routes to applications controller' do
25
- expect(get('/oauth/applications')).to route_to('doorkeeper/applications#index')
26
- end
27
-
28
- it 'GET /oauth/authorized_applications routes to authorized applications controller' do
29
- expect(get('/oauth/authorized_applications')).to route_to('doorkeeper/authorized_applications#index')
30
- end
31
-
32
- it 'GET /oauth/token/info route to authorzed tokeninfo controller' do
33
- expect(get('/oauth/token/info')).to route_to('doorkeeper/token_info#show')
34
- end
35
- end
@@ -1,31 +0,0 @@
1
- require 'spec_helper_integration'
2
-
3
- describe 'Scoped routes' do
4
- it 'GET /scope/authorize routes to authorizations controller' do
5
- expect(get('/scope/authorize')).to route_to('doorkeeper/authorizations#new')
6
- end
7
-
8
- it 'POST /scope/authorize routes to authorizations controller' do
9
- expect(post('/scope/authorize')).to route_to('doorkeeper/authorizations#create')
10
- end
11
-
12
- it 'DELETE /scope/authorize routes to authorizations controller' do
13
- expect(delete('/scope/authorize')).to route_to('doorkeeper/authorizations#destroy')
14
- end
15
-
16
- it 'POST /scope/token routes to tokens controller' do
17
- expect(post('/scope/token')).to route_to('doorkeeper/tokens#create')
18
- end
19
-
20
- it 'GET /scope/applications routes to applications controller' do
21
- expect(get('/scope/applications')).to route_to('doorkeeper/applications#index')
22
- end
23
-
24
- it 'GET /scope/authorized_applications routes to authorized applications controller' do
25
- expect(get('/scope/authorized_applications')).to route_to('doorkeeper/authorized_applications#index')
26
- end
27
-
28
- it 'GET /scope/token/info route to authorzed tokeninfo controller' do
29
- expect(get('/scope/token/info')).to route_to('doorkeeper/token_info#show')
30
- end
31
- end
data/spec/spec_helper.rb DELETED
@@ -1,2 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '../lib'))
2
- $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), '../app'))
@@ -1,56 +0,0 @@
1
- ENV['RAILS_ENV'] ||= 'test'
2
- TABLE_NAME_PREFIX = ENV['table_name_prefix'] || nil
3
- TABLE_NAME_SUFFIX = ENV['table_name_suffix'] || nil
4
-
5
- orm = (ENV['BUNDLE_GEMFILE'] || '').match(/Gemfile\.(.+)\.rb/)
6
- DOORKEEPER_ORM = (orm && orm[1] || :active_record).to_sym
7
-
8
- $LOAD_PATH.unshift File.dirname(__FILE__)
9
-
10
- require 'capybara/rspec'
11
- require 'dummy/config/environment'
12
- require 'rspec/rails'
13
- require 'generator_spec/test_case'
14
- require 'timecop'
15
- require 'database_cleaner'
16
-
17
- # Load JRuby SQLite3 if in that platform
18
- begin
19
- require 'jdbc/sqlite3'
20
- Jdbc::SQLite3.load_driver
21
- rescue LoadError
22
- end
23
-
24
- Rails.logger.info "====> Doorkeeper.orm = #{Doorkeeper.configuration.orm.inspect}"
25
- if Doorkeeper.configuration.orm == :active_record
26
- Rails.logger.info "======> active_record.table_name_prefix = #{Rails.configuration.active_record.table_name_prefix.inspect}"
27
- Rails.logger.info "======> active_record.table_name_suffix = #{Rails.configuration.active_record.table_name_suffix.inspect}"
28
- end
29
- Rails.logger.info "====> Rails version: #{Rails.version}"
30
- Rails.logger.info "====> Ruby version: #{RUBY_VERSION}"
31
-
32
- require "support/orm/#{DOORKEEPER_ORM}"
33
-
34
- ENGINE_RAILS_ROOT = File.join(File.dirname(__FILE__), '../')
35
-
36
- Dir["#{File.dirname(__FILE__)}/support/{dependencies,helpers,shared}/*.rb"].each { |f| require f }
37
-
38
- RSpec.configure do |config|
39
- config.infer_spec_type_from_file_location!
40
- config.mock_with :rspec
41
-
42
- config.infer_base_class_for_anonymous_controllers = false
43
-
44
- config.include RSpec::Rails::RequestExampleGroup, type: :request
45
-
46
- config.before do
47
- DatabaseCleaner.start
48
- Doorkeeper.configure { orm DOORKEEPER_ORM }
49
- end
50
-
51
- config.after do
52
- DatabaseCleaner.clean
53
- end
54
-
55
- config.order = 'random'
56
- end
@@ -1,2 +0,0 @@
1
- require 'factory_girl'
2
- FactoryGirl.find_definitions
@@ -1,11 +0,0 @@
1
- module AccessTokenRequestHelper
2
- def client_is_authorized(client, resource_owner, access_token_attributes = {})
3
- attributes = {
4
- application: client,
5
- resource_owner_id: resource_owner.id
6
- }.merge(access_token_attributes)
7
- FactoryGirl.create(:access_token, attributes)
8
- end
9
- end
10
-
11
- RSpec.configuration.send :include, AccessTokenRequestHelper
@@ -1,41 +0,0 @@
1
- module AuthorizationRequestHelper
2
- def resource_owner_is_authenticated(resource_owner = nil)
3
- resource_owner ||= User.create!(name: 'Joe', password: 'sekret')
4
- Doorkeeper.configuration.instance_variable_set(:@authenticate_resource_owner, proc { resource_owner })
5
- end
6
-
7
- def resource_owner_is_not_authenticated
8
- Doorkeeper.configuration.instance_variable_set(:@authenticate_resource_owner, proc { redirect_to('/sign_in') })
9
- end
10
-
11
- def default_scopes_exist(*scopes)
12
- Doorkeeper.configuration.instance_variable_set(:@default_scopes, Doorkeeper::OAuth::Scopes.from_array(scopes))
13
- end
14
-
15
- def optional_scopes_exist(*scopes)
16
- Doorkeeper.configuration.instance_variable_set(:@optional_scopes, Doorkeeper::OAuth::Scopes.from_array(scopes))
17
- end
18
-
19
- def client_should_be_authorized(client)
20
- expect(client.access_grants.size).to eq(1)
21
- end
22
-
23
- def client_should_not_be_authorized(client)
24
- expect(client.size).to eq(0)
25
- end
26
-
27
- def i_should_be_on_client_callback(client)
28
- expect(client.redirect_uri).to eq("#{current_uri.scheme}://#{current_uri.host}#{current_uri.path}")
29
- end
30
-
31
- def allowing_forgery_protection(&block)
32
- _original_value = ActionController::Base.allow_forgery_protection
33
- ActionController::Base.allow_forgery_protection = true
34
-
35
- block.call
36
- ensure
37
- ActionController::Base.allow_forgery_protection = _original_value
38
- end
39
- end
40
-
41
- RSpec.configuration.send :include, AuthorizationRequestHelper
@@ -1,9 +0,0 @@
1
- module ConfigHelper
2
- def config_is_set(setting, value = nil, &block)
3
- setting_ivar = "@#{setting}"
4
- value = block_given? ? block : value
5
- Doorkeeper.configuration.instance_variable_set(setting_ivar, value)
6
- end
7
- end
8
-
9
- RSpec.configuration.send :include, ConfigHelper