Sometimes we need a login system in our laravel application with remember me functionality. But many times developer face problem like laravel remember me not working. So I am here to show you the example of laravel remember me lifetime with login example.

I will share the source code of laravel remember me cookie so that you can implement laravel login system with remember me with expiration time. 

First, we need the remember_token field in our users table. if you haven't remember_token column then first add it to your users table or any table that you use for auth.

To create this system, first create a trait like:

App\Services\Login\RememberMeExpiration.php

<?php

namespace App\Services\Login;

use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Cookie;

trait RememberMeExpiration
{
	/**
     * Set default minutes expiration
     *
     * @var int
     */
	protected $minutesExpiration = 43200; //equivalent of 30 days

	/**
	 * Customize the user logged remember me expiration 
	 * 
	 * @param  \Illuminate\Contracts\Auth\Authenticatable  $user
	 */
	public function setRememberMeExpiration($user) 
	{
		Cookie::queue($this->getRememberMeSessionName(), encrypt($this->setRememberMeValue($user)), $this->minutesExpiration);
	}

	/**
	 * Generate remember me value
	 *
	 * @return string
	 */
	protected function setRememberMeValue($user) 
	{
	    return $user->id . "|" . $user->remember_token . "|" . $user->password;
	}

	/**
	 * Get remember me session name
	 *
	 * @return string
	 */
	protected function getRememberMeSessionName() 
	{
	    return Auth::getRecallerName();
	}
}

 

Now, update the LoginController with the following code: 

app\Http\Controllers\LoginController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Http\Requests\LoginRequest;
use Illuminate\Support\Facades\Auth;
use App\Services\Login\RememberMeExpiration;

class LoginController extends Controller
{
    use RememberMeExpiration;

    /**
     * Display login page.
     * 
     * @return Renderable
     */
    public function show()
    {
        return view('auth.login');
    }

    /**
     * Handle account login request
     * 
     * @param LoginRequest $request
     * 
     * @return \Illuminate\Http\Response
     */
    public function login(LoginRequest $request)
    {
        $credentials = $request->getCredentials();

        if(!Auth::validate($credentials)):
            return redirect()->to('login')
                ->withErrors(trans('auth.failed'));
        endif;

        $user = Auth::getProvider()->retrieveByCredentials($credentials);

        Auth::login($user, $request->get('remember'));

        if($request->get('remember')):
            $this->setRememberMeExpiration($user);
        endif;

        return $this->authenticated($request, $user);
    }

    /**
     * Handle response after user authenticated
     * 
     * @param Request $request
     * @param Auth $user
     * 
     * @return \Illuminate\Http\Response
     */
    protected function authenticated(Request $request, $user) 
    {
        return redirect()->intended();
    }
}

 

And now update the login request like below:

app\Http\Requests\LoginRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Factory as ValidationFactory;

class LoginRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            'username' => 'required',
            'password' => 'required'
        ];
    }

    /**
     * Get the needed authorization credentials from the request.
     *
     * @return array
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    public function getCredentials()
    {
        // The form field for providing username or password
        // have name of "username", however, in order to support
        // logging users in with both (username and email)
        // we have to check if user has entered one or another
        $username = $this->get('username');

        if ($this->isEmail($username)) {
            return [
                'email' => $username,
                'password' => $this->get('password')
            ];
        }

        return $this->only('username', 'password');
    }

    /**
     * Validate if provided parameter is valid email.
     *
     * @param $param
     * @return bool
     * @throws \Illuminate\Contracts\Container\BindingResolutionException
     */
    private function isEmail($param)
    {
        $factory = $this->container->make(ValidationFactory::class);

        return ! $factory->make(
            ['username' => $param],
            ['username' => 'email']
        )->fails();
    }
}

 

Read also: Laravel 9 Login With Username Or Email

 

Conclusion

Now we know laravel remember me lifetime login system. Hope this laravel remember me cookie tutorial will help you to login system with remember me with expiration time in laravel application.

Category : #laravel

Tags : #laravel , #laravel auth