Паспорт Laravel / разрешить маршруты api для гостей / обойти промежуточное ПО Laravel api

Это единственное решение для аутентификации паспорта, которое я нашел за неделю борьбы. Наслаждайтесь!

Вставьте код ниже в файл app / Http / Middleware / Authenticate.php

<?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->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->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->auth->authenticate();
        }

        foreach ($guards as $guard) {
            if ($this->auth->guard($guard)->check()) {
                return $this->auth->shouldUse($guard);
            }else{
                return null;
            }
        }

        throw new AuthenticationException('Unauthenticated.', $guards);
    }
}

После этого все маршруты будут доступны для гостей.

Создайте новое промежуточное ПО DenyIfNotAuthenticated. Добавьте туда код из приложения по умолчанию /Http/Middleware/Authenticate.php. Это будет так:

<?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->expectsJson()) {
            return route('login');
        }
    }
}

Добавьте в файл Kernel.php строку: 'auth.deny' => \App\Http\Middleware\DenyIfNotAuthenticated::class, ниже 'auth' => \App\Http\Middleware\Authenticate::class,

Маршруты в routes / api.php выглядят так:

Route::apiResource('recipes', 'RecipesController'); // accessible for guests

Route::group(['middleware' => ['auth.deny:api']], function () {
    Route::get('ingredients', 'IngredientsController@index');
}); // accessible only for authorized users

1 ответ

      Symfony\Component\ErrorHandler\Error\FatalError: Declaration of App\Http\Middleware\Authenticate::authenticate(array $guards) must be compatible with Illuminate\Auth\Middleware\Authenticate::authenticate($request, array $guards) in file ../app/Http/Middleware/Authenticate.php on line 55

Он показывает эти ошибки

Другие вопросы по тегам