cm-devise_token_auth 0.1.30.1

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 (117) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +13 -0
  3. data/README.md +688 -0
  4. data/Rakefile +34 -0
  5. data/app/controllers/devise_token_auth/application_controller.rb +17 -0
  6. data/app/controllers/devise_token_auth/concerns/set_user_by_token.rb +109 -0
  7. data/app/controllers/devise_token_auth/confirmations_controller.rb +31 -0
  8. data/app/controllers/devise_token_auth/omniauth_callbacks_controller.rb +171 -0
  9. data/app/controllers/devise_token_auth/passwords_controller.rb +155 -0
  10. data/app/controllers/devise_token_auth/registrations_controller.rb +123 -0
  11. data/app/controllers/devise_token_auth/sessions_controller.rb +98 -0
  12. data/app/controllers/devise_token_auth/token_validations_controller.rb +23 -0
  13. data/app/models/devise_token_auth/concerns/user.rb +231 -0
  14. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  15. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  16. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  17. data/app/views/devise_token_auth/omniauth_failure.html.erb +2 -0
  18. data/app/views/devise_token_auth/omniauth_success.html.erb +8 -0
  19. data/app/views/layouts/omniauth_response.html.erb +31 -0
  20. data/config/initializers/devise.rb +203 -0
  21. data/config/locales/devise.en.yml +59 -0
  22. data/config/routes.rb +5 -0
  23. data/lib/devise_token_auth.rb +7 -0
  24. data/lib/devise_token_auth/controllers/helpers.rb +129 -0
  25. data/lib/devise_token_auth/controllers/url_helpers.rb +8 -0
  26. data/lib/devise_token_auth/engine.rb +25 -0
  27. data/lib/devise_token_auth/rails/routes.rb +65 -0
  28. data/lib/devise_token_auth/version.rb +3 -0
  29. data/lib/generators/devise_token_auth/USAGE +31 -0
  30. data/lib/generators/devise_token_auth/install_generator.rb +115 -0
  31. data/lib/generators/devise_token_auth/install_views_generator.rb +16 -0
  32. data/lib/generators/devise_token_auth/templates/devise_token_auth.rb +22 -0
  33. data/lib/generators/devise_token_auth/templates/devise_token_auth_create_users.rb.erb +54 -0
  34. data/lib/generators/devise_token_auth/templates/user.rb +3 -0
  35. data/lib/tasks/devise_token_auth_tasks.rake +4 -0
  36. data/test/controllers/demo_group_controller_test.rb +126 -0
  37. data/test/controllers/demo_mang_controller_test.rb +263 -0
  38. data/test/controllers/demo_user_controller_test.rb +262 -0
  39. data/test/controllers/devise_token_auth/confirmations_controller_test.rb +107 -0
  40. data/test/controllers/devise_token_auth/omniauth_callbacks_controller_test.rb +167 -0
  41. data/test/controllers/devise_token_auth/passwords_controller_test.rb +287 -0
  42. data/test/controllers/devise_token_auth/registrations_controller_test.rb +458 -0
  43. data/test/controllers/devise_token_auth/sessions_controller_test.rb +221 -0
  44. data/test/controllers/overrides/confirmations_controller_test.rb +44 -0
  45. data/test/controllers/overrides/omniauth_callbacks_controller_test.rb +44 -0
  46. data/test/controllers/overrides/passwords_controller_test.rb +62 -0
  47. data/test/controllers/overrides/registrations_controller_test.rb +40 -0
  48. data/test/controllers/overrides/sessions_controller_test.rb +33 -0
  49. data/test/controllers/overrides/token_validations_controller_test.rb +38 -0
  50. data/test/dummy/README.rdoc +28 -0
  51. data/test/dummy/Rakefile +6 -0
  52. data/test/dummy/app/assets/images/logo.jpg +0 -0
  53. data/test/dummy/app/assets/images/omniauth-provider-settings.png +0 -0
  54. data/test/dummy/app/assets/javascripts/application.js +13 -0
  55. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  56. data/test/dummy/app/controllers/application_controller.rb +16 -0
  57. data/test/dummy/app/controllers/demo_group_controller.rb +13 -0
  58. data/test/dummy/app/controllers/demo_mang_controller.rb +12 -0
  59. data/test/dummy/app/controllers/demo_user_controller.rb +12 -0
  60. data/test/dummy/app/controllers/overrides/confirmations_controller.rb +32 -0
  61. data/test/dummy/app/controllers/overrides/omniauth_callbacks_controller.rb +14 -0
  62. data/test/dummy/app/controllers/overrides/passwords_controller.rb +39 -0
  63. data/test/dummy/app/controllers/overrides/registrations_controller.rb +27 -0
  64. data/test/dummy/app/controllers/overrides/sessions_controller.rb +43 -0
  65. data/test/dummy/app/controllers/overrides/token_validations_controller.rb +23 -0
  66. data/test/dummy/app/helpers/application_helper.rb +1065 -0
  67. data/test/dummy/app/models/evil_user.rb +3 -0
  68. data/test/dummy/app/models/mang.rb +3 -0
  69. data/test/dummy/app/models/user.rb +18 -0
  70. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  71. data/test/dummy/bin/bundle +3 -0
  72. data/test/dummy/bin/rails +8 -0
  73. data/test/dummy/bin/rake +8 -0
  74. data/test/dummy/bin/spring +18 -0
  75. data/test/dummy/config.ru +16 -0
  76. data/test/dummy/config/application.rb +23 -0
  77. data/test/dummy/config/application.yml.bk +0 -0
  78. data/test/dummy/config/boot.rb +5 -0
  79. data/test/dummy/config/database.yml +31 -0
  80. data/test/dummy/config/environment.rb +5 -0
  81. data/test/dummy/config/environments/development.rb +44 -0
  82. data/test/dummy/config/environments/production.rb +82 -0
  83. data/test/dummy/config/environments/test.rb +40 -0
  84. data/test/dummy/config/initializers/assets.rb +8 -0
  85. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  86. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  87. data/test/dummy/config/initializers/devise_token_auth.rb +22 -0
  88. data/test/dummy/config/initializers/figaro.rb +1 -0
  89. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  90. data/test/dummy/config/initializers/inflections.rb +16 -0
  91. data/test/dummy/config/initializers/mime_types.rb +4 -0
  92. data/test/dummy/config/initializers/omniauth.rb +8 -0
  93. data/test/dummy/config/initializers/session_store.rb +3 -0
  94. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  95. data/test/dummy/config/locales/en.yml +23 -0
  96. data/test/dummy/config/routes.rb +30 -0
  97. data/test/dummy/config/secrets.yml +22 -0
  98. data/test/dummy/config/spring.rb +1 -0
  99. data/test/dummy/db/migrate/20140715061447_devise_token_auth_create_users.rb +56 -0
  100. data/test/dummy/db/migrate/20140715061805_devise_token_auth_create_mangs.rb +56 -0
  101. data/test/dummy/db/migrate/20140829044006_add_operating_thetan_to_user.rb +6 -0
  102. data/test/dummy/db/migrate/20140916224624_add_favorite_color_to_mangs.rb +5 -0
  103. data/test/dummy/db/migrate/20140928231203_devise_token_auth_create_evil_users.rb +57 -0
  104. data/test/dummy/db/schema.rb +114 -0
  105. data/test/dummy/public/404.html +67 -0
  106. data/test/dummy/public/422.html +67 -0
  107. data/test/dummy/public/500.html +66 -0
  108. data/test/dummy/public/favicon.ico +0 -0
  109. data/test/fixtures/evil_users.yml +29 -0
  110. data/test/fixtures/mangs.yml +29 -0
  111. data/test/fixtures/users.yml +29 -0
  112. data/test/integration/navigation_test.rb +10 -0
  113. data/test/lib/generators/devise_token_auth/install_generator_test.rb +178 -0
  114. data/test/lib/generators/devise_token_auth/install_views_generator_test.rb +23 -0
  115. data/test/models/user_test.rb +90 -0
  116. data/test/test_helper.rb +60 -0
  117. metadata +310 -0
@@ -0,0 +1,34 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'DeviseTokenAuth'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.rdoc')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+ APP_RAKEFILE = File.expand_path("../test/dummy/Rakefile", __FILE__)
18
+ load 'rails/tasks/engine.rake'
19
+
20
+
21
+
22
+ Bundler::GemHelper.install_tasks
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'lib'
28
+ t.libs << 'test'
29
+ t.pattern = 'test/**/*_test.rb'
30
+ t.verbose = false
31
+ end
32
+
33
+
34
+ task default: :test
@@ -0,0 +1,17 @@
1
+ module DeviseTokenAuth
2
+ class ApplicationController < DeviseController
3
+ include DeviseTokenAuth::Concerns::SetUserByToken
4
+ respond_to :json
5
+
6
+
7
+ def resource_class(m=nil)
8
+ if m
9
+ mapping = Devise.mappings[m]
10
+ else
11
+ mapping = Devise.mappings[resource_name] || Devise.mappings.values.first
12
+ end
13
+
14
+ mapping.to
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,109 @@
1
+ module DeviseTokenAuth::Concerns::SetUserByToken
2
+ extend ActiveSupport::Concern
3
+ include DeviseTokenAuth::Controllers::Helpers
4
+
5
+ included do
6
+ before_action :set_request_start
7
+ after_action :update_auth_header
8
+ end
9
+
10
+ # keep track of request duration
11
+ def set_request_start
12
+ @request_started_at = Time.now
13
+ end
14
+
15
+ # user auth
16
+ def set_user_by_token(mapping=nil)
17
+
18
+ # determine target authentication class
19
+ rc = resource_class(mapping)
20
+ rc = rc.active if rc.respond_to?(:active)
21
+
22
+ # no default user defined
23
+ return unless rc
24
+
25
+ # user has already been found and authenticated
26
+ return @resource if @resource and @resource.class == rc
27
+
28
+ # parse header for values necessary for authentication
29
+ uid = request.headers['uid']
30
+ @token = request.headers['access-token']
31
+ @client_id = request.headers['client']
32
+
33
+ return false unless @token
34
+
35
+ # client_id isn't required, set to 'default' if absent
36
+ @client_id ||= 'default'
37
+
38
+ # mitigate timing attacks by finding by uid instead of auth token
39
+ user = uid && rc.find_by_uid(uid)
40
+
41
+ if user && user.valid_token?(@token, @client_id)
42
+ sign_in(:user, user, store: false, bypass: true)
43
+ return @resource = user
44
+ else
45
+ # zero all values previously set values
46
+ return @resource = nil
47
+ end
48
+ end
49
+
50
+
51
+ def update_auth_header
52
+
53
+ # cannot save object if model has invalid params
54
+ return unless @resource and @resource.valid? and @client_id
55
+
56
+ # Lock the user record during any auth_header updates to ensure
57
+ # we don't have write contention from multiple threads
58
+ @resource.with_lock do
59
+
60
+ # determine batch request status after request processing, in case
61
+ # another processes has updated it during that processing
62
+ @is_batch_request = is_batch_request?(@resource, @client_id)
63
+
64
+ auth_header = {}
65
+
66
+ if not DeviseTokenAuth.change_headers_on_each_request
67
+ auth_header = @resource.build_auth_header(@token, @client_id)
68
+ return unless auth_header
69
+
70
+ # update the response header
71
+ response.headers.merge!(auth_header)
72
+
73
+ # extend expiration of batch buffer to account for the duration of
74
+ # this request
75
+ elsif @is_batch_request
76
+ auth_header = @resource.extend_batch_buffer(@token, @client_id)
77
+
78
+ # update Authorization response header with new token
79
+ else
80
+ auth_header = @resource.create_new_auth_token(@client_id)
81
+
82
+ # update the response header
83
+ response.headers.merge!(auth_header)
84
+ end
85
+
86
+ end # end lock
87
+
88
+ end
89
+
90
+ def resource_class(m=nil)
91
+ if m
92
+ mapping = Devise.mappings[m]
93
+ else
94
+ mapping = Devise.mappings[resource_name] || Devise.mappings.values.first
95
+ end
96
+
97
+ mapping.to
98
+ end
99
+
100
+
101
+ private
102
+
103
+
104
+ def is_batch_request?(user, client_id)
105
+ user.tokens[client_id] and
106
+ user.tokens[client_id]['updated_at'] and
107
+ Time.parse(user.tokens[client_id]['updated_at']) > @request_started_at - DeviseTokenAuth.batch_request_buffer_throttle
108
+ end
109
+ end
@@ -0,0 +1,31 @@
1
+ module DeviseTokenAuth
2
+ class ConfirmationsController < DeviseTokenAuth::ApplicationController
3
+ def show
4
+ @resource = resource_class.confirm_by_token(params[:confirmation_token])
5
+
6
+ if @resource and @resource.id
7
+ # create client id
8
+ client_id = SecureRandom.urlsafe_base64(nil, false)
9
+ token = SecureRandom.urlsafe_base64(nil, false)
10
+ token_hash = BCrypt::Password.create(token)
11
+ expiry = (Time.now + DeviseTokenAuth.token_lifespan).to_i
12
+
13
+ @resource.tokens[client_id] = {
14
+ token: token_hash,
15
+ expiry: expiry
16
+ }
17
+
18
+ @resource.save!
19
+
20
+ redirect_to(@resource.build_auth_url(params[:redirect_url], {
21
+ token: token,
22
+ client_id: client_id,
23
+ account_confirmation_success: true,
24
+ config: params[:config]
25
+ }))
26
+ else
27
+ raise ActionController::RoutingError.new('Not Found')
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,171 @@
1
+ module DeviseTokenAuth
2
+ class OmniauthCallbacksController < DeviseTokenAuth::ApplicationController
3
+ skip_before_filter :set_user_by_token
4
+ skip_after_filter :update_auth_header
5
+
6
+ # intermediary route for successful omniauth authentication. omniauth does
7
+ # not support multiple models, so we must resort to this terrible hack.
8
+ def redirect_callbacks
9
+ # derive target redirect route from 'resource_class' param, which was set
10
+ # before authentication.
11
+ devise_mapping = request.env['omniauth.params']['resource_class'].underscore.to_sym
12
+ redirect_route = "#{Devise.mappings[devise_mapping].as_json["path_prefix"]}/#{params[:provider]}/callback"
13
+
14
+ # preserve omniauth info for success route
15
+ session['dta.omniauth.auth'] = request.env['omniauth.auth']
16
+ session['dta.omniauth.params'] = request.env['omniauth.params']
17
+
18
+ redirect_to redirect_route
19
+ end
20
+
21
+ def omniauth_success
22
+ # find or create user by provider and provider uid
23
+ @resource = resource_class.where({
24
+ uid: auth_hash['uid'],
25
+ provider: auth_hash['provider']
26
+ }).first_or_initialize
27
+
28
+ # create token info
29
+ @client_id = SecureRandom.urlsafe_base64(nil, false)
30
+ @token = SecureRandom.urlsafe_base64(nil, false)
31
+ @expiry = (Time.now + DeviseTokenAuth.token_lifespan).to_i
32
+
33
+ @auth_origin_url = generate_url(omniauth_params['auth_origin_url'], {
34
+ token: @token,
35
+ client_id: @client_id,
36
+ uid: @resource.uid,
37
+ expiry: @expiry
38
+ })
39
+
40
+ # set crazy password for new oauth users. this is only used to prevent
41
+ # access via email sign-in.
42
+ unless @resource.id
43
+ p = SecureRandom.urlsafe_base64(nil, false)
44
+ @resource.password = p
45
+ @resource.password_confirmation = p
46
+ end
47
+
48
+ @resource.tokens[@client_id] = {
49
+ token: BCrypt::Password.create(@token),
50
+ expiry: @expiry
51
+ }
52
+
53
+ # sync user info with provider, update/generate auth token
54
+ assign_provider_attrs(@resource, auth_hash)
55
+
56
+ # assign any additional (whitelisted) attributes
57
+ extra_params = whitelisted_params
58
+ @resource.assign_attributes(extra_params) if extra_params
59
+
60
+ # don't send confirmation email!!!
61
+ @resource.skip_confirmation!
62
+
63
+ sign_in(:user, @resource, store: false, bypass: false)
64
+
65
+ @resource.save!
66
+
67
+ # render user info to javascript postMessage communication window
68
+ respond_to do |format|
69
+ format.html { render :layout => "omniauth_response", :template => "devise_token_auth/omniauth_success" }
70
+ end
71
+ end
72
+
73
+
74
+ # break out provider attribute assignment for easy method extension
75
+ def assign_provider_attrs(user, auth_hash)
76
+ user.assign_attributes({
77
+ nickname: auth_hash['info']['nickname'],
78
+ name: auth_hash['info']['name'],
79
+ image: auth_hash['info']['image'],
80
+ email: auth_hash['info']['email']
81
+ })
82
+ end
83
+
84
+
85
+ def omniauth_failure
86
+ @error = params[:message]
87
+
88
+ respond_to do |format|
89
+ format.html { render :layout => "omniauth_response", :template => "devise_token_auth/omniauth_failure" }
90
+ end
91
+ end
92
+
93
+
94
+ # derive allowed params from the standard devise parameter sanitizer
95
+ def whitelisted_params
96
+ whitelist = devise_parameter_sanitizer.for(:sign_up)
97
+
98
+ whitelist.inject({}){|coll, key|
99
+ param = omniauth_params[key.to_s]
100
+ if param
101
+ coll[key] = param
102
+ end
103
+ coll
104
+ }
105
+ end
106
+
107
+ # pull resource class from omniauth return
108
+ def resource_class
109
+ if omniauth_params
110
+ omniauth_params['resource_class'].constantize
111
+ end
112
+ end
113
+
114
+ def resource_name
115
+ resource_class
116
+ end
117
+
118
+ # this will be determined differently depending on the action that calls
119
+ # it. redirect_callbacks is called upon returning from successful omniauth
120
+ # authentication, and the target params live in an omniauth-specific
121
+ # request.env variable. this variable is then persisted thru the redirect
122
+ # using our own dta.omniauth.params session var. the omniauth_success
123
+ # method will access that session var and then destroy it immediately
124
+ # after use.
125
+ def omniauth_params
126
+ if request.env['omniauth.params']
127
+ request.env['omniauth.params']
128
+ else
129
+ @_omniauth_params ||= session.delete('dta.omniauth.params')
130
+ @_omniauth_params
131
+ end
132
+ end
133
+
134
+ # this sesison value is set by the redirect_callbacks method. its purpose
135
+ # is to persist the omniauth auth hash value thru a redirect. the value
136
+ # must be destroyed immediatly after it is accessed by omniauth_success
137
+ def auth_hash
138
+ @_auth_hash ||= session.delete('dta.omniauth.auth')
139
+ @_auth_hash
140
+ end
141
+
142
+ # ensure that this controller responds to :devise_controller? conditionals.
143
+ # this is used primarily for access to the parameter sanitizers.
144
+ def assert_is_devise_resource!
145
+ true
146
+ end
147
+
148
+ # necessary for access to devise_parameter_sanitizers
149
+ def devise_mapping
150
+ if omniauth_params
151
+ Devise.mappings[omniauth_params['resource_class'].underscore.to_sym]
152
+ else
153
+ request.env['devise.mapping']
154
+ end
155
+ end
156
+
157
+ def generate_url(url, params = {})
158
+ auth_url = url
159
+
160
+ # ensure that hash-bang is present BEFORE querystring for angularjs
161
+ unless url.match(/#/)
162
+ auth_url += '#'
163
+ end
164
+
165
+ # add query AFTER hash-bang
166
+ auth_url += "?#{params.to_query}"
167
+
168
+ return auth_url
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,155 @@
1
+ module DeviseTokenAuth
2
+ class PasswordsController < DeviseTokenAuth::ApplicationController
3
+ before_filter :set_user_by_token, :only => [:update]
4
+ skip_after_filter :update_auth_header, :only => [:create, :edit]
5
+
6
+ # this action is responsible for generating password reset tokens and
7
+ # sending emails
8
+ def create
9
+ unless resource_params[:email]
10
+ return render json: {
11
+ success: false,
12
+ errors: ['You must provide an email address.']
13
+ }, status: 401
14
+ end
15
+
16
+ unless params[:redirect_url]
17
+ return render json: {
18
+ success: false,
19
+ errors: ['Missing redirect url.']
20
+ }, status: 401
21
+ end
22
+
23
+ # honor devise configuration for case_insensitive_keys
24
+ if resource_class.case_insensitive_keys.include?(:email)
25
+ email = resource_params[:email].downcase
26
+ else
27
+ email = resource_params[:email]
28
+ end
29
+
30
+ q = "uid='#{email}' AND provider='email'"
31
+
32
+ # fix for mysql default case insensitivity
33
+ if ActiveRecord::Base.connection.adapter_name.downcase.starts_with? 'mysql'
34
+ q = "BINARY uid='#{email}' AND provider='email'"
35
+ end
36
+
37
+ @resource = resource_class.where(q).first
38
+
39
+ errors = nil
40
+
41
+ if @resource
42
+ @resource.send_reset_password_instructions({
43
+ email: email,
44
+ provider: 'email',
45
+ redirect_url: params[:redirect_url],
46
+ client_config: params[:config_name]
47
+ })
48
+
49
+ if @resource.errors.empty?
50
+ render json: {
51
+ success: true,
52
+ message: "An email has been sent to #{email} containing "+
53
+ "instructions for resetting your password."
54
+ }
55
+ else
56
+ errors = @resource.errors
57
+ end
58
+ else
59
+ errors = ["Unable to find user with email '#{email}'."]
60
+ end
61
+
62
+ if errors
63
+ render json: {
64
+ success: false,
65
+ errors: errors
66
+ }, status: 400
67
+ end
68
+ end
69
+
70
+
71
+ # this is where users arrive after visiting the email confirmation link
72
+ def edit
73
+ @resource = resource_class.reset_password_by_token({
74
+ reset_password_token: resource_params[:reset_password_token]
75
+ })
76
+
77
+ if @resource and @resource.id
78
+ client_id = SecureRandom.urlsafe_base64(nil, false)
79
+ token = SecureRandom.urlsafe_base64(nil, false)
80
+ token_hash = BCrypt::Password.create(token)
81
+ expiry = (Time.now + DeviseTokenAuth.token_lifespan).to_i
82
+
83
+ @resource.tokens[client_id] = {
84
+ token: token_hash,
85
+ expiry: expiry
86
+ }
87
+
88
+ # ensure that user is confirmed
89
+ @resource.skip_confirmation! unless @resource.confirmed_at
90
+
91
+ @resource.save!
92
+
93
+ redirect_to(@resource.build_auth_url(params[:redirect_url], {
94
+ token: token,
95
+ client_id: client_id,
96
+ reset_password: true,
97
+ config: params[:config]
98
+ }))
99
+ else
100
+ raise ActionController::RoutingError.new('Not Found')
101
+ end
102
+ end
103
+
104
+ def update
105
+ # make sure user is authorized
106
+ unless @resource
107
+ return render json: {
108
+ success: false,
109
+ errors: ['Unauthorized']
110
+ }, status: 401
111
+ end
112
+
113
+ # make sure account doesn't use oauth2 provider
114
+ unless @resource.provider == 'email'
115
+ return render json: {
116
+ success: false,
117
+ errors: ["This account does not require a password. Sign in using "+
118
+ "your #{@resource.provider.humanize} account instead."]
119
+ }, status: 422
120
+ end
121
+
122
+ # ensure that password params were sent
123
+ unless password_resource_params[:password] and password_resource_params[:password_confirmation]
124
+ return render json: {
125
+ success: false,
126
+ errors: ['You must fill out the fields labeled "password" and "password confirmation".']
127
+ }, status: 422
128
+ end
129
+
130
+ if @resource.update_attributes(password_resource_params)
131
+ return render json: {
132
+ success: true,
133
+ data: {
134
+ user: @resource,
135
+ message: "Your password has been successfully updated."
136
+ }
137
+ }
138
+ else
139
+ return render json: {
140
+ success: false,
141
+ errors: @resource.errors
142
+ }, status: 422
143
+ end
144
+ end
145
+
146
+ def password_resource_params
147
+ params.permit(devise_parameter_sanitizer.for(:account_update))
148
+ end
149
+
150
+ def resource_params
151
+ params.permit(:email, :password, :password_confirmation, :reset_password_token)
152
+ end
153
+
154
+ end
155
+ end