How to Reset Password without entering email field

Viewed 63

I'm creating a reset password with the help of the internet I'm able to make it function, but it needs to input an email address in the email field. I want to hide the email field and only the password field need to input. How can i do that?

My ForgotPasswordController

class ForgotPasswordController extends Controller
{
public function getEmail()
{
    return view('auth.passwords.email');
}

public function postEmail(Request $request)
{
    $request->validate([
        'email' =>  'required|email|exists:users',
    ]);

    $token = Str::random(60);

    DB::table('password_resets')->insert(
        ['email' => $request->email, 'token' => $token, 'created_at' => Carbon::now()]
    );
    Mail::send('auth.verify',['token' => $token], function($message) use ($request) {
        $message->from('noreply@taskproph.com');
        $message->to($request->email);
        $message->subject('Reset Password Notification');
    });
    Toastr::success('We have e-mailed your password reset link! :)','Success');
    return back();
  }
}

My ResetPasswordController

class ResetPasswordController extends Controller

{
   public function getPassword($token)
   {
       return view('auth.passwords.reset', ['token' => $token]);
   }
   public function updatePassword(Request $request)
   {
      $request->validate([
        'email' =>  'required|email|exists:users',
        'password' => 'required|string|min:6|confirmed',
        'password_confirmation' => 'required',
    ]);

    $updatePassword = DB::table('password_resets')->where(['email' => $request->email, 'token' => $request->token])->first();
    if(!$updatePassword)
    {
        Toastr::error('Invalid token! :)','Error');
        return back();
    }else{

        $user = User::where('email', $request->email)->update(['password' => Hash::make($request->password)]);
        DB::table('password_resets')->where(['email' => $request->email ])-> delete();
        Toastr::success('Your Password has been changed! :)','Success');
        return redirect('/login');
    }
  }
}
1 Answers

In your getPassword method you may get email. Then you can use it email to updatePassword method by passing on it hiddenly.

use Illuminate\Auth\Events\PasswordReset;
use Illuminate\Support\Facades\Password;

public function getPassword(Request $request, $token)
{
    $email = $request->input('email');

    $user = User::where('email', $email)->firstOrFail();

    if(!Password::tokenExists($user, $token)) {

        Toastr::error('Invalid token!','Error');

        return redirect()->route('password.request');
    }

    return view('auth.passwords.reset', ['token' => $token, 'email' => $email ]);
}

public function updatePassword(ResetPasswordRequest $request)
{
    $credentials = $request->validated(); // email, token, password, password_confirmation

    $status = Password::reset($credentials, function($user) use($request) {

        $user->forceFill([

            'password' => bcrypt($request->password)

        ])->save();

        event(new PasswordReset($user));
    });

    if ($status != Password::PASSWORD_RESET) {

        Toastr::error(__($status), 'Error');

        return back();
    }

    $request->session()->flash('statusForgotPassword',  __($status));

    Toastr::success('Your Password has been changed!','Success');

    return redirect('/login');
}

auth.passwords.reset

<input type="hidden" name="email" value="{{ $email }}">
Related