Search code examples
laravellaravel-livewire

How to handle global middleware with Livewire on login page?


I have a login page where users can authenticate using a mobile OTP or an email OTP. I've also implemented a global middleware to validate user tokens. However, users are not authorized on the login page, so they can't pass the authorization check.

I've made an exception for the login page in the middleware, and I want to redirect users to it if they are not authorized. But in Livewire, the page has other requests that are not passing, causing the login page to redirect continuously.

Middleware

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
use Illuminate\Routing\Route;
use App\Models\User;
use carbon\carbon;

class check_token
{
    public function handle(Request $request, Closure $next): Response
    {
        if($request->is('login')){
            return $next($request);
        }

        if (session('user_id') != NULL) {
            $user = user::find(session('user_id'));
            $token_status = $user->token_status();

            if ($user && $token_status->token_is_valid && $token_status->token_is_live) {
                return $next($request);
            } elseif ($user && $token_status->token_is_valid && $token_status->token_is_live == false) {
                $user->settoken(3600);
                return $next($request);
            }
        }
    }
}

I have tried many articles and experiences for Laravel, but they need to be fixed in this case.


Solution

  • I solved this problem using the getResponseUri() function of the Request class. Also, know that Livewire sends a request with the path /livewire/update.

    Middleware

    namespace App\Http\Middleware;
        
        use Closure;
        use Illuminate\Http\Request;
        use Symfony\Component\HttpFoundation\Response;
        use Illuminate\Routing\Route;
        
        use App\Models\User;
        
        use carbon\carbon;
        
        class check_token
        {
            public function handle(Request $request, Closure $next): Response
            {
        
                if (\Request::getRequestUri() == '/livewire/update' && empty(session('user_id')) || \Request::getRequestUri() == '/login' && empty(session('user_id')) || \Request::getRequestUri() == '/login-verify') {
                    return $next($request);
                } else {
                    session()->flush();
                    return redirect()->route('login');
                }
            }
        }