devise_token_auth_multitenancy 1.1.3.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (175) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +103 -0
  4. data/Rakefile +42 -0
  5. data/app/controllers/devise_token_auth/application_controller.rb +79 -0
  6. data/app/controllers/devise_token_auth/concerns/resource_finder.rb +44 -0
  7. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +162 -0
  8. data/app/controllers/devise_token_auth/confirmations_controller.rb +82 -0
  9. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +287 -0
  10. data/app/controllers/devise_token_auth/passwords_controller.rb +206 -0
  11. data/app/controllers/devise_token_auth/registrations_controller.rb +205 -0
  12. data/app/controllers/devise_token_auth/sessions_controller.rb +131 -0
  13. data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
  14. data/app/controllers/devise_token_auth/unlocks_controller.rb +89 -0
  15. data/app/models/devise_token_auth/concerns/active_record_support.rb +16 -0
  16. data/app/models/devise_token_auth/concerns/confirmable_support.rb +27 -0
  17. data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
  18. data/app/models/devise_token_auth/concerns/tokens_serialization.rb +19 -0
  19. data/app/models/devise_token_auth/concerns/user.rb +257 -0
  20. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +28 -0
  21. data/app/validators/devise_token_auth_email_validator.rb +23 -0
  22. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  23. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  24. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  25. data/app/views/devise_token_auth/omniauth_external_window.html.erb +38 -0
  26. data/config/locales/da-DK.yml +52 -0
  27. data/config/locales/de.yml +51 -0
  28. data/config/locales/en.yml +57 -0
  29. data/config/locales/es.yml +51 -0
  30. data/config/locales/fr.yml +51 -0
  31. data/config/locales/he.yml +52 -0
  32. data/config/locales/it.yml +48 -0
  33. data/config/locales/ja.yml +48 -0
  34. data/config/locales/ko.yml +51 -0
  35. data/config/locales/nl.yml +32 -0
  36. data/config/locales/pl.yml +51 -0
  37. data/config/locales/pt-BR.yml +48 -0
  38. data/config/locales/pt.yml +51 -0
  39. data/config/locales/ro.yml +48 -0
  40. data/config/locales/ru.yml +52 -0
  41. data/config/locales/sq.yml +48 -0
  42. data/config/locales/sv.yml +52 -0
  43. data/config/locales/uk.yml +61 -0
  44. data/config/locales/vi.yml +52 -0
  45. data/config/locales/zh-CN.yml +48 -0
  46. data/config/locales/zh-HK.yml +50 -0
  47. data/config/locales/zh-TW.yml +50 -0
  48. data/lib/devise_token_auth/blacklist.rb +2 -0
  49. data/lib/devise_token_auth/controllers/helpers.rb +161 -0
  50. data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
  51. data/lib/devise_token_auth/engine.rb +96 -0
  52. data/lib/devise_token_auth/errors.rb +8 -0
  53. data/lib/devise_token_auth/rails/routes.rb +116 -0
  54. data/lib/devise_token_auth/token_factory.rb +126 -0
  55. data/lib/devise_token_auth/url.rb +44 -0
  56. data/lib/devise_token_auth/version.rb +5 -0
  57. data/lib/devise_token_auth.rb +14 -0
  58. data/lib/generators/devise_token_auth/USAGE +31 -0
  59. data/lib/generators/devise_token_auth/install_generator.rb +91 -0
  60. data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
  61. data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
  62. data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
  63. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +60 -0
  64. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +49 -0
  65. data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
  66. data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +56 -0
  67. data/lib/tasks/devise_token_auth_tasks.rake +6 -0
  68. data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
  69. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
  70. data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
  71. data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
  72. data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
  73. data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
  74. data/test/controllers/demo_group_controller_test.rb +151 -0
  75. data/test/controllers/demo_mang_controller_test.rb +284 -0
  76. data/test/controllers/demo_user_controller_test.rb +629 -0
  77. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +191 -0
  78. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +441 -0
  79. data/test/controllers/devise_token_auth/passwords_controller_test.rb +780 -0
  80. data/test/controllers/devise_token_auth/registrations_controller_test.rb +907 -0
  81. data/test/controllers/devise_token_auth/sessions_controller_test.rb +503 -0
  82. data/test/controllers/devise_token_auth/token_validations_controller_test.rb +102 -0
  83. data/test/controllers/devise_token_auth/unlocks_controller_test.rb +196 -0
  84. data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
  85. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
  86. data/test/controllers/overrides/passwords_controller_test.rb +64 -0
  87. data/test/controllers/overrides/registrations_controller_test.rb +46 -0
  88. data/test/controllers/overrides/sessions_controller_test.rb +35 -0
  89. data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
  90. data/test/dummy/README.rdoc +28 -0
  91. data/test/dummy/app/active_record/confirmable_user.rb +11 -0
  92. data/test/dummy/app/active_record/lockable_user.rb +7 -0
  93. data/test/dummy/app/active_record/mang.rb +5 -0
  94. data/test/dummy/app/active_record/only_email_user.rb +7 -0
  95. data/test/dummy/app/active_record/scoped_user.rb +9 -0
  96. data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
  97. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  98. data/test/dummy/app/active_record/user.rb +6 -0
  99. data/test/dummy/app/controllers/application_controller.rb +18 -0
  100. data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
  101. data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
  102. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
  103. data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
  104. data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
  105. data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
  106. data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
  107. data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
  108. data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
  109. data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
  110. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +28 -0
  111. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
  112. data/test/dummy/app/controllers/overrides/passwords_controller.rb +35 -0
  113. data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
  114. data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
  115. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
  116. data/test/dummy/app/helpers/application_helper.rb +1058 -0
  117. data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
  118. data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
  119. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  120. data/test/dummy/app/mongoid/mang.rb +46 -0
  121. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  122. data/test/dummy/app/mongoid/scoped_user.rb +50 -0
  123. data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
  124. data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
  125. data/test/dummy/app/mongoid/user.rb +49 -0
  126. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  127. data/test/dummy/config/application.rb +48 -0
  128. data/test/dummy/config/application.yml.bk +0 -0
  129. data/test/dummy/config/boot.rb +11 -0
  130. data/test/dummy/config/environment.rb +7 -0
  131. data/test/dummy/config/environments/development.rb +46 -0
  132. data/test/dummy/config/environments/production.rb +84 -0
  133. data/test/dummy/config/environments/test.rb +50 -0
  134. data/test/dummy/config/initializers/assets.rb +10 -0
  135. data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
  136. data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
  137. data/test/dummy/config/initializers/devise.rb +290 -0
  138. data/test/dummy/config/initializers/devise_token_auth.rb +55 -0
  139. data/test/dummy/config/initializers/figaro.rb +3 -0
  140. data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
  141. data/test/dummy/config/initializers/inflections.rb +18 -0
  142. data/test/dummy/config/initializers/mime_types.rb +6 -0
  143. data/test/dummy/config/initializers/omniauth.rb +11 -0
  144. data/test/dummy/config/initializers/session_store.rb +5 -0
  145. data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
  146. data/test/dummy/config/routes.rb +57 -0
  147. data/test/dummy/config/spring.rb +3 -0
  148. data/test/dummy/config.ru +18 -0
  149. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +58 -0
  150. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +57 -0
  151. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
  152. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
  153. data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +55 -0
  154. data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +56 -0
  155. data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +56 -0
  156. data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +56 -0
  157. data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +56 -0
  158. data/test/dummy/db/migrate/20190924101113_devise_token_auth_create_confirmable_users.rb +49 -0
  159. data/test/dummy/db/schema.rb +198 -0
  160. data/test/dummy/lib/migration_database_helper.rb +43 -0
  161. data/test/factories/users.rb +41 -0
  162. data/test/lib/devise_token_auth/blacklist_test.rb +11 -0
  163. data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
  164. data/test/lib/devise_token_auth/url_test.rb +26 -0
  165. data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
  166. data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
  167. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
  168. data/test/models/concerns/mongoid_support_test.rb +31 -0
  169. data/test/models/concerns/tokens_serialization_test.rb +70 -0
  170. data/test/models/confirmable_user_test.rb +35 -0
  171. data/test/models/only_email_user_test.rb +29 -0
  172. data/test/models/user_test.rb +108 -0
  173. data/test/support/controllers/routes.rb +43 -0
  174. data/test/test_helper.rb +103 -0
  175. metadata +483 -0
@@ -0,0 +1,629 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ # was the web request successful?
6
+ # was the user redirected to the right page?
7
+ # was the user successfully authenticated?
8
+ # was the correct object stored in the response?
9
+ # was the appropriate message delivered in the json payload?
10
+
11
+ class DemoUserControllerTest < ActionDispatch::IntegrationTest
12
+ include Warden::Test::Helpers
13
+ describe DemoUserController do
14
+ describe 'Token access' do
15
+ before do
16
+ @resource = create(:user, :confirmed)
17
+
18
+ @auth_headers = @resource.create_new_auth_token
19
+
20
+ @token = @auth_headers['access-token']
21
+ @client_id = @auth_headers['client']
22
+ @expiry = @auth_headers['expiry']
23
+ end
24
+
25
+ describe 'successful request' do
26
+ before do
27
+ # ensure that request is not treated as batch request
28
+ age_token(@resource, @client_id)
29
+
30
+ get '/demo/members_only',
31
+ params: {},
32
+ headers: @auth_headers
33
+
34
+ @resp_token = response.headers['access-token']
35
+ @resp_client_id = response.headers['client']
36
+ @resp_expiry = response.headers['expiry']
37
+ @resp_uid = response.headers['uid']
38
+ end
39
+
40
+ describe 'devise mappings' do
41
+ it 'should define current_user' do
42
+ assert_equal @resource, @controller.current_user
43
+ end
44
+
45
+ it 'should define user_signed_in?' do
46
+ assert @controller.user_signed_in?
47
+ end
48
+
49
+ it 'should not define current_mang' do
50
+ refute_equal @resource, @controller.current_mang
51
+ end
52
+
53
+ it 'should define render_authenticate_error' do
54
+ assert @controller.methods.include?(:render_authenticate_error)
55
+ end
56
+ end
57
+
58
+ it 'should return success status' do
59
+ assert_equal 200, response.status
60
+ end
61
+
62
+ it 'should receive new token after successful request' do
63
+ refute_equal @token, @resp_token
64
+ end
65
+
66
+ it 'should preserve the client id from the first request' do
67
+ assert_equal @client_id, @resp_client_id
68
+ end
69
+
70
+ it "should return the user's uid in the auth header" do
71
+ assert_equal @resource.uid, @resp_uid
72
+ end
73
+
74
+ it 'should not treat this request as a batch request' do
75
+ refute assigns(:is_batch_request)
76
+ end
77
+
78
+ describe 'subsequent requests' do
79
+ before do
80
+ @resource.reload
81
+ # ensure that request is not treated as batch request
82
+ age_token(@resource, @client_id)
83
+
84
+ get '/demo/members_only',
85
+ params: {},
86
+ headers: @auth_headers.merge('access-token' => @resp_token)
87
+ end
88
+
89
+ it 'should not treat this request as a batch request' do
90
+ refute assigns(:is_batch_request)
91
+ end
92
+
93
+ it 'should allow a new request to be made using new token' do
94
+ assert_equal 200, response.status
95
+ end
96
+ end
97
+ end
98
+
99
+ describe 'failed request' do
100
+ before do
101
+ get '/demo/members_only',
102
+ params: {},
103
+ headers: @auth_headers.merge('access-token' => 'bogus')
104
+ end
105
+
106
+ it 'should not return any auth headers' do
107
+ refute response.headers['access-token']
108
+ end
109
+
110
+ it 'should return error: unauthorized status' do
111
+ assert_equal 401, response.status
112
+ end
113
+ end
114
+
115
+ describe 'disable change_headers_on_each_request' do
116
+ before do
117
+ DeviseTokenAuth.change_headers_on_each_request = false
118
+ @resource.reload
119
+ age_token(@resource, @client_id)
120
+
121
+ get '/demo/members_only',
122
+ params: {},
123
+ headers: @auth_headers
124
+
125
+ @first_is_batch_request = assigns(:is_batch_request)
126
+ @first_user = assigns(:resource).dup
127
+ @first_access_token = response.headers['access-token']
128
+ @first_response_status = response.status
129
+
130
+ @resource.reload
131
+ age_token(@resource, @client_id)
132
+
133
+ # use expired auth header
134
+ get '/demo/members_only',
135
+ params: {},
136
+ headers: @auth_headers
137
+
138
+ @second_is_batch_request = assigns(:is_batch_request)
139
+ @second_user = assigns(:resource).dup
140
+ @second_access_token = response.headers['access-token']
141
+ @second_response_status = response.status
142
+ end
143
+
144
+ after do
145
+ DeviseTokenAuth.change_headers_on_each_request = true
146
+ end
147
+
148
+ it 'should allow the first request through' do
149
+ assert_equal 200, @first_response_status
150
+ end
151
+
152
+ it 'should allow the second request through' do
153
+ assert_equal 200, @second_response_status
154
+ end
155
+
156
+ it 'should return auth headers from the first request' do
157
+ assert @first_access_token
158
+ end
159
+
160
+ it 'should not treat either requests as batch requests' do
161
+ refute @first_is_batch_request
162
+ refute @second_is_batch_request
163
+ end
164
+
165
+ it 'should return auth headers from the second request' do
166
+ assert @second_access_token
167
+ end
168
+
169
+ it 'should define user during first request' do
170
+ assert @first_user
171
+ end
172
+
173
+ it 'should define user during second request' do
174
+ assert @second_user
175
+ end
176
+ end
177
+
178
+ describe 'batch requests' do
179
+ describe 'success' do
180
+ before do
181
+ age_token(@resource, @client_id)
182
+ # request.headers.merge!(@auth_headers)
183
+
184
+ get '/demo/members_only',
185
+ params: {},
186
+ headers: @auth_headers
187
+
188
+ @first_is_batch_request = assigns(:is_batch_request)
189
+ @first_user = assigns(:resource)
190
+ @first_access_token = response.headers['access-token']
191
+
192
+ get '/demo/members_only',
193
+ params: {},
194
+ headers: @auth_headers
195
+
196
+ @second_is_batch_request = assigns(:is_batch_request)
197
+ @second_user = assigns(:resource)
198
+ @second_access_token = response.headers['access-token']
199
+ end
200
+
201
+ it 'should allow both requests through' do
202
+ assert_equal 200, response.status
203
+ end
204
+
205
+ it 'should not treat the first request as a batch request' do
206
+ refute @first_is_batch_request
207
+ end
208
+
209
+ it 'should treat the second request as a batch request' do
210
+ assert @second_is_batch_request
211
+ end
212
+
213
+ it 'should return access token for first (non-batch) request' do
214
+ assert @first_access_token
215
+ end
216
+
217
+ it 'should not return auth headers for second (batched) requests' do
218
+ assert_equal ' ', @second_access_token
219
+ end
220
+ end
221
+
222
+ describe 'unbatch' do
223
+ before do
224
+ @resource.reload
225
+ age_token(@resource, @client_id)
226
+
227
+ get '/demo/members_only',
228
+ params: {},
229
+ headers: @auth_headers
230
+
231
+ @first_is_batch_request = assigns(:is_batch_request)
232
+ @first_user = assigns(:resource).dup
233
+ @first_access_token = response.headers['access-token']
234
+ @first_response_status = response.status
235
+
236
+ get '/demo/members_only?unbatch=true',
237
+ params: {},
238
+ headers: @auth_headers
239
+
240
+ @second_is_batch_request = assigns(:is_batch_request)
241
+ @second_user = assigns(:resource)
242
+ @second_access_token = response.headers['access-token']
243
+ @second_response_status = response.status
244
+ end
245
+
246
+ it 'should NOT treat the second request as a batch request when "unbatch" param is set' do
247
+ refute @second_is_batch_request
248
+ end
249
+ end
250
+
251
+ describe 'time out' do
252
+ before do
253
+ @resource.reload
254
+ age_token(@resource, @client_id)
255
+
256
+ get '/demo/members_only',
257
+ params: {},
258
+ headers: @auth_headers
259
+
260
+ @first_is_batch_request = assigns(:is_batch_request)
261
+ @first_user = assigns(:resource).dup
262
+ @first_access_token = response.headers['access-token']
263
+ @first_response_status = response.status
264
+
265
+ @resource.reload
266
+ age_token(@resource, @client_id)
267
+
268
+ # use expired auth header
269
+ get '/demo/members_only',
270
+ params: {},
271
+ headers: @auth_headers
272
+
273
+ @second_is_batch_request = assigns(:is_batch_request)
274
+ @second_user = assigns(:resource)
275
+ @second_access_token = response.headers['access-token']
276
+ @second_response_status = response.status
277
+ end
278
+
279
+ it 'should allow the first request through' do
280
+ assert_equal 200, @first_response_status
281
+ end
282
+
283
+ it 'should not allow the second request through' do
284
+ assert_equal 401, @second_response_status
285
+ end
286
+
287
+ it 'should not treat first request as batch request' do
288
+ refute @second_is_batch_request
289
+ end
290
+
291
+ it 'should return auth headers from the first request' do
292
+ assert @first_access_token
293
+ end
294
+
295
+ it 'should not treat second request as batch request' do
296
+ refute @second_is_batch_request
297
+ end
298
+
299
+ it 'should not return auth headers from the second request' do
300
+ refute @second_access_token
301
+ end
302
+
303
+ it 'should define user during first request' do
304
+ assert @first_user
305
+ end
306
+
307
+ it 'should not define user during second request' do
308
+ refute @second_user
309
+ end
310
+ end
311
+ end
312
+
313
+ describe 'successful password change' do
314
+ before do
315
+ DeviseTokenAuth.remove_tokens_after_password_reset = true
316
+
317
+ # adding one more token to simulate another logged in device
318
+ @old_auth_headers = @auth_headers
319
+ @auth_headers = @resource.create_new_auth_token
320
+ age_token(@resource, @client_id)
321
+ assert @resource.tokens.count > 1
322
+
323
+ # password changed from new device
324
+ @resource.update(password: 'newsecret123',
325
+ password_confirmation: 'newsecret123')
326
+
327
+ get '/demo/members_only',
328
+ params: {},
329
+ headers: @auth_headers
330
+ end
331
+
332
+ after do
333
+ DeviseTokenAuth.remove_tokens_after_password_reset = false
334
+ end
335
+
336
+ it 'should have only one token' do
337
+ assert_equal 1, @resource.tokens.count
338
+ end
339
+
340
+ it 'new request should be successful' do
341
+ assert 200, response.status
342
+ end
343
+
344
+ describe 'another device should not be able to login' do
345
+ it 'should return forbidden status' do
346
+ get '/demo/members_only',
347
+ params: {},
348
+ headers: @old_auth_headers
349
+ assert 401, response.status
350
+ end
351
+ end
352
+ end
353
+
354
+ describe 'request including destroy of token' do
355
+ describe 'when change_headers_on_each_request is set to false' do
356
+ before do
357
+ DeviseTokenAuth.change_headers_on_each_request = false
358
+ age_token(@resource, @client_id)
359
+
360
+ get '/demo/members_only_remove_token',
361
+ params: {},
362
+ headers: @auth_headers
363
+ end
364
+
365
+ after do
366
+ DeviseTokenAuth.change_headers_on_each_request = true
367
+ end
368
+
369
+ it 'should not return auth-headers' do
370
+ refute response.headers['access-token']
371
+ end
372
+ end
373
+
374
+ describe 'when change_headers_on_each_request is set to true' do
375
+ before do
376
+ age_token(@resource, @client_id)
377
+ get '/demo/members_only_remove_token',
378
+ params: {},
379
+ headers: @auth_headers
380
+ end
381
+
382
+ it 'should not return auth-headers' do
383
+ refute response.headers['access-token']
384
+ end
385
+ end
386
+ end
387
+
388
+ describe 'when access-token name has been changed' do
389
+ before do
390
+ # ensure that request is not treated as batch request
391
+ DeviseTokenAuth.headers_names[:'access-token'] = 'new-access-token'
392
+ auth_headers_modified = @resource.create_new_auth_token
393
+ client_id = auth_headers_modified['client']
394
+ age_token(@resource, client_id)
395
+
396
+ get '/demo/members_only',
397
+ params: {},
398
+ headers: auth_headers_modified
399
+ @resp_token = response.headers['new-access-token']
400
+ end
401
+
402
+ it 'should have "new-access-token" header' do
403
+ assert @resp_token.present?
404
+ end
405
+
406
+ after do
407
+ DeviseTokenAuth.headers_names[:'access-token'] = 'access-token'
408
+ end
409
+ end
410
+
411
+ describe 'maximum concurrent devices per user' do
412
+ before do
413
+ # Set the max_number_of_devices to a lower number
414
+ # to expedite tests! (Default is 10)
415
+ DeviseTokenAuth.max_number_of_devices = 5
416
+ end
417
+
418
+ it 'should limit the maximum number of concurrent devices' do
419
+ # increment the number of devices until the maximum is exceeded
420
+ 1.upto(DeviseTokenAuth.max_number_of_devices + 1).each do |n|
421
+
422
+ assert_equal(
423
+ [n, DeviseTokenAuth.max_number_of_devices].min,
424
+ @resource.reload.tokens.length
425
+ )
426
+
427
+ # Add a new device (and token) ahead of the next iteration
428
+ @resource.create_new_auth_token
429
+
430
+ end
431
+ end
432
+
433
+ it 'should drop the oldest token when the maximum number of devices is exceeded' do
434
+ # create the maximum number of tokens
435
+ 1.upto(DeviseTokenAuth.max_number_of_devices).each do
436
+ @resource.create_new_auth_token
437
+ end
438
+
439
+ # get the oldest token client_id
440
+ oldest_client_id, = @resource.reload.tokens.min_by do |cid, v|
441
+ v[:expiry] || v['expiry']
442
+ end # => [ 'CLIENT_ID', {token: ...} ]
443
+
444
+ # create another token, thereby dropping the oldest token
445
+ @resource.create_new_auth_token
446
+
447
+ assert_not_includes @resource.reload.tokens.keys, oldest_client_id
448
+ end
449
+
450
+ after do
451
+ DeviseTokenAuth.max_number_of_devices = 10
452
+ end
453
+ end
454
+ end
455
+
456
+ describe 'bypass_sign_in' do
457
+ before do
458
+ @resource = create(:user)
459
+
460
+ @auth_headers = @resource.create_new_auth_token
461
+
462
+ @token = @auth_headers['access-token']
463
+ @client_id = @auth_headers['client']
464
+ @expiry = @auth_headers['expiry']
465
+ end
466
+ describe 'is default value (true)' do
467
+ before do
468
+ age_token(@resource, @client_id)
469
+
470
+ get '/demo/members_only', params: {}, headers: @auth_headers
471
+
472
+ @access_token = response.headers['access-token']
473
+ @response_status = response.status
474
+ end
475
+
476
+ it 'should allow the request through' do
477
+ assert_equal 200, @response_status
478
+ end
479
+
480
+ it 'should return auth headers' do
481
+ assert @access_token
482
+ end
483
+
484
+ it 'should set current user' do
485
+ assert_equal @controller.current_user, @resource
486
+ end
487
+ end
488
+ describe 'is false' do
489
+ before do
490
+ DeviseTokenAuth.bypass_sign_in = false
491
+ age_token(@resource, @client_id)
492
+
493
+ get '/demo/members_only', params: {}, headers: @auth_headers
494
+
495
+ @access_token = response.headers['access-token']
496
+ @response_status = response.status
497
+
498
+ DeviseTokenAuth.bypass_sign_in = true
499
+ end
500
+
501
+ it 'should not allow the request through' do
502
+ refute_equal 200, @response_status
503
+ end
504
+
505
+ it 'should not return auth headers from the first request' do
506
+ assert_nil @access_token
507
+ end
508
+ end
509
+ end
510
+
511
+ describe 'enable_standard_devise_support' do
512
+ before do
513
+ @resource = create(:user, :confirmed)
514
+ @auth_headers = @resource.create_new_auth_token
515
+ DeviseTokenAuth.enable_standard_devise_support = true
516
+ end
517
+
518
+ describe 'Existing Warden authentication' do
519
+ before do
520
+ @resource = create(:user, :confirmed)
521
+ login_as(@resource, scope: :user)
522
+
523
+ # no auth headers sent, testing that warden authenticates correctly.
524
+ get '/demo/members_only',
525
+ params: {},
526
+ headers: nil
527
+
528
+ @resp_token = response.headers['access-token']
529
+ @resp_client_id = response.headers['client']
530
+ @resp_expiry = response.headers['expiry']
531
+ @resp_uid = response.headers['uid']
532
+ end
533
+
534
+ describe 'devise mappings' do
535
+ it 'should define current_user' do
536
+ assert_equal @resource, @controller.current_user
537
+ end
538
+
539
+ it 'should define user_signed_in?' do
540
+ assert @controller.user_signed_in?
541
+ end
542
+
543
+ it 'should not define current_mang' do
544
+ refute_equal @resource, @controller.current_mang
545
+ end
546
+
547
+ end
548
+
549
+ it 'should return success status' do
550
+ assert_equal 200, response.status
551
+ end
552
+
553
+ it 'should receive new token after successful request' do
554
+ assert @resp_token
555
+ end
556
+
557
+ it 'should set the token expiry in the auth header' do
558
+ assert @resp_expiry
559
+ end
560
+
561
+ it 'should return the client id in the auth header' do
562
+ assert @resp_client_id
563
+ end
564
+
565
+ it "should return the user's uid in the auth header" do
566
+ assert @resp_uid
567
+ end
568
+ end
569
+
570
+ describe 'existing Warden authentication with ignored token data' do
571
+ before do
572
+ @resource = create(:user, :confirmed)
573
+ login_as(@resource, scope: :user)
574
+
575
+ get '/demo/members_only',
576
+ params: {},
577
+ headers: @auth_headers
578
+
579
+ @resp_token = response.headers['access-token']
580
+ @resp_client_id = response.headers['client']
581
+ @resp_expiry = response.headers['expiry']
582
+ @resp_uid = response.headers['uid']
583
+ end
584
+
585
+ describe 'devise mappings' do
586
+ it 'should define current_user' do
587
+ assert_equal @resource, @controller.current_user
588
+ end
589
+
590
+ it 'should define user_signed_in?' do
591
+ assert @controller.user_signed_in?
592
+ end
593
+
594
+ it 'should not define current_mang' do
595
+ refute_equal @resource, @controller.current_mang
596
+ end
597
+ end
598
+
599
+ it 'should return success status' do
600
+ assert_equal 200, response.status
601
+ end
602
+
603
+ it 'should receive new token after successful request' do
604
+ assert @resp_token
605
+ end
606
+
607
+ it 'should set the token expiry in the auth header' do
608
+ assert @resp_expiry
609
+ end
610
+
611
+ it 'should return the client id in the auth header' do
612
+ assert @resp_client_id
613
+ end
614
+
615
+ it "should not use the existing token's client" do
616
+ refute_equal @auth_headers['client'], @resp_client_id
617
+ end
618
+
619
+ it "should return the user's uid in the auth header" do
620
+ assert @resp_uid
621
+ end
622
+
623
+ it "should not return the token user's uid in the auth header" do
624
+ refute_equal @resp_uid, @auth_headers['uid']
625
+ end
626
+ end
627
+ end
628
+ end
629
+ end