Laravel 55 - Passport & Vue - авторизация / вход / выход

С laravel 55 я установил систему аутентификации, затем паспорт. Компоненты My Vue могут запрашивать API-интерфейсы, защищенные промежуточным программным обеспечением api: auth (используя CreateFreshApiToken в Kernel.php).

Таким образом, при использовании axios, если сделать запрос к /api/myroute, он будет правильно отвечать через настройку api.php

И если я сделаю запрос к / myroute, приложение ответит через настройку web.php

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

Если я использую стандартную страницу входа в систему для входа в приложение и если я уничтожаю веб-сеанс в базе данных, запросы axios к /api/myroute по-прежнему действительны.

Чтобы смоделировать конец сеанса (ответ 401), мне нужно сделать запрос axios к /logout (через web.php).

Но это то, где я заблудился. Я хотел бы имитировать принудительный выход из системы или конец сеанса для запросов API.

Как мы можем смешать паспортную аутентификацию для API и стандартных маршрутов аутентификации, чтобы нам не пришлось переделывать полную историю (вход, выход из системы, регистрация, отзыв, обновление) для приложения SPA, пожалуйста?

1 ответ

Вы можете разместить промежуточное ПО прямо на вашем api маршрут, так что:

php artisan make:middleware UserLoggedIn

Затем в этом промежуточном программном обеспечении вы бы сделали что-то вроде:

public function handle($request, Closure $next)
{
    $user = Auth::user();
    if(!$user->hasActiveSession()){
        // User has been logged out, return a 401
        return response('Not Authorized', 401);
    }


    return $next($request);
}

Очевидно, hasActiveSession метод должен быть размещен в вашем User модель для любой проверки, которую вы должны сделать, чтобы убедиться, что пользовательский сеанс активен.

Затем в Kernel.php добавить следующее к $routeMiddleware:

protected $routeMiddleware = [ 
    // ...other route middleware...
    'user.loggedIn' => UserLoggedIn::class
];

Затем на вашем маршруте API вы можете добавить промежуточное программное обеспечение:

Route::middleware(['auth:api','user.loggedIn'])->get('/myRoute','MyController@myMethod')
Другие вопросы по тегам