Hello Reader's!,If you want to add forgot password field in your login page and send the forgot password link through mail Then I wrote this blog for you.
// first create a forgot password link in your login page and allow forgot password page access before login
<?php echo $this->Html->link('Forgot Password',array('controller'=>'Users','action'=>'forgetpwd'));?>
// Gives the page access in controller before doing Anywork
parent::beforeFilter();
$this->Auth->allow('forgetpwd','reset');
// create forgotpwd.ctp in /view/Users/forgotpwd.ctp
<div class="forgetpwd form" style="margin:5px auto 5px auto;width:450px;">
<?php echo $this->Form->create('User', array('action' => 'forgetpwd')); ?>
<?php echo $this->Form->input('email',array('style'=>'float:left'));?>
<input type="submit" class="button" style="float:left;margin-left:3px;" value="Recover" />
<?php echo $this->Form->end();?>
</div>
//set the smtp setting for sending email in config/email.php copy below code as default
public $default = array(
'transport' => 'Smtp',
'from' => array('noreply@ishake.com' => 'Login Reset'),
'host' => 'ssl://smtp.gmail.com',
'port' => 465,
'timeout' => 30,
'username' => 'gmail_id',
'password' => 'Password',
'client' => null,
'log' => false,
'emailFormat' => 'html',
'charset' => 'utf-8',
'headerCharset' => 'utf-8',
);
//App Controller Function for set the mail in appcontroller
public function send_mail($email_data = null)
{
$email = new CakeEmail('default');
$email_to = $email_data['to'];
$email_msg = $email_data['body'];
$email_subject = $email_data['subject'];
$email->to($email_to);
$email->subject($email_subject);
$mail_status = @$email->send($email_msg);
if (!$mail_status) {
return FALSE;
}
return TRUE;
}
//Add Tokenhash field in user table
//create the function which create the token for user and save it in user table for varification user email id
public function forgetpwd()
{
$this->User->recursive=-1;
if(!empty($this->data))
{
if(empty($this->data['User']['email']))
{
$this->Session->setFlash('Please Provide Your Email Adress that You used to Register with Us');
}
else
{
$email=$this->data['User']['email'];
$fu = $this->User->find('first', array('conditions' => array('User.email' => $email)));
if($fu)
{
if($fu['User']['user_status']=='1')
{
$key = Security::hash(CakeText::uuid(),'sha512',true);
$hash=sha1($fu['User']['username'].rand(0,100));
$url = Router::url( array('controller'=>'Users','action'=>'reset'), true ).'/'.$key.'#'.$hash;
$ms=$url;
$ms=wordwrap($ms,1000);
$fu['User']['tokenhash']=$key;
$this->User->id=$fu['User']['id'];
if($this->User->saveField('tokenhash',$fu['User']['tokenhash']))
{
$this->set('ms', $ms);
$data = array();
$data['to'] = $fu['User']['email'];
$data['subject'] = 'Reset Password';
$data['body'] =$ms;
$output =$this->send_mail($data);
//This is a function in appcontroller which send the mail to registerd user (see below this function)
if($output){
$this->Session->setFlash('Check Your Mail Id for Reset Your password');
$this->redirect(array('controller'=>'users','action'=>'login'));
}
}
else{
$this->Session->setFlash("Error Generating Reset link");
}
}
else
{
$this->Session->setFlash('This Account is not Active yet.Check Your mail to activate it');
}
}
else
{
$this->Session->setFlash('Email does Not Exist');
}
}
}
}
//now create Reset Password Code which get user token and validate befor updation
public function reset($token=null)
{
$this->User->recursive=-1;
if(!empty($token))
{
$u=$this->User->findBytokenhash($token);
if(!empty($u))
{
$this->User->id=$u['User']['id'];
if(!empty($this->data))
{
$this->User->data=$this->data;
$this->User->data['User']['username']=$u['User']['username'];
$new_hash=sha1($u['User']['username'].rand(0,100));//created token
$this->User->data['User']['tokenhash']=$new_hash;
if($this->User->validates(array('fieldList' => array('password', 'password_confirm'))))
{
if($this->User->save($this->User->data))
{
$this->Session->setFlash('Password Has been Updated');
$this->redirect(array('controller'=>'users','action'=>'login'));
}
}
else{
$this->set('errors',$this->User->invalidFields());
}
}
}
else
{
$this->Session->setFlash('Token Corrupted,,Please Retry.the reset link work only for once.');
}
}
else
{
$this->Session->setFlash('Invalid Token,Try Again');
$this->redirect(array('controller'=>'users','action'=>'login'));
}
}
Hope this will be helpful for you!!! Contact me if there is any problem:)
3 Comment(s)