Можно ли использовать промежуточное ПО auth и auth: api на одном контроллере в Laravel? - PullRequest
0 голосов
/ 06 сентября 2018

Я получил задачу реализовать API для мобильных устройств с использованием Laravel Passport (для поддержки OAUTH2). Я хочу использовать те же методы контроллера (некоторые из них), которые я использую на веб-сайте. Я пытался сделать это:

public function __construct()
{
    $this->middleware('auth');
    $this->middleware('auth:api');
}

Но это не работает (почему?). Нужно ли создавать новые контроллеры для API? Спасибо!

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Если вы хотите, чтобы 2 разные проверки подлинности проверяли пользователя, вы можете сделать это с помощью промежуточного программного обеспечения auth. Требуется неопределенное количество параметров:

auth:web,api

Это будет проверять каждого охранника для пользователя, пока он не будет возвращен, а затем использовать его в качестве текущего защитника для запроса.

То, что у вас есть, это 2 разных промежуточных ПО, запускаемых в стеке. Поскольку только один из них на самом деле пройдет, вы всегда «не аутентифицированы» с вашей настройкой. (если у вас нет сеанса и вы передаете токен по какой-то странной причине).

SO - Laravel двух разных аутентификации промежуточного программного обеспечения только от auth middleware

SO - Многоуровневое промежуточное программное обеспечение защиты маршрута Laravel не работает

0 голосов
/ 06 сентября 2018

В вашем файле маршрутов вы можете указать несколько промежуточных программ, выполнив.

Route::middleware(['auth:api', 'auth'])->group(function() {
    //my routes
});

Но, похоже, вы можете использовать auth:api в вашем файле API-маршрутов и auth в вашем файле веб-маршрутов.

Кроме того, если вы хотите использовать промежуточное программное обеспечение для всего контроллера без группировки по маршрутам, вы можете использовать группы промежуточного программного обеспечения.

В вашем Http Kernel.php добавьте новый индекс в массив $middlewareGroups

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
    ],

    'api' => [
        'throttle:60,1',
        'auth:api',
    ],

    'both' => [
        'auth:api',
        'auth'
    ],
];

Тогда в вашем контроллере вы сможете сделать:

public function __construct() {
    $this->middleware('both');
}

Кроме того, вы можете исключить методы внутри контроллера из группы промежуточного программного обеспечения.

public function __construct() {
    $this->middleware('both', ['except' => [ 'methodOne', 'methodTwo' ]]);
}
...