devise_token_auth_multi_email 0.9.0

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 (183) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +97 -0
  4. data/Rakefile +42 -0
  5. data/app/controllers/devise_token_auth/application_controller.rb +100 -0
  6. data/app/controllers/devise_token_auth/concerns/resource_finder.rb +68 -0
  7. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +199 -0
  8. data/app/controllers/devise_token_auth/confirmations_controller.rb +89 -0
  9. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +284 -0
  10. data/app/controllers/devise_token_auth/passwords_controller.rb +216 -0
  11. data/app/controllers/devise_token_auth/registrations_controller.rb +205 -0
  12. data/app/controllers/devise_token_auth/sessions_controller.rb +153 -0
  13. data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
  14. data/app/controllers/devise_token_auth/unlocks_controller.rb +94 -0
  15. data/app/models/devise_token_auth/concerns/active_record_support.rb +18 -0
  16. data/app/models/devise_token_auth/concerns/confirmable_support.rb +28 -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 +31 -0
  19. data/app/models/devise_token_auth/concerns/user.rb +282 -0
  20. data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +39 -0
  21. data/app/validators/devise_token_auth_email_validator.rb +31 -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 +60 -0
  29. data/config/locales/es.yml +51 -0
  30. data/config/locales/fa.yml +60 -0
  31. data/config/locales/fr.yml +51 -0
  32. data/config/locales/he.yml +52 -0
  33. data/config/locales/it.yml +48 -0
  34. data/config/locales/ja.yml +60 -0
  35. data/config/locales/ko.yml +51 -0
  36. data/config/locales/nl.yml +32 -0
  37. data/config/locales/pl.yml +51 -0
  38. data/config/locales/pt-BR.yml +48 -0
  39. data/config/locales/pt.yml +51 -0
  40. data/config/locales/ro.yml +48 -0
  41. data/config/locales/ru.yml +52 -0
  42. data/config/locales/sq.yml +48 -0
  43. data/config/locales/sv.yml +52 -0
  44. data/config/locales/uk.yml +61 -0
  45. data/config/locales/vi.yml +52 -0
  46. data/config/locales/zh-CN.yml +48 -0
  47. data/config/locales/zh-HK.yml +50 -0
  48. data/config/locales/zh-TW.yml +50 -0
  49. data/lib/devise_token_auth/blacklist.rb +6 -0
  50. data/lib/devise_token_auth/controllers/helpers.rb +157 -0
  51. data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
  52. data/lib/devise_token_auth/engine.rb +105 -0
  53. data/lib/devise_token_auth/errors.rb +8 -0
  54. data/lib/devise_token_auth/rails/routes.rb +122 -0
  55. data/lib/devise_token_auth/token_factory.rb +126 -0
  56. data/lib/devise_token_auth/url.rb +44 -0
  57. data/lib/devise_token_auth/version.rb +5 -0
  58. data/lib/devise_token_auth.rb +14 -0
  59. data/lib/generators/devise_token_auth/USAGE +31 -0
  60. data/lib/generators/devise_token_auth/install_generator.rb +91 -0
  61. data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
  62. data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
  63. data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
  64. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +66 -0
  65. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +49 -0
  66. data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
  67. data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +56 -0
  68. data/lib/tasks/devise_token_auth_tasks.rake +6 -0
  69. data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
  70. data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
  71. data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
  72. data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
  73. data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
  74. data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
  75. data/test/controllers/demo_group_controller_test.rb +151 -0
  76. data/test/controllers/demo_mang_controller_test.rb +313 -0
  77. data/test/controllers/demo_user_controller_test.rb +658 -0
  78. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +275 -0
  79. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +438 -0
  80. data/test/controllers/devise_token_auth/passwords_controller_test.rb +893 -0
  81. data/test/controllers/devise_token_auth/registrations_controller_test.rb +920 -0
  82. data/test/controllers/devise_token_auth/sessions_controller_test.rb +605 -0
  83. data/test/controllers/devise_token_auth/token_validations_controller_test.rb +142 -0
  84. data/test/controllers/devise_token_auth/unlocks_controller_test.rb +235 -0
  85. data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
  86. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
  87. data/test/controllers/overrides/passwords_controller_test.rb +64 -0
  88. data/test/controllers/overrides/registrations_controller_test.rb +46 -0
  89. data/test/controllers/overrides/sessions_controller_test.rb +35 -0
  90. data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
  91. data/test/dummy/README.rdoc +28 -0
  92. data/test/dummy/app/active_record/confirmable_user.rb +11 -0
  93. data/test/dummy/app/active_record/lockable_user.rb +7 -0
  94. data/test/dummy/app/active_record/mang.rb +5 -0
  95. data/test/dummy/app/active_record/only_email_user.rb +7 -0
  96. data/test/dummy/app/active_record/scoped_user.rb +9 -0
  97. data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
  98. data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
  99. data/test/dummy/app/active_record/user.rb +6 -0
  100. data/test/dummy/app/controllers/application_controller.rb +14 -0
  101. data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
  102. data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
  103. data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
  104. data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
  105. data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
  106. data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
  107. data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
  108. data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
  109. data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
  110. data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
  111. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +29 -0
  112. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
  113. data/test/dummy/app/controllers/overrides/passwords_controller.rb +36 -0
  114. data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
  115. data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
  116. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
  117. data/test/dummy/app/helpers/application_helper.rb +1058 -0
  118. data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
  119. data/test/dummy/app/mongoid/confirmable_user.rb +52 -0
  120. data/test/dummy/app/mongoid/lockable_user.rb +38 -0
  121. data/test/dummy/app/mongoid/mang.rb +46 -0
  122. data/test/dummy/app/mongoid/only_email_user.rb +33 -0
  123. data/test/dummy/app/mongoid/scoped_user.rb +50 -0
  124. data/test/dummy/app/mongoid/unconfirmable_user.rb +44 -0
  125. data/test/dummy/app/mongoid/unregisterable_user.rb +47 -0
  126. data/test/dummy/app/mongoid/user.rb +49 -0
  127. data/test/dummy/app/views/layouts/application.html.erb +12 -0
  128. data/test/dummy/config/application.rb +50 -0
  129. data/test/dummy/config/application.yml.bk +0 -0
  130. data/test/dummy/config/boot.rb +11 -0
  131. data/test/dummy/config/environment.rb +7 -0
  132. data/test/dummy/config/environments/development.rb +36 -0
  133. data/test/dummy/config/environments/production.rb +68 -0
  134. data/test/dummy/config/environments/test.rb +58 -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/dummy/tmp/generators/app/models/mang.rb +9 -0
  162. data/test/dummy/tmp/generators/app/models/user.rb +9 -0
  163. data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +60 -0
  164. data/test/dummy/tmp/generators/config/routes.rb +9 -0
  165. data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_mangs.rb +49 -0
  166. data/test/dummy/tmp/generators/db/migrate/20210305040222_devise_token_auth_create_users.rb +49 -0
  167. data/test/factories/users.rb +41 -0
  168. data/test/lib/devise_token_auth/blacklist_test.rb +19 -0
  169. data/test/lib/devise_token_auth/rails/custom_routes_test.rb +29 -0
  170. data/test/lib/devise_token_auth/rails/routes_test.rb +87 -0
  171. data/test/lib/devise_token_auth/token_factory_test.rb +191 -0
  172. data/test/lib/devise_token_auth/url_test.rb +26 -0
  173. data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
  174. data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
  175. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
  176. data/test/models/concerns/mongoid_support_test.rb +31 -0
  177. data/test/models/concerns/tokens_serialization_test.rb +104 -0
  178. data/test/models/confirmable_user_test.rb +35 -0
  179. data/test/models/only_email_user_test.rb +29 -0
  180. data/test/models/user_test.rb +224 -0
  181. data/test/support/controllers/routes.rb +43 -0
  182. data/test/test_helper.rb +134 -0
  183. metadata +502 -0
@@ -0,0 +1,658 @@
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 previous 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
+
278
+ @resource.reload
279
+ age_token(@resource, @client_id)
280
+
281
+ # use expired auth headers
282
+ get '/demo/members_only_mang',
283
+ params: {},
284
+ headers: @auth_headers
285
+
286
+ @third_is_batch_request = assigns(:is_batch_request)
287
+ @third_user = assigns(:resource)
288
+ @third_access_token = response.headers['access-token']
289
+ @third_response_status = response.status
290
+ end
291
+
292
+ it 'should allow the first request through' do
293
+ assert_equal 200, @first_response_status
294
+ end
295
+
296
+ it 'should allow the second request through' do
297
+ assert_equal 200, @second_response_status
298
+ end
299
+
300
+ it 'should not allow the second request through' do
301
+ assert_equal 401, @third_response_status
302
+ end
303
+
304
+ it 'should not treat first request as batch request' do
305
+ refute @first_is_batch_request
306
+ end
307
+
308
+ it 'should not treat second request as batch request' do
309
+ refute @second_is_batch_request
310
+ end
311
+
312
+ it 'should not treat third request as batch request' do
313
+ refute @third_is_batch_request
314
+ end
315
+
316
+ it 'should return auth headers from the first request' do
317
+ assert @first_access_token
318
+ end
319
+
320
+ it 'should return auth headers from the second request' do
321
+ assert @second_access_token
322
+ end
323
+
324
+ it 'should not return auth headers from the third request' do
325
+ refute @third_access_token
326
+ end
327
+
328
+ it 'should define user during first request' do
329
+ assert @first_user
330
+ end
331
+
332
+ it 'should define user during second request' do
333
+ assert @second_user
334
+ end
335
+
336
+ it 'should not define user during third request' do
337
+ refute @third_user
338
+ end
339
+ end
340
+ end
341
+
342
+ describe 'successful password change' do
343
+ before do
344
+ DeviseTokenAuth.remove_tokens_after_password_reset = true
345
+
346
+ # adding one more token to simulate another logged in device
347
+ @old_auth_headers = @auth_headers
348
+ @auth_headers = @resource.create_new_auth_token
349
+ age_token(@resource, @client_id)
350
+ assert @resource.tokens.count > 1
351
+
352
+ # password changed from new device
353
+ @resource.update(password: 'newsecret123',
354
+ password_confirmation: 'newsecret123')
355
+
356
+ get '/demo/members_only',
357
+ params: {},
358
+ headers: @auth_headers
359
+ end
360
+
361
+ after do
362
+ DeviseTokenAuth.remove_tokens_after_password_reset = false
363
+ end
364
+
365
+ it 'should have only one token' do
366
+ assert_equal 1, @resource.tokens.count
367
+ end
368
+
369
+ it 'new request should be successful' do
370
+ assert 200, response.status
371
+ end
372
+
373
+ describe 'another device should not be able to login' do
374
+ it 'should return forbidden status' do
375
+ get '/demo/members_only',
376
+ params: {},
377
+ headers: @old_auth_headers
378
+ assert 401, response.status
379
+ end
380
+ end
381
+ end
382
+
383
+ describe 'request including destroy of token' do
384
+ describe 'when change_headers_on_each_request is set to false' do
385
+ before do
386
+ DeviseTokenAuth.change_headers_on_each_request = false
387
+ age_token(@resource, @client_id)
388
+
389
+ get '/demo/members_only_remove_token',
390
+ params: {},
391
+ headers: @auth_headers
392
+ end
393
+
394
+ after do
395
+ DeviseTokenAuth.change_headers_on_each_request = true
396
+ end
397
+
398
+ it 'should not return auth-headers' do
399
+ refute response.headers['access-token']
400
+ end
401
+ end
402
+
403
+ describe 'when change_headers_on_each_request is set to true' do
404
+ before do
405
+ age_token(@resource, @client_id)
406
+ get '/demo/members_only_remove_token',
407
+ params: {},
408
+ headers: @auth_headers
409
+ end
410
+
411
+ it 'should not return auth-headers' do
412
+ refute response.headers['access-token']
413
+ end
414
+ end
415
+ end
416
+
417
+ describe 'when access-token name has been changed' do
418
+ before do
419
+ # ensure that request is not treated as batch request
420
+ DeviseTokenAuth.headers_names[:'access-token'] = 'new-access-token'
421
+ auth_headers_modified = @resource.create_new_auth_token
422
+ client_id = auth_headers_modified['client']
423
+ age_token(@resource, client_id)
424
+
425
+ get '/demo/members_only',
426
+ params: {},
427
+ headers: auth_headers_modified
428
+ @resp_token = response.headers['new-access-token']
429
+ end
430
+
431
+ it 'should have "new-access-token" header' do
432
+ assert @resp_token.present?
433
+ end
434
+
435
+ after do
436
+ DeviseTokenAuth.headers_names[:'access-token'] = 'access-token'
437
+ end
438
+ end
439
+
440
+ describe 'maximum concurrent devices per user' do
441
+ before do
442
+ # Set the max_number_of_devices to a lower number
443
+ # to expedite tests! (Default is 10)
444
+ DeviseTokenAuth.max_number_of_devices = 5
445
+ end
446
+
447
+ it 'should limit the maximum number of concurrent devices' do
448
+ # increment the number of devices until the maximum is exceeded
449
+ 1.upto(DeviseTokenAuth.max_number_of_devices + 1).each do |n|
450
+
451
+ assert_equal(
452
+ [n, DeviseTokenAuth.max_number_of_devices].min,
453
+ @resource.reload.tokens.length
454
+ )
455
+
456
+ # Add a new device (and token) ahead of the next iteration
457
+ @resource.create_new_auth_token
458
+
459
+ end
460
+ end
461
+
462
+ it 'should drop the oldest token when the maximum number of devices is exceeded' do
463
+ # create the maximum number of tokens
464
+ 1.upto(DeviseTokenAuth.max_number_of_devices).each do
465
+ @resource.create_new_auth_token
466
+ end
467
+
468
+ # get the oldest token client_id
469
+ oldest_client_id, = @resource.reload.tokens.min_by do |cid, v|
470
+ v[:expiry] || v['expiry']
471
+ end # => [ 'CLIENT_ID', {token: ...} ]
472
+
473
+ # create another token, thereby dropping the oldest token
474
+ @resource.create_new_auth_token
475
+
476
+ assert_not_includes @resource.reload.tokens.keys, oldest_client_id
477
+ end
478
+
479
+ after do
480
+ DeviseTokenAuth.max_number_of_devices = 10
481
+ end
482
+ end
483
+ end
484
+
485
+ describe 'bypass_sign_in' do
486
+ before do
487
+ @resource = create(:user)
488
+
489
+ @auth_headers = @resource.create_new_auth_token
490
+
491
+ @token = @auth_headers['access-token']
492
+ @client_id = @auth_headers['client']
493
+ @expiry = @auth_headers['expiry']
494
+ end
495
+ describe 'is default value (true)' do
496
+ before do
497
+ age_token(@resource, @client_id)
498
+
499
+ get '/demo/members_only', params: {}, headers: @auth_headers
500
+
501
+ @access_token = response.headers['access-token']
502
+ @response_status = response.status
503
+ end
504
+
505
+ it 'should allow the request through' do
506
+ assert_equal 200, @response_status
507
+ end
508
+
509
+ it 'should return auth headers' do
510
+ assert @access_token
511
+ end
512
+
513
+ it 'should set current user' do
514
+ assert_equal @controller.current_user, @resource
515
+ end
516
+ end
517
+ describe 'is false' do
518
+ before do
519
+ DeviseTokenAuth.bypass_sign_in = false
520
+ age_token(@resource, @client_id)
521
+
522
+ get '/demo/members_only', params: {}, headers: @auth_headers
523
+
524
+ @access_token = response.headers['access-token']
525
+ @response_status = response.status
526
+
527
+ DeviseTokenAuth.bypass_sign_in = true
528
+ end
529
+
530
+ it 'should not allow the request through' do
531
+ refute_equal 200, @response_status
532
+ end
533
+
534
+ it 'should not return auth headers from the first request' do
535
+ assert_nil @access_token
536
+ end
537
+ end
538
+ end
539
+
540
+ describe 'enable_standard_devise_support' do
541
+ before do
542
+ @resource = create(:user, :confirmed)
543
+ @auth_headers = @resource.create_new_auth_token
544
+ DeviseTokenAuth.enable_standard_devise_support = true
545
+ end
546
+
547
+ describe 'Existing Warden authentication' do
548
+ before do
549
+ @resource = create(:user, :confirmed)
550
+ login_as(@resource, scope: :user)
551
+
552
+ # no auth headers sent, testing that warden authenticates correctly.
553
+ get '/demo/members_only',
554
+ params: {},
555
+ headers: nil
556
+
557
+ @resp_token = response.headers['access-token']
558
+ @resp_client_id = response.headers['client']
559
+ @resp_expiry = response.headers['expiry']
560
+ @resp_uid = response.headers['uid']
561
+ end
562
+
563
+ describe 'devise mappings' do
564
+ it 'should define current_user' do
565
+ assert_equal @resource, @controller.current_user
566
+ end
567
+
568
+ it 'should define user_signed_in?' do
569
+ assert @controller.user_signed_in?
570
+ end
571
+
572
+ it 'should not define current_mang' do
573
+ refute_equal @resource, @controller.current_mang
574
+ end
575
+
576
+ end
577
+
578
+ it 'should return success status' do
579
+ assert_equal 200, response.status
580
+ end
581
+
582
+ it 'should receive new token after successful request' do
583
+ assert @resp_token
584
+ end
585
+
586
+ it 'should set the token expiry in the auth header' do
587
+ assert @resp_expiry
588
+ end
589
+
590
+ it 'should return the client id in the auth header' do
591
+ assert @resp_client_id
592
+ end
593
+
594
+ it "should return the user's uid in the auth header" do
595
+ assert @resp_uid
596
+ end
597
+ end
598
+
599
+ describe 'existing Warden authentication with ignored token data' do
600
+ before do
601
+ @resource = create(:user, :confirmed)
602
+ login_as(@resource, scope: :user)
603
+
604
+ get '/demo/members_only',
605
+ params: {},
606
+ headers: @auth_headers
607
+
608
+ @resp_token = response.headers['access-token']
609
+ @resp_client_id = response.headers['client']
610
+ @resp_expiry = response.headers['expiry']
611
+ @resp_uid = response.headers['uid']
612
+ end
613
+
614
+ describe 'devise mappings' do
615
+ it 'should define current_user' do
616
+ assert_equal @resource, @controller.current_user
617
+ end
618
+
619
+ it 'should define user_signed_in?' do
620
+ assert @controller.user_signed_in?
621
+ end
622
+
623
+ it 'should not define current_mang' do
624
+ refute_equal @resource, @controller.current_mang
625
+ end
626
+ end
627
+
628
+ it 'should return success status' do
629
+ assert_equal 200, response.status
630
+ end
631
+
632
+ it 'should receive new token after successful request' do
633
+ assert @resp_token
634
+ end
635
+
636
+ it 'should set the token expiry in the auth header' do
637
+ assert @resp_expiry
638
+ end
639
+
640
+ it 'should return the client id in the auth header' do
641
+ assert @resp_client_id
642
+ end
643
+
644
+ it "should not use the existing token's client" do
645
+ refute_equal @auth_headers['client'], @resp_client_id
646
+ end
647
+
648
+ it "should return the user's uid in the auth header" do
649
+ assert @resp_uid
650
+ end
651
+
652
+ it "should not return the token user's uid in the auth header" do
653
+ refute_equal @resp_uid, @auth_headers['uid']
654
+ end
655
+ end
656
+ end
657
+ end
658
+ end