2017-09-20 1 views
-1

Je travaille actuellement sur forgot API de mot de passe et reset API de mot de passe dans Laravel 5.5. Actuellement, je n'ai aucune idée de comment valider le mot de passe après avoir cliqué sur le lien dans l'email et montrer le réinitialiser le mot de passe et confirmer le mot de passe. J'ai envoyé le jeton avec l'email.Valider jeton après la redirection de mot de passe oublié email lien

La chose est avant de demander un mot de passe et de confirmer le mot de passe que je dois d'abord vérifier le jeton si c'est un jeton valide de la table et sa date d'expiration. Quelqu'un peut-il me guider d'une certaine façon comment faire cela?

Voici mon mot de passe oublié.

public function forgotPasswordApi(Request $request){ 
    $rawPostData = json_decode($request->getContent(), true); 

    if(isset($rawPostData['email'])) { 
     $user = UserModel::where('email',$rawPostData['email'])->first(); 
     $token=TokenModel::where('user_id',$user->id)->first(); 
     if($user){ 
      if(!$token){ 
       $token=new TokenModel; 
       $token->token=md5(uniqid().$token->id); 
       $token->token_code = TokenModel::$forgotPasswordToken; 
       $token->expire_date = date("F j, Y, H:i:s", strtotime('+24 hour')); 
       $token->user_id=$user->id; 
       $token->save(); 
      } 
      Mail::raw($user, function ($message) use ($user){ 
       $token=TokenModel::where('user_id',$user->id)->first(); 
       $message->to($user['email']) 
       ->subject('Forgot Password Subject') 
       ->setBody('To reset password. Click on the following URL. '.url('/password/reset/?token=').$token->token); 
      }); 
     } 
     $data['status'] = 'success'; 
     $data['msg'] = $token; 
    }else{ 
     $data['status']='fail'; 
     $data['msg']='Missing required paramater'; 
    } 
    return new JsonResponse($data); 
} 

Note: Mail avec le lien de réinitialisation a été envoyé avec succès, mais je n'ai pas idée de passer par un mot de passe de réinitialisation avec ce lien.

Email Exemple

To reset password. Click on the following URL. 
http://127.0.0.1:8000/password/reset?token=fca709c8a8ef5ff61aa5bb73e475c602 

Voici mon mot de passe de réinitialisation incomplète

public function resetPasswordApi(Request $request){ 

    if(Input::has('token')) 
    { 
     $token_input = Input::get('token'); 

     $token = DB::tables('tokens') 
     ->where('token',$token_input) 
     ->where('expire_date','>=',Carbon::now()->subHours(12)) 
     ->first(); 
    }else{ 
     dd('input value not found'); 
    } 


    $rawPostData = json_decode($request->getContent(), true); 
    if($token) 
    { 
     if(isset($rawPostData['password'],$rawPostData['confirm_password'])) 
     { 
      if($rawPostData['password'] === $rawPostData['confirm_password']) 
      { 
       $updatedUser = UserModel::where('id',$token->user_id)->first(); 
       $updatedUser->password = bcrypt($rawPostData['password']); 
       $updatedUser->save(); 

       $data['status'] = 'success'; 
      } 
      else 
      { 
       $data['status']='fail'; 
       $data['msg']='Password and Confirm Password Match failed.'; 
      } 
     } 
     else 
     { 
      $data['status']='fail'; 
      $data['msg']='Missing required paramater'; 
     } 
    } 
    else 
    { 
     $data['status']='fail'; 
     $data['msg']='Missing required paramater'; 
    } 
     return new JsonResponse($data); 
    } 
} 
+0

Y a-t-il une raison pour laquelle vous n'utilisez pas [l'authentification Laravel intégrée] (https://laravel.com/docs/5.5/authentication)? Laravel gère déjà tout cela. –

Répondre

0

Voici un échantillon d'un de mes propres applications, que je vais vous parler par:

public function resetPassAction() 
    { 
     $email = $this->_request->getParam('email'); 
     $token = $this->_request->getParam('token'); 

     $user = $this->getUserService()->findUserByEmail($email); 
     if (!$user) { 
      throw new Zend_Controller_Action_Exception(UserException::USER_NOT_FOUND); 
     } 

     try { 
      $link = $this->getUserService()->findEmailLink($email, $token); 
     } catch (EmailLinkException $e) { 
      $this->view->message = [$e->getMessage(), 'danger']; 
      return; 
     } catch (Exception $e) { 
      throw $e; 
     } 

     $form = new Application_Form_ResetPass(); 


     if ($this->getRequest()->isPost()) { 

      $data = $this->getRequest()->getParams(); 

      if ($form->isValid($data)) { 

       if ($data['password'] == $data['confirm']) { 
        $this->getUserService()->changePassword($user, $data['password']); 
        $this->getUserService()->deleteEmailLink($link); 
        $this->view->message = [' You have successfully changed your password.', 'success']; 
        $this->view->success = true; 
       } else { 
        $this->view->message = $this->view->message = ['Passwords did not match, please try again.', 'danger']; 
        $this->view->form = $form; 
       } 
      } else { 
       $this->view->form = $form; 
      } 
     } else { 
      $this->view->form = $form; 
     } 

Nous obtenons donc l'adresse e-mail et le jeton de la requête GET, puis trouvons l'utilisateur dans la base de données.

Ensuite, nous trouvons le "Email Link". Ceci est juste une ligne avec un identifiant d'utilisateur, une chaîne de jetons et une date d'expiration. Si la méthode findEmailLink() lève une exception, c'est parce que le jeton n'a pas été trouvé dans la base de données ou a expiré.

Le code de la ligne $form = //etc est le code actuel du mot de passe de modification, ce qui ne vous inquiète pas.

Voici le code réel findEmailLink():

public function findEmailLink($email, $token) 
    { 
     $link = $this->getEmailLinkRepository()->findByToken($token); 
     if(!$link) { 
      throw new EmailLinkException(EmailLinkException::LINK_NOT_FOUND); 
     } 
     if($link->getUser()->getEmail() != $email) { 
      throw new EmailLinkException(EmailLinkException::LINK_NO_MATCH); 
     } 
     if($link->getExpiryDate() < new DateTime()) { 
      throw new EmailLinkException(EmailLinkException::LINK_EXPIRED); 
     } 
     return $link; 
    } 

Tout cela ne le fetch, vérifiez qu'il correspond à l'ID de l'utilisateur, et vérifie la date d'expiration est encore à l'avenir. Sinon, il lance l'exception, auquel cas vous ne voulez pas afficher votre formulaire! J'espère que cela vous aidera à comprendre la réinitialisation des flux d'e-mail!