title: Laravel passport / allow api routes for guests / bypass Laravel api middleware
body: <p>This is the only one solution for <strong>passport authentication</strong> that I have found for a week of struggles. Enjoy!</p>
  <p>Paste code bellow in file app/Http/Middleware/Authenticate.php</p>
  <pre><code>&lt;?php
  
  namespace App\Http\Middleware;
  
  use Closure;
  use Illuminate\Auth\Middleware\Authenticate as Middleware;
  use Illuminate\Auth\AuthenticationException;
  use Illuminate\Contracts\Auth\Factory as Auth;
  
  class Authenticate extends Middleware
  {
      /**
       * The authentication factory instance.
       *
       * @var \Illuminate\Contracts\Auth\Factory
       */
      protected $auth;
  
      /**
       * Create a new middleware instance.
       *
       * @param  \Illuminate\Contracts\Auth\Factory  $auth
       * @return void
       */
      public function __construct(Auth $auth)
      {
          $this-&gt;auth = $auth;
      }
  
      /**
       * Handle an incoming request.
       *
       * @param  \Illuminate\Http\Request  $request
       * @param  \Closure  $next
       * @param  string[]  ...$guards
       * @return mixed
       *
       * @throws \Illuminate\Auth\AuthenticationException
       */
      public function handle($request, Closure $next, ...$guards)
      {
          $this-&gt;authenticate($guards);
  
          return $next($request);
      }
  
      /**
       * Determine if the user is logged in to any of the given guards.
       *
       * @param  array  $guards
       * @return void
       *
       * @throws \Illuminate\Auth\AuthenticationException
       */
      protected function authenticate(array $guards)
      {
  
          if (empty($guards)) {
              return $this-&gt;auth-&gt;authenticate();
          }
  
          foreach ($guards as $guard) {
              if ($this-&gt;auth-&gt;guard($guard)-&gt;check()) {
                  return $this-&gt;auth-&gt;shouldUse($guard);
              }else{
                  return null;
              }
          }
  
          throw new AuthenticationException('Unauthenticated.', $guards);
      }
  }
  </code></pre>
  <p><strong>After this, all routes will be available for guests.</strong></p>
  <p>Create new middleware DenyIfNotAuthenticated. Add there code from default app/Http/Middleware/Authenticate.php. It will be like this:</p>
  <pre><code>&lt;?php
  
  namespace App\Http\Middleware;
  
  use Illuminate\Auth\Middleware\Authenticate as Middleware;
  
  class DenyIfNotAuthenticated extends Middleware
  {
      /**
       * Get the path the user should be redirected to when they are not authenticated.
       *
       * @param  \Illuminate\Http\Request  $request
       * @return string|null
       */
      protected function redirectTo($request)
      {
          if (! $request-&gt;expectsJson()) {
              return route('login');
          }
      }
  }
  </code></pre>
  <p>Add to Kernel.php file line: 'auth.deny' =&gt; \App\Http\Middleware\DenyIfNotAuthenticated::class, bellow 'auth' =&gt; \App\Http\Middleware\Authenticate::class,</p>
  <p>Routs in routes/api.php looks like this:</p>
  <pre><code>Route::apiResource('recipes', 'RecipesController'); // accessible for guests
  
  Route::group(['middleware' =&gt; ['auth.deny:api']], function () {
      Route::get('ingredients', 'IngredientsController@index');
  }); // accessible only for authorized users
  </code></pre>