devise_token_auth_skycocker_fork 1.0.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.
- checksums.yaml +7 -0
- data/LICENSE +13 -0
- data/README.md +97 -0
- data/Rakefile +42 -0
- data/app/controllers/devise_token_auth/application_controller.rb +79 -0
- data/app/controllers/devise_token_auth/concerns/resource_finder.rb +44 -0
- data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +178 -0
- data/app/controllers/devise_token_auth/confirmations_controller.rb +39 -0
- data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +239 -0
- data/app/controllers/devise_token_auth/passwords_controller.rb +185 -0
- data/app/controllers/devise_token_auth/registrations_controller.rb +198 -0
- data/app/controllers/devise_token_auth/sessions_controller.rb +131 -0
- data/app/controllers/devise_token_auth/token_validations_controller.rb +31 -0
- data/app/controllers/devise_token_auth/unlocks_controller.rb +89 -0
- data/app/models/devise_token_auth/concerns/active_record_support.rb +34 -0
- data/app/models/devise_token_auth/concerns/mongoid_support.rb +19 -0
- data/app/models/devise_token_auth/concerns/user.rb +262 -0
- data/app/models/devise_token_auth/concerns/user_omniauth_callbacks.rb +28 -0
- data/app/validators/devise_token_auth/email_validator.rb +23 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise_token_auth/omniauth_external_window.html.erb +38 -0
- data/config/locales/da-DK.yml +50 -0
- data/config/locales/de.yml +49 -0
- data/config/locales/en.yml +50 -0
- data/config/locales/es.yml +49 -0
- data/config/locales/fr.yml +49 -0
- data/config/locales/it.yml +46 -0
- data/config/locales/ja.yml +46 -0
- data/config/locales/nl.yml +30 -0
- data/config/locales/pl.yml +48 -0
- data/config/locales/pt-BR.yml +46 -0
- data/config/locales/pt.yml +48 -0
- data/config/locales/ro.yml +46 -0
- data/config/locales/ru.yml +50 -0
- data/config/locales/sq.yml +46 -0
- data/config/locales/sv.yml +50 -0
- data/config/locales/uk.yml +59 -0
- data/config/locales/vi.yml +50 -0
- data/config/locales/zh-CN.yml +46 -0
- data/config/locales/zh-HK.yml +48 -0
- data/config/locales/zh-TW.yml +48 -0
- data/lib/devise_token_auth.rb +13 -0
- data/lib/devise_token_auth/blacklist.rb +2 -0
- data/lib/devise_token_auth/controllers/helpers.rb +161 -0
- data/lib/devise_token_auth/controllers/url_helpers.rb +10 -0
- data/lib/devise_token_auth/engine.rb +90 -0
- data/lib/devise_token_auth/errors.rb +8 -0
- data/lib/devise_token_auth/rails/routes.rb +116 -0
- data/lib/devise_token_auth/url.rb +41 -0
- data/lib/devise_token_auth/version.rb +5 -0
- data/lib/generators/devise_token_auth/USAGE +31 -0
- data/lib/generators/devise_token_auth/install_generator.rb +91 -0
- data/lib/generators/devise_token_auth/install_generator_helpers.rb +98 -0
- data/lib/generators/devise_token_auth/install_mongoid_generator.rb +46 -0
- data/lib/generators/devise_token_auth/install_views_generator.rb +18 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +50 -0
- data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +56 -0
- data/lib/generators/devise_token_auth/templates/user.rb.erb +9 -0
- data/lib/generators/devise_token_auth/templates/user_mongoid.rb.erb +63 -0
- data/lib/tasks/devise_token_auth_tasks.rake +6 -0
- data/test/controllers/custom/custom_confirmations_controller_test.rb +25 -0
- data/test/controllers/custom/custom_omniauth_callbacks_controller_test.rb +33 -0
- data/test/controllers/custom/custom_passwords_controller_test.rb +79 -0
- data/test/controllers/custom/custom_registrations_controller_test.rb +63 -0
- data/test/controllers/custom/custom_sessions_controller_test.rb +39 -0
- data/test/controllers/custom/custom_token_validations_controller_test.rb +42 -0
- data/test/controllers/demo_group_controller_test.rb +151 -0
- data/test/controllers/demo_mang_controller_test.rb +284 -0
- data/test/controllers/demo_user_controller_test.rb +629 -0
- data/test/controllers/devise_token_auth/confirmations_controller_test.rb +127 -0
- data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +376 -0
- data/test/controllers/devise_token_auth/passwords_controller_test.rb +639 -0
- data/test/controllers/devise_token_auth/registrations_controller_test.rb +880 -0
- data/test/controllers/devise_token_auth/sessions_controller_test.rb +541 -0
- data/test/controllers/devise_token_auth/token_validations_controller_test.rb +102 -0
- data/test/controllers/devise_token_auth/unlocks_controller_test.rb +196 -0
- data/test/controllers/overrides/confirmations_controller_test.rb +47 -0
- data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +53 -0
- data/test/controllers/overrides/passwords_controller_test.rb +64 -0
- data/test/controllers/overrides/registrations_controller_test.rb +46 -0
- data/test/controllers/overrides/sessions_controller_test.rb +35 -0
- data/test/controllers/overrides/token_validations_controller_test.rb +43 -0
- data/test/dummy/README.rdoc +28 -0
- data/test/dummy/app/active_record/lockable_user.rb +7 -0
- data/test/dummy/app/active_record/mang.rb +5 -0
- data/test/dummy/app/active_record/only_email_user.rb +7 -0
- data/test/dummy/app/active_record/scoped_user.rb +9 -0
- data/test/dummy/app/active_record/unconfirmable_user.rb +9 -0
- data/test/dummy/app/active_record/unregisterable_user.rb +9 -0
- data/test/dummy/app/active_record/user.rb +6 -0
- data/test/dummy/app/controllers/application_controller.rb +18 -0
- data/test/dummy/app/controllers/auth_origin_controller.rb +7 -0
- data/test/dummy/app/controllers/custom/confirmations_controller.rb +13 -0
- data/test/dummy/app/controllers/custom/omniauth_callbacks_controller.rb +13 -0
- data/test/dummy/app/controllers/custom/passwords_controller.rb +39 -0
- data/test/dummy/app/controllers/custom/registrations_controller.rb +39 -0
- data/test/dummy/app/controllers/custom/sessions_controller.rb +29 -0
- data/test/dummy/app/controllers/custom/token_validations_controller.rb +19 -0
- data/test/dummy/app/controllers/demo_group_controller.rb +15 -0
- data/test/dummy/app/controllers/demo_mang_controller.rb +14 -0
- data/test/dummy/app/controllers/demo_user_controller.rb +27 -0
- data/test/dummy/app/controllers/overrides/confirmations_controller.rb +28 -0
- data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +16 -0
- data/test/dummy/app/controllers/overrides/passwords_controller.rb +35 -0
- data/test/dummy/app/controllers/overrides/registrations_controller.rb +29 -0
- data/test/dummy/app/controllers/overrides/sessions_controller.rb +36 -0
- data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
- data/test/dummy/app/helpers/application_helper.rb +1058 -0
- data/test/dummy/app/models/concerns/favorite_color.rb +19 -0
- data/test/dummy/app/mongoid/lockable_user.rb +38 -0
- data/test/dummy/app/mongoid/mang.rb +53 -0
- data/test/dummy/app/mongoid/only_email_user.rb +33 -0
- data/test/dummy/app/mongoid/scoped_user.rb +57 -0
- data/test/dummy/app/mongoid/unconfirmable_user.rb +51 -0
- data/test/dummy/app/mongoid/unregisterable_user.rb +54 -0
- data/test/dummy/app/mongoid/user.rb +56 -0
- data/test/dummy/app/views/layouts/application.html.erb +14 -0
- data/test/dummy/config.ru +18 -0
- data/test/dummy/config/application.rb +48 -0
- data/test/dummy/config/application.yml.bk +0 -0
- data/test/dummy/config/boot.rb +11 -0
- data/test/dummy/config/environment.rb +7 -0
- data/test/dummy/config/environments/development.rb +46 -0
- data/test/dummy/config/environments/production.rb +84 -0
- data/test/dummy/config/environments/test.rb +50 -0
- data/test/dummy/config/initializers/assets.rb +10 -0
- data/test/dummy/config/initializers/backtrace_silencers.rb +9 -0
- data/test/dummy/config/initializers/cookies_serializer.rb +5 -0
- data/test/dummy/config/initializers/devise.rb +17 -0
- data/test/dummy/config/initializers/devise_token_auth.rb +24 -0
- data/test/dummy/config/initializers/figaro.rb +3 -0
- data/test/dummy/config/initializers/filter_parameter_logging.rb +6 -0
- data/test/dummy/config/initializers/inflections.rb +18 -0
- data/test/dummy/config/initializers/mime_types.rb +6 -0
- data/test/dummy/config/initializers/omniauth.rb +10 -0
- data/test/dummy/config/initializers/session_store.rb +5 -0
- data/test/dummy/config/initializers/wrap_parameters.rb +16 -0
- data/test/dummy/config/routes.rb +55 -0
- data/test/dummy/config/spring.rb +3 -0
- data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +65 -0
- data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +64 -0
- data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +8 -0
- data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +7 -0
- data/test/dummy/db/migrate/20141222035835_devise_token_auth_create_only_email_users.rb +62 -0
- data/test/dummy/db/migrate/20141222053502_devise_token_auth_create_unregisterable_users.rb +63 -0
- data/test/dummy/db/migrate/20150708104536_devise_token_auth_create_unconfirmable_users.rb +63 -0
- data/test/dummy/db/migrate/20160103235141_devise_token_auth_create_scoped_users.rb +63 -0
- data/test/dummy/db/migrate/20160629184441_devise_token_auth_create_lockable_users.rb +63 -0
- data/test/dummy/db/schema.rb +200 -0
- data/test/dummy/lib/migration_database_helper.rb +43 -0
- data/test/dummy/tmp/generators/app/models/user.rb +9 -0
- data/test/dummy/tmp/generators/config/initializers/devise_token_auth.rb +50 -0
- data/test/dummy/tmp/generators/db/migrate/20181030122248_devise_token_auth_create_users.rb +56 -0
- data/test/factories/users.rb +40 -0
- data/test/lib/devise_token_auth/blacklist_test.rb +11 -0
- data/test/lib/devise_token_auth/url_test.rb +26 -0
- data/test/lib/generators/devise_token_auth/install_generator_test.rb +217 -0
- data/test/lib/generators/devise_token_auth/install_generator_with_namespace_test.rb +222 -0
- data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +25 -0
- data/test/models/concerns/mongoid_support_test.rb +31 -0
- data/test/models/only_email_user_test.rb +37 -0
- data/test/models/user_test.rb +140 -0
- data/test/support/controllers/routes.rb +43 -0
- data/test/test_helper.rb +103 -0
- metadata +443 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DeviseTokenAuth
|
|
4
|
+
class RegistrationsController < DeviseTokenAuth::ApplicationController
|
|
5
|
+
before_action :set_user_by_token, only: [:destroy, :update]
|
|
6
|
+
before_action :validate_sign_up_params, only: :create
|
|
7
|
+
before_action :validate_account_update_params, only: :update
|
|
8
|
+
skip_after_action :update_auth_header, only: [:create, :destroy]
|
|
9
|
+
|
|
10
|
+
def create
|
|
11
|
+
build_resource
|
|
12
|
+
|
|
13
|
+
unless @resource.present?
|
|
14
|
+
raise DeviseTokenAuth::Errors::NoResourceDefinedError,
|
|
15
|
+
"#{self.class.name} #build_resource does not define @resource,"\
|
|
16
|
+
' execution stopped.'
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# give redirect value from params priority
|
|
20
|
+
@redirect_url = params.fetch(
|
|
21
|
+
:confirm_success_url,
|
|
22
|
+
DeviseTokenAuth.default_confirm_success_url
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
# success redirect url is required
|
|
26
|
+
if confirmable_enabled? && !@redirect_url
|
|
27
|
+
return render_create_error_missing_confirm_success_url
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
# if whitelist is set, validate redirect_url against whitelist
|
|
31
|
+
return render_create_error_redirect_url_not_allowed if blacklisted_redirect_url?
|
|
32
|
+
|
|
33
|
+
# override email confirmation, must be sent manually from ctrl
|
|
34
|
+
resource_class.set_callback('create', :after, :send_on_create_confirmation_instructions)
|
|
35
|
+
resource_class.skip_callback('create', :after, :send_on_create_confirmation_instructions)
|
|
36
|
+
|
|
37
|
+
if @resource.respond_to? :skip_confirmation_notification!
|
|
38
|
+
# Fix duplicate e-mails by disabling Devise confirmation e-mail
|
|
39
|
+
@resource.skip_confirmation_notification!
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
if @resource.save
|
|
43
|
+
yield @resource if block_given?
|
|
44
|
+
|
|
45
|
+
if @resource.confirmed?
|
|
46
|
+
# email auth has been bypassed, authenticate user
|
|
47
|
+
@client_id, @token = @resource.create_token
|
|
48
|
+
@resource.save!
|
|
49
|
+
update_auth_header
|
|
50
|
+
else
|
|
51
|
+
# user will require email authentication
|
|
52
|
+
@resource.send_confirmation_instructions(
|
|
53
|
+
client_config: params[:config_name],
|
|
54
|
+
redirect_url: @redirect_url
|
|
55
|
+
)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
render_create_success
|
|
59
|
+
else
|
|
60
|
+
clean_up_passwords @resource
|
|
61
|
+
render_create_error
|
|
62
|
+
end
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
def update
|
|
66
|
+
if @resource
|
|
67
|
+
if @resource.send(resource_update_method, account_update_params)
|
|
68
|
+
yield @resource if block_given?
|
|
69
|
+
render_update_success
|
|
70
|
+
else
|
|
71
|
+
render_update_error
|
|
72
|
+
end
|
|
73
|
+
else
|
|
74
|
+
render_update_error_user_not_found
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def destroy
|
|
79
|
+
if @resource
|
|
80
|
+
@resource.destroy
|
|
81
|
+
yield @resource if block_given?
|
|
82
|
+
render_destroy_success
|
|
83
|
+
else
|
|
84
|
+
render_destroy_error
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def sign_up_params
|
|
89
|
+
params.permit(*params_for_resource(:sign_up))
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def account_update_params
|
|
93
|
+
params.permit(*params_for_resource(:account_update))
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
protected
|
|
97
|
+
|
|
98
|
+
def build_resource
|
|
99
|
+
@resource = resource_class.new(sign_up_params)
|
|
100
|
+
@resource.provider = provider
|
|
101
|
+
|
|
102
|
+
# honor devise configuration for case_insensitive_keys
|
|
103
|
+
if resource_class.case_insensitive_keys.include?(:email)
|
|
104
|
+
@resource.email = sign_up_params[:email].try(:downcase)
|
|
105
|
+
else
|
|
106
|
+
@resource.email = sign_up_params[:email]
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def render_create_error_missing_confirm_success_url
|
|
111
|
+
response = {
|
|
112
|
+
status: 'error',
|
|
113
|
+
data: resource_data
|
|
114
|
+
}
|
|
115
|
+
message = I18n.t('devise_token_auth.registrations.missing_confirm_success_url')
|
|
116
|
+
render_error(422, message, response)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
def render_create_error_redirect_url_not_allowed
|
|
120
|
+
response = {
|
|
121
|
+
status: 'error',
|
|
122
|
+
data: resource_data
|
|
123
|
+
}
|
|
124
|
+
message = I18n.t('devise_token_auth.registrations.redirect_url_not_allowed', redirect_url: @redirect_url)
|
|
125
|
+
render_error(422, message, response)
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def render_create_success
|
|
129
|
+
render json: {
|
|
130
|
+
status: 'success',
|
|
131
|
+
data: resource_data
|
|
132
|
+
}
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def render_create_error
|
|
136
|
+
render json: {
|
|
137
|
+
status: 'error',
|
|
138
|
+
data: resource_data,
|
|
139
|
+
errors: resource_errors
|
|
140
|
+
}, status: 422
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def render_update_success
|
|
144
|
+
render json: {
|
|
145
|
+
status: 'success',
|
|
146
|
+
data: resource_data
|
|
147
|
+
}
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def render_update_error
|
|
151
|
+
render json: {
|
|
152
|
+
status: 'error',
|
|
153
|
+
errors: resource_errors
|
|
154
|
+
}, status: 422
|
|
155
|
+
end
|
|
156
|
+
|
|
157
|
+
def render_update_error_user_not_found
|
|
158
|
+
render_error(404, I18n.t('devise_token_auth.registrations.user_not_found'), status: 'error')
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def render_destroy_success
|
|
162
|
+
render json: {
|
|
163
|
+
status: 'success',
|
|
164
|
+
message: I18n.t('devise_token_auth.registrations.account_with_uid_destroyed', uid: @resource.uid)
|
|
165
|
+
}
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def render_destroy_error
|
|
169
|
+
render_error(404, I18n.t('devise_token_auth.registrations.account_to_destroy_not_found'), status: 'error')
|
|
170
|
+
end
|
|
171
|
+
|
|
172
|
+
private
|
|
173
|
+
|
|
174
|
+
def resource_update_method
|
|
175
|
+
if DeviseTokenAuth.check_current_password_before_update == :attributes
|
|
176
|
+
'update_with_password'
|
|
177
|
+
elsif DeviseTokenAuth.check_current_password_before_update == :password && account_update_params.key?(:password)
|
|
178
|
+
'update_with_password'
|
|
179
|
+
elsif account_update_params.key?(:current_password)
|
|
180
|
+
'update_with_password'
|
|
181
|
+
else
|
|
182
|
+
'update_attributes'
|
|
183
|
+
end
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
def validate_sign_up_params
|
|
187
|
+
validate_post_data sign_up_params, I18n.t('errors.messages.validate_sign_up_params')
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def validate_account_update_params
|
|
191
|
+
validate_post_data account_update_params, I18n.t('errors.messages.validate_account_update_params')
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
def validate_post_data which, message
|
|
195
|
+
render_error(:unprocessable_entity, message, status: 'error') if which.empty?
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
end
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# see http://www.emilsoman.com/blog/2013/05/18/building-a-tested/
|
|
4
|
+
module DeviseTokenAuth
|
|
5
|
+
class SessionsController < DeviseTokenAuth::ApplicationController
|
|
6
|
+
before_action :set_user_by_token, only: [:destroy]
|
|
7
|
+
after_action :reset_session, only: [:destroy]
|
|
8
|
+
|
|
9
|
+
def new
|
|
10
|
+
render_new_error
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def create
|
|
14
|
+
# Check
|
|
15
|
+
field = (resource_params.keys.map(&:to_sym) & resource_class.authentication_keys).first
|
|
16
|
+
|
|
17
|
+
@resource = nil
|
|
18
|
+
if field
|
|
19
|
+
q_value = get_case_insensitive_field_from_resource_params(field)
|
|
20
|
+
|
|
21
|
+
@resource = find_resource(field, q_value)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
if @resource && valid_params?(field, q_value) && (!@resource.respond_to?(:active_for_authentication?) || @resource.active_for_authentication?)
|
|
25
|
+
valid_password = @resource.valid_password?(resource_params[:password])
|
|
26
|
+
if (@resource.respond_to?(:valid_for_authentication?) && !@resource.valid_for_authentication? { valid_password }) || !valid_password
|
|
27
|
+
return render_create_error_bad_credentials
|
|
28
|
+
end
|
|
29
|
+
@client_id, @token = @resource.create_token
|
|
30
|
+
@resource.save
|
|
31
|
+
|
|
32
|
+
sign_in(:user, @resource, store: false, bypass: false)
|
|
33
|
+
|
|
34
|
+
yield @resource if block_given?
|
|
35
|
+
|
|
36
|
+
render_create_success
|
|
37
|
+
elsif @resource && !(!@resource.respond_to?(:active_for_authentication?) || @resource.active_for_authentication?)
|
|
38
|
+
if @resource.respond_to?(:locked_at) && @resource.locked_at
|
|
39
|
+
render_create_error_account_locked
|
|
40
|
+
else
|
|
41
|
+
render_create_error_not_confirmed
|
|
42
|
+
end
|
|
43
|
+
else
|
|
44
|
+
render_create_error_bad_credentials
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def destroy
|
|
49
|
+
# remove auth instance variables so that after_action does not run
|
|
50
|
+
user = remove_instance_variable(:@resource) if @resource
|
|
51
|
+
client_id = remove_instance_variable(:@client_id) if @client_id
|
|
52
|
+
remove_instance_variable(:@token) if @token
|
|
53
|
+
|
|
54
|
+
if user && client_id && user.tokens[client_id]
|
|
55
|
+
user.tokens.delete(client_id)
|
|
56
|
+
user.save!
|
|
57
|
+
|
|
58
|
+
yield user if block_given?
|
|
59
|
+
|
|
60
|
+
render_destroy_success
|
|
61
|
+
else
|
|
62
|
+
render_destroy_error
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
protected
|
|
67
|
+
|
|
68
|
+
def valid_params?(key, val)
|
|
69
|
+
resource_params[:password] && key && val
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def get_auth_params
|
|
73
|
+
auth_key = nil
|
|
74
|
+
auth_val = nil
|
|
75
|
+
|
|
76
|
+
# iterate thru allowed auth keys, use first found
|
|
77
|
+
resource_class.authentication_keys.each do |k|
|
|
78
|
+
if resource_params[k]
|
|
79
|
+
auth_val = resource_params[k]
|
|
80
|
+
auth_key = k
|
|
81
|
+
break
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
# honor devise configuration for case_insensitive_keys
|
|
86
|
+
if resource_class.case_insensitive_keys.include?(auth_key)
|
|
87
|
+
auth_val.downcase!
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
{ key: auth_key, val: auth_val }
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def render_new_error
|
|
94
|
+
render_error(405, I18n.t('devise_token_auth.sessions.not_supported'))
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def render_create_success
|
|
98
|
+
render json: {
|
|
99
|
+
data: resource_data(resource_json: @resource.token_validation_response)
|
|
100
|
+
}
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
def render_create_error_not_confirmed
|
|
104
|
+
render_error(401, I18n.t('devise_token_auth.sessions.not_confirmed', email: @resource.email))
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def render_create_error_account_locked
|
|
108
|
+
render_error(401, I18n.t('devise.mailer.unlock_instructions.account_lock_msg'))
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
def render_create_error_bad_credentials
|
|
112
|
+
render_error(401, I18n.t('devise_token_auth.sessions.bad_credentials'))
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def render_destroy_success
|
|
116
|
+
render json: {
|
|
117
|
+
success:true
|
|
118
|
+
}, status: 200
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def render_destroy_error
|
|
122
|
+
render_error(404, I18n.t('devise_token_auth.sessions.user_not_found'))
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
private
|
|
126
|
+
|
|
127
|
+
def resource_params
|
|
128
|
+
params.permit(*params_for_resource(:sign_in))
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DeviseTokenAuth
|
|
4
|
+
class TokenValidationsController < DeviseTokenAuth::ApplicationController
|
|
5
|
+
skip_before_action :assert_is_devise_resource!, only: [:validate_token]
|
|
6
|
+
before_action :set_user_by_token, only: [:validate_token]
|
|
7
|
+
|
|
8
|
+
def validate_token
|
|
9
|
+
# @resource will have been set by set_user_by_token concern
|
|
10
|
+
if @resource
|
|
11
|
+
yield @resource if block_given?
|
|
12
|
+
render_validate_token_success
|
|
13
|
+
else
|
|
14
|
+
render_validate_token_error
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
protected
|
|
19
|
+
|
|
20
|
+
def render_validate_token_success
|
|
21
|
+
render json: {
|
|
22
|
+
success: true,
|
|
23
|
+
data: resource_data(resource_json: @resource.token_validation_response)
|
|
24
|
+
}
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def render_validate_token_error
|
|
28
|
+
render_error(401, I18n.t('devise_token_auth.token_validations.invalid'))
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module DeviseTokenAuth
|
|
4
|
+
class UnlocksController < DeviseTokenAuth::ApplicationController
|
|
5
|
+
skip_after_action :update_auth_header, only: [:create, :show]
|
|
6
|
+
|
|
7
|
+
# this action is responsible for generating unlock tokens and
|
|
8
|
+
# sending emails
|
|
9
|
+
def create
|
|
10
|
+
return render_create_error_missing_email unless resource_params[:email]
|
|
11
|
+
|
|
12
|
+
@email = get_case_insensitive_field_from_resource_params(:email)
|
|
13
|
+
@resource = find_resource(:email, @email)
|
|
14
|
+
|
|
15
|
+
if @resource
|
|
16
|
+
yield @resource if block_given?
|
|
17
|
+
|
|
18
|
+
@resource.send_unlock_instructions(
|
|
19
|
+
email: @email,
|
|
20
|
+
provider: 'email',
|
|
21
|
+
client_config: params[:config_name]
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
if @resource.errors.empty?
|
|
25
|
+
return render_create_success
|
|
26
|
+
else
|
|
27
|
+
render_create_error @resource.errors
|
|
28
|
+
end
|
|
29
|
+
else
|
|
30
|
+
render_not_found_error
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def show
|
|
35
|
+
@resource = resource_class.unlock_access_by_token(params[:unlock_token])
|
|
36
|
+
|
|
37
|
+
if @resource.persisted?
|
|
38
|
+
client_id, token = @resource.create_token
|
|
39
|
+
@resource.save!
|
|
40
|
+
yield @resource if block_given?
|
|
41
|
+
|
|
42
|
+
redirect_header_options = { unlock: true }
|
|
43
|
+
redirect_headers = build_redirect_headers(token,
|
|
44
|
+
client_id,
|
|
45
|
+
redirect_header_options)
|
|
46
|
+
redirect_to(@resource.build_auth_url(after_unlock_path_for(@resource),
|
|
47
|
+
redirect_headers))
|
|
48
|
+
else
|
|
49
|
+
render_show_error
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
private
|
|
54
|
+
def after_unlock_path_for(resource)
|
|
55
|
+
#TODO: This should probably be a configuration option at the very least.
|
|
56
|
+
'/'
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def render_create_error_missing_email
|
|
60
|
+
render_error(401, I18n.t('devise_token_auth.unlocks.missing_email'))
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def render_create_success
|
|
64
|
+
render json: {
|
|
65
|
+
success: true,
|
|
66
|
+
message: I18n.t('devise_token_auth.unlocks.sended', email: @email)
|
|
67
|
+
}
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def render_create_error(errors)
|
|
71
|
+
render json: {
|
|
72
|
+
success: false,
|
|
73
|
+
errors: errors
|
|
74
|
+
}, status: 400
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def render_show_error
|
|
78
|
+
raise ActionController::RoutingError, 'Not Found'
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
def render_not_found_error
|
|
82
|
+
render_error(404, I18n.t('devise_token_auth.unlocks.user_not_found', email: @email))
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def resource_params
|
|
86
|
+
params.permit(:email, :unlock_token, :config)
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|