Laravel Passport не будет создавать Laravel_token, а затем ошибка 401 будет отображаться при отсутствии аутентификации при использовании собственного API - PullRequest
0 голосов
/ 02 июля 2019

После нескольких дней изучения этой проблемы и прочтения всех вопросов / решений по ней я решил поделиться этой проблемой с вами, ребята.
Моя текущая основная проблема:
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

2) Отправка заголовков при использовании собственного API

enter image description here

1 Ответ

0 голосов
/ 02 июля 2019

Может потребоваться вставить токен пользователя в заголовок для выполнения вызовов API авторизации.

Authorization: Bearer {{$token}}

Я использовал это простое руководство: https://medium.com/techcompose/create-rest-api-in-laravel-with-authentication-using-passport-133a1678a876

...