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')