После нескольких дней изучения этой проблемы и прочтения всех вопросов / решений по ней я решил поделиться этой проблемой с вами, ребята.
Моя текущая основная проблема:
laravel_token не создается с использованием паспорта Laravel, использующего собственный API.
Однако он создается, когда пользователь вошел в систему.
Работает на:
- Бродячий локальный хост, окно 10
- Laravel 5.8
- Паспорт: 7,3
- Использование нескольких охранников для API
- Использование Axios для использования API
- Использование Vue для отправки формы
Краткое описание проекта
Иметь API системы размещения заказов для размещения заказов как администратором, так и посетителями сайта.
Он собирается использовать API для обоих.
Итак, у меня есть 2 охранника: администраторы, пользователи
Вот что я сделал:
вот мой конфиг \ auth.php:
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'admin' => [
'driver' => 'session',
'provider' => 'admins'
],
'admin-api' => [
'driver' => 'passport',
'provider' => 'admins'
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
- Добавлены HasApiTokens, в моделях User и Admin
- Добавлено имя охранника в моделях Admin
Модель администратора
protected $guard = 'admin';
protected $guard_name = 'admin';
приложение \ Http \ Kernel.php
protected $middlewareGroups = [
'web' => [
....
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],
'api' => [
'throttle:60,1',
'bindings',
],
приложение \ Providers \ AuthServiceProvider.php
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensExpireIn(Carbon::now()->addDays(15));
Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
}
Маршрут API
...
//admin CRUD orders
Route::middleware('auth:admin-api')->group(function(){
Route::apiResource('orders', 'Api\OrderController');
}); //works fine because admin user needs to login
//when consuming own API, wont work!!
//I was thinking passport needs a GET request to
//create Cookie, it is still not working if I remove it
Route::middleware('auth:api')->group(function(){
Route::get('orders/refresh-token', 'Api\OrderController@refreshToken')->name('orders.refresh-token');
//when form is submitted
Route::put('orders/complete-store-order', 'Api\OrderController@completetStore')->name('orders.complete-store-order');
});
...
Добавлены заголовки при компиляции js-файла:
let token = document.head.querySelector('meta[name="csrf-token"]');
window.axios.defaults.headers.common = {
'X-Requested-With': 'XMLHttpRequest',
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-CSRF-TOKEN': token.content,
};
Моя текущая проблема:
Файл cookie laravel_token
не создается при использовании собственного API, однако он генерируется при входе в систему Admin user
!
Что я нашел в паспортных файлах:
1) При использовании собственного API в файле vendor\laravel\passport\src\Http\Middleware\CreateFreshApiToken.php
строка 48 под функцией handle: $ gurad is null
2) При использовании собственного API в одной и той же строке файла: 83 для функции: requestShouldReceiveFreshToken
: $request->user($this->guard)
всегда null
, потому что нет пользователя, но при использовании Passport, когда Пользователь зарегистрировался, это НЕ пусто, и он сгенерирует Cookie и отлично работает.
Как пользователь заполняется при использовании собственного API ??
Вот несколько снимков экрана с заголовками моих запросов, которые могут помочь:
1) заголовок запроса содержит, когда пользователь Admin вошел в систему:
![enter image description here](https://i.stack.imgur.com/rNyv1.png)
2) Отправка заголовков при использовании собственного API
![enter image description here](https://i.stack.imgur.com/Ywta3.png)