Class: DeviseTokenAuth::PasswordsController

Inherits:
ApplicationController
  • Object
show all
Defined in:
app/controllers/devise_token_auth/passwords_controller.rb

Instance Method Summary collapse

Instance Method Details

#create ⇒ Object

this action is responsible for generating password reset tokens and sending emails



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'app/controllers/devise_token_auth/passwords_controller.rb', line 8

def create
  unless resource_params[:email]
    return render json: {
      success: false,
      errors: ['You must provide an email address.']
    }, status: 401
  end

  unless params[:redirect_url]
    return render json: {
      success: false,
      errors: ['Missing redirect url.']
    }, status: 401
  end

  # honor devise configuration for case_insensitive_keys
  if resource_class.case_insensitive_keys.include?(:email)
    email = resource_params[:email].downcase
  else
    email = resource_params[:email]
  end

  q = "uid='#{email}' AND provider='email'"

  # fix for mysql default case insensitivity
  if ActiveRecord::Base.connection.adapter_name.downcase.starts_with? 'mysql'
    q = "BINARY uid='#{email}' AND provider='email'"
  end

  @resource = resource_class.where(q).first

  errors = nil

  if @resource
    @resource.send_reset_password_instructions({
      email: email,
      provider: 'email',
      redirect_url: params[:redirect_url],
      client_config: params[:config_name]
    })

    if @resource.errors.empty?
      render json: {
        success: true,
        message: "An email has been sent to #{email} containing "+
          "instructions for resetting your password."
      }
    else
      errors = @resource.errors
    end
  else
    errors = ["Unable to find user with email '#{email}'."]
  end

  if errors
    render json: {
      success: false,
      errors: errors
    }, status: 400
  end
end

#edit ⇒ Object

this is where users arrive after visiting the email confirmation link



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# File 'app/controllers/devise_token_auth/passwords_controller.rb', line 72

def edit
  @resource = resource_class.reset_password_by_token({
    reset_password_token: resource_params[:reset_password_token]
  })

  if @resource and @resource.id
    client_id  = SecureRandom.urlsafe_base64(nil, false)
    token      = SecureRandom.urlsafe_base64(nil, false)
    token_hash = BCrypt::Password.create(token)
    expiry     = (Time.now + DeviseTokenAuth.token_lifespan).to_i

    @resource.tokens[client_id] = {
      token:  token_hash,
      expiry: expiry
    }

    # ensure that user is confirmed
    @resource.skip_confirmation! unless @resource.confirmed_at

    @resource.save!

    redirect_to(@resource.build_auth_url(params[:redirect_url], {
      token:          token,
      client_id:      client_id,
      reset_password: true,
      config:         params[:config]
    }))
  else
    raise ActionController::RoutingError.new('Not Found')
  end
end

#password_resource_params ⇒ Object



146
147
148
# File 'app/controllers/devise_token_auth/passwords_controller.rb', line 146

def password_resource_params
  params.permit(devise_parameter_sanitizer.for(:account_update))
end

#resource_params ⇒ Object



150
151
152
# File 'app/controllers/devise_token_auth/passwords_controller.rb', line 150

def resource_params
  params.permit(:email, :password, :password_confirmation, :reset_password_token)
end

#update ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
# File 'app/controllers/devise_token_auth/passwords_controller.rb', line 104

def update
  # make sure user is authorized
  unless @resource
    return render json: {
      success: false,
      errors: ['Unauthorized']
    }, status: 401
  end

  # make sure account doesn't use oauth2 provider
  unless @resource.provider == 'email'
    return render json: {
      success: false,
      errors: ["This account does not require a password. Sign in using "+
               "your #{@resource.provider.humanize} account instead."]
    }, status: 422
  end

  # ensure that password params were sent
  unless password_resource_params[:password] and password_resource_params[:password_confirmation]
    return render json: {
      success: false,
      errors: ['You must fill out the fields labeled "password" and "password confirmation".']
    }, status: 422
  end

  if @resource.update_attributes(password_resource_params)
    return render json: {
      success: true,
      data: {
        user: @resource,
        message: "Your password has been successfully updated."
      }
    }
  else
    return render json: {
      success: false,
      errors: @resource.errors
    }, status: 422
  end
end