{{TOC}} {{DOCVER 5.3=c06d6a2352ed8c767633aab9c20f2bf7d880c967 28.01.2017 5:00:51}} == Введение == В Laravel можно легко настроить аутентификацию через обычные формы входа, но что насчёт API? API обычно использует токены для аутентификации пользователей и не сохраняет состояние сессии между запросами. В Laravel реализована простая API аутентификация с помощью Laravel Passport, который предоставляет полную реализацию сервера OAuth2 для вашего приложения в считанные минуты. Passport создан на основе сервера ((https://github.com/thephpleague/oauth2-server League OAuth2)), созданного Алексом Билби. .(alert) Предполагается, что вы уже знакомы с OAuth2. Если вы ничего не знаете о OAuth2, рекомендуем ознакомиться с основной терминологией и возможностями OAuth2 самостоятельно перед прочтением этой статьи. == Установка == Сначала установите Passport через менеджер пакетов Composer: %% composer require laravel/passport %% Затем зарегистрируйте сервис-провайдер Passport в массиве %%providers%% в файле настроек %%(t)config/app.php%%: %% Laravel\Passport\PassportServiceProvider::class, %% Сервис-провайдер Passport регистрирует свой собственный каталог миграций БД в фреймворке, поэтому вам надо мигрировать вашу БД после регистрации провайдера. Миграции Passport создадут таблицы, необходимые вашему приложению для хранения клиентов и токенов доступа: %%(sh) php artisan migrate %% Затем выполните команду %%(sh)passport:install%%. Она создаст ключи шифрования, необходимые для генерирования надёжных токенов доступа. Кроме того команда создаст клиентов "personal access" (персональный доступ) и "password grant" (предоставление пароля), которые будут использоваться для генерирования токенов доступа: %%(sh) php artisan passport:install %% После выполнения этой команды добавьте типаж %%(t)Laravel\Passport\HasApiTokens%% в свою модель %%(t)App\User%%. Этот типаж предоставит вашей модели несколько вспомогательных методов, которые позволят вам проверять токен и права аутентифицированного пользователя: %% 'App\Policies\ModelPolicy', ]; /** * Регистрация всех сервисов аутентификации / авторизации. * * @return void */ public function boot() { $this->registerPolicies(); Passport::routes(); } } %% И наконец, в файле настроек %%(t)config/auth.php%% задайте значение %%passport%% параметру %%driver%% защитника аутентификации %%api%%. После этого ваше приложение будет использовать %%TokenGuard%% от Passport при аутентификации входящих API-запросов: %% 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'passport', 'provider' => 'users', ], ], %% === Быстрое знакомство с фронтендом === .(alert) Чтобы использовать Vue-компоненты Passport, вам необходимо использовать JavaScript-фреймворк ((https://vuejs.org Vue)). Эти компоненты также используют CSS-фреймворк Bootstrap. Но даже если вы не используете эти фреймворки, компоненты будут хорошим образцом для вашей собственной реализации фронтенда. Passport поставляется с JSON API, который можно использовать, чтобы разрешить вашим пользователям создавать клиентов и персональные токены доступа. Но написание кода фронтенда для взаимодействия с этими API может занять много времени. Поэтому Passport также содержит встроенные ((https://vuejs.org Vue))-компоненты , которые вы можете использовать, как пример или отправную точку для своей собственной реализации. Для публикации Vue-компонентов Passport используйте Artisan-команду %%(sh)vendor:publish%%: %%(sh) php artisan vendor:publish --tag=passport-components %% Опубликованные компоненты будут помещены в каталог %%(t)resources/assets/js/components%%. После публикации компонентов их необходимо зарегистрировать в файле %%(t)resources/assets/js/app.js%%: %%(JS) Vue.component( 'passport-clients', require('./components/passport/Clients.vue') ); Vue.component( 'passport-authorized-clients', require('./components/passport/AuthorizedClients.vue') ); Vue.component( 'passport-personal-access-tokens', require('./components/passport/PersonalAccessTokens.vue') ); %% После регистрации компонентов не забудьте выполнить %%(sh)gulp%% для перекомпилирования ваших ресурсов. После этого вы можете поместить компоненты в один из шаблонов вашего приложения, чтобы начать создавать клиентов и персональные токены доступа: %% %% == Настройка == === Срок действия токенов === По умолчанию Passport выдаёт длительные токены доступа, которые вообще не надо обновлять. Если вы хотите настроить более короткое время действия токенов, используйте методы %%tokensExpireIn()%% и %%refreshTokensExpireIn()%%. Эти методы надо вызывать из метода %%boot()%% вашего %%(t)AuthServiceProvider%%: %% use Carbon\Carbon; /** * Регистрация всех сервисов аутентификации / авторизации. * * @return void */ public function boot() { $this->registerPolicies(); Passport::routes(); Passport::tokensExpireIn(Carbon::now()->addDays(15)); Passport::refreshTokensExpireIn(Carbon::now()->addDays(30)); } %% == Выдача токенов доступа == Большинство разработчиков знакомы с OAuth2 по работе с кодами авторизации. При использовании кодов авторизации клиентское приложение перенаправляет пользователя на ваш сервер, где разрешается или запрещается его запрос на получение токена на доступ к клиенту. === Управление клиентами === Во-первых, разработчикам приложений, которым необходимо взаимодействие с API вашего приложения, необходимо зарегистрировать свои приложения в вашем, создав "клиента". Обычно это сводится к предоставлению названия их приложения и URL, на который ваше приложение сможет перенаправлять пользователей, когда они запрашивают авторизацию. **Команда %%(sh)passport:client%%** Простейший способ создать клиента - Artisan-команда %%(sh)passport:client%%. Её можно использовать для создания своих клиентов для тестирования возможностей OAuth2. Когда вы запустите команду %%(sh)client%%, Passport запросит у вас информацию о вашем клиенте и предоставит вам ID и секрет клиента: %%(sh) php artisan passport:client %% **JSON API** Поскольку у ваших пользователей не будет возможности использовать команду %%(sh)client%%, Passport предоставляет JSON API, который вы можете использовать для создания клиентов. Это избавляет вас от необходимости вручную писать контроллеры для создания, изменения и удаления клиентов. Но вам надо будет дополнить Passport JSON API своим собственным фронтендом, чтобы предоставить пользователям панель для управления их клиентами. Далее мы рассмотрим все конечные точки API для управления клиентами. Для удобства мы используем ((https://vuejs.org Vue)) для демонстрации создания HTTP-запросов к конечным точкам. .(alert) Если вы не хотите самостоятельно реализовывать весь фронтенд управления клиентами, вы можете использовать ((#Быстрое быстрое знакомство с фронтендом)) и получите полностью функциональный фронтенд за считанные минуты. **GET /oauth/clients** Этот маршрут возвращает всех клиентов для аутентифицированного пользователя. Это особенно полезно для просмотра всех клиентов пользователя, чтобы редактировать или удалять их: %% this.$http.get('/oauth/clients') .then(response => { console.log(response.data); }); %% **POST /oauth/clients** Этот маршрут используется для создания новых клиентов. Ему необходимы следующие данные: название клиента (%%name%%) и URL переадресации (%%redirect%%). Этот URL будет использован для переадресации пользователя после подтверждения или отклонения запроса авторизации. После создания клиента ему будут выданы ID клиента и секрет клиента. Эти значения будут использоваться при запросе токенов доступа у вашего приложения. Маршрут создания клиента вернёт новый экземпляр клиента: %% const data = { name: 'Client Name', redirect: 'http://example.com/callback' }; this.$http.post('/oauth/clients', data) .then(response => { console.log(response.data); }) .catch (response => { // Список ошибок в отклике... }); %% **PUT /oauth/clients/{client-id}** Этот маршрут используется для изменения клиентов. Ему необходимы следующие данные: название клиента (%%name%%) и URL переадресации (%%redirect%%). Этот URL будет использован для переадресации пользователя после подтверждения или отклонения запроса авторизации. Маршрут вернёт обновлённый экземпляр клиента: %% const data = { name: 'New Client Name', redirect: 'http://example.com/callback' }; this.$http.put('/oauth/clients/' + clientId, data) .then(response => { console.log(response.data); }) .catch (response => { // Список ошибок в отклике... }); %% **DELETE /oauth/clients/{client-id}** Этот маршрут используется для удаления клиентов: %% this.$http.delete('/oauth/clients/' + clientId) .then(response => { // }); %% === Запрос токенов === **Переадресация для авторизации** После создания клиента разработчики могут использовать ID и секрет своего клиента для запроса кода авторизации и токенов доступа у вашего приложения. Во-первых, запрашивающее приложение должно сделать запрос переадресации в маршрут %%(t)/oauth/authorize%% вашего приложения вот так: %% Route::get('/redirect', function () { $query = http_build_query([ 'client_id' => 'client-id', 'redirect_uri' => 'http://example.com/callback', 'response_type' => 'code', 'scope' => '', ]); return redirect('http://your-app.com/oauth/authorize?'.$query); }); %% .(alert) Запомните, маршрут %%(t)/oauth/authorize%% уже определён методом %%Passport::routes()%%. Вам не надо вручную определять этот маршрут. **Подтверждение запроса** При получении запросов авторизации Passport автоматически выведет пользователю шаблон, позволяя им подтвердить или отклонить запрос авторизации. Если они подтверждают запрос, то автоматически переадресуются обратно на %%(t)redirect_uri%%, указанный запрашивающим приложением. Этот %%(t)redirect_uri%% должен совпадать с URL %%(t)redirect%%, указанным при создании клиента. Если вы хотите изменить окно подтверждения авторизации, вы можете опубликовать представления Passport Artisan-командой %%(sh)vendor:publish%%. Опубликованные представления будут размещены в каталоге %%(t)resources/views/vendor/passport%%: %%(sh) php artisan vendor:publish --tag=passport-views %% **Конвертирование кодов авторизации в токены доступа** Если пользователь подтвердит запрос авторизации, то будет переадресован обратно в запрашивающее приложение. Затем оно должно сделать %%(t)POST%%-запрос в ваше приложение, чтобы запросить токен доступа. Запрос должен содержать код авторизации, который был выдан вашим приложением, когда пользователь подтвердил запрос авторизации. В этом примере мы используем HTTP-библиотеку Guzzle для создания %%(t)POST%%-запроса: %% Route::get('/callback', function (Request $request) { $http = new GuzzleHttp\Client; $response = $http->post('http://your-app.com/oauth/token', [ 'form_params' => [ 'grant_type' => 'authorization_code', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'redirect_uri' => 'http://example.com/callback', 'code' => $request->code, ], ]); return json_decode((string) $response->getBody(), true); }); %% Маршрут %%(t)/oauth/token%% вернёт JSON-отклик, содержащий атрибуты %%(t)access_token%%, %%(t)refresh_token%% и %%(t)expires_in%%. Атрибут %%(t)expires_in%% содержит число секунд до истечения действия токена доступа. .(alert) Как и маршрут %%(t)%%/oauth/authorize%%, маршрут %%(t)/oauth/token%% также определён методом %%Passport::routes()%%. Вам не надо вручную определять этот маршрут. === Обновление токенов === Если ваше приложение выдаёт краткосрочные токены доступа, пользователям будет необходимо обновлять свои токены доступа с помощью токена обновления, который предоставляется при выдаче токена доступа. В этом примере мы используем HTTP-библиотеку Guzzle для обновления токена: %% $http = new GuzzleHttp\Client; $response = $http->post('http://your-app.com/oauth/token', [ 'form_params' => [ 'grant_type' => 'refresh_token', 'refresh_token' => 'the-refresh-token', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'scope' => '', ], ]); return json_decode((string) $response->getBody(), true); %% Маршрут %%(t)/oauth/token%% вернёт JSON-отклик, содержащий атрибуты %%(t)access_token%%, %%(t)refresh_token%% и %%(t)expires_in%%. Атрибут %%(t)expires_in%% содержит число секунд до истечения действия токена доступа. == Токены предоставления пароля == Предоставление пароля OAuth2 позволяет вашим собственным клиентам, таким как мобильное приложение, получить токен доступа с помощью e-mail/логина и пароля. Это позволяет вам безопасно выдавать токены доступа своим собственным клиентам, не требуя от пользователя проходить через весь процесс авторизационной переадресации OAuth2. **Создание клиента предоставления пароля** Перед тем как ваше приложение сможет выдавать токены через предоставление пароля, вам надо создать клиент предоставления пароля. Это можно сделать командой %%(sh)passport:client%% с ключом %%(sh)--password%%. Если вы уже выполняли команду %%(sh)passport:install%%, то вам не надо выполнять эту команду: %%(sh) php artisan passport:client --password %% === Запрос токенов === После создания клиента предоставления пароля вы можете запросить токен, сделав %%(t)POST%%-запрос по маршруту %%(t)/oauth/token%% с адресом email и паролем пользователя. Запомните, этот маршрут уже зарегистрирован методом %%Passport::routes()%%, поэтому вам не надо определять его вручную. Если запрос успешен, вы получите %%(t)access_token%% и %%(t)refresh_token%% в JSON-отклике от сервера: %% $http = new GuzzleHttp\Client; $response = $http->post('http://your-app.com/oauth/token', [ 'form_params' => [ 'grant_type' => 'password', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'username' => 'taylor@laravel.com', 'password' => 'my-password', 'scope' => '', ], ]); return json_decode((string) $response->getBody(), true); %% .(alert) Запомните, по умолчанию токены долговременны. Но вы можете ((#настройка настроить максимальное время действия токенов доступа)) при необходимости. === Запрос всех прав === При использовании предоставления пароля вам может понадобиться авторизовать токен для всех прав, поддерживаемых в вашем приложении. Это можно сделать, запросив право %%*%%. Если вы запросили право %%*%%, метод %%can()%% на экземпляре токена будет всегда возвращать %%true%%. Это право может быть выдано только токену, выданному с помощью предоставления %%(t)password%%: %% $response = $http->post('http://your-app.com/oauth/token', [ 'form_params' => [ 'grant_type' => 'password', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'username' => 'taylor@laravel.com', 'password' => 'my-password', 'scope' => '*', ], ]); %% == Неявное предоставление токенов == Неявное предоставление похоже на предоставление авторизационного кода, но токен возвращается клиенту без обмена авторизационным кодом. Это предоставление наиболее часто используется для JavaScript или мобильных приложений, когда клиентские учётные данные не могут надёжно храниться. Для включения предоставления вызовите метод %%enableImplicitGrant()%% в %%(t)AuthServiceProvider%%: %% /** * Регистрация всех сервисов аутентификации / авторизации. * * @return void */ public function boot() { $this->registerPolicies(); Passport::routes(); Passport::enableImplicitGrant(); } %% После включения предоставления разработчики смогут использовать ID своего клиента для запроса токенов доступа у вашего приложения. Запрашивающее приложение должно сделать запрос переадресации по маршруту %%(t)/oauth/authorize%% вашего приложения вот так: %% Route::get('/redirect', function () { $query = http_build_query([ 'client_id' => 'client-id', 'redirect_uri' => 'http://example.com/callback', 'response_type' => 'token', 'scope' => '', ]); return redirect('http://your-app.com/oauth/authorize?'.$query); }); %% .(alert) Запомните, маршрут %%(t)/oauth/authorize%% уже определён методом %%Passport::routes()%%. Вам не надо определять его вручную. == Токены предоставления учётных данных клиента == Предоставление учётных данных клиента подходит для аутентификации машина-машина. Например, вы можете использовать это предоставление в запланированной задаче, которая выполняет обслуживающие действия через API. Для получения токена сделайте запрос к конечной точке %%(t)oauth/token%%: %% $guzzle = new GuzzleHttp\Client; $response = $guzzle->post('http://your-app.com/oauth/token', [ 'form_params' => [ 'grant_type' => 'client_credentials', 'client_id' => 'client-id', 'client_secret' => 'client-secret', 'scope' => 'your-scope', ], ]); echo json_decode((string) $response->getBody(), true); %% == Персональные токены доступа == Иногда пользователям необходимо выдавать токены доступа самим себе, не проходя через обычный процесс авторизационной переадресации. Позволяя пользователям выдавать токены самим себе через UI вашего приложения, вы даёте им возможность экспериментировать с вашим API или упрощаете весь подход к выдаче токенов. .(alert) Персональные токены доступа всегда долговременны. Их срок действия не изменяется методами %%tokensExpireIn()%% и %%refreshTokensExpireIn()%%. === Создание клиента персонального доступа === Перед тем как ваше приложение сможет выдавать токены персонального доступа, вам надо создать клиент персонального доступа. Это можно сделать командой %%(sh)passport:client%% с ключом %%--personal()%%. Если вы уже выполняли команду %%(sh)passport:install%% вам не надо выполнять эту команду: %%(sh) php artisan passport:client --personal %% === Управление токенами персонального доступа === После создания клиента персонального доступа вы можете выдавать токены конкретному пользователю с помощью метода %%createToken()%% на экземпляре модели %%(t)User%%. Этот метод принимает первым аргументом название токена, а вторым аргументом - необязательный массив ((#права прав токена)): %% $user = App\User::find(1); // Создание токена без указания прав... $token = $user->createToken('Token Name')->accessToken; // Создание токена с правами... $token = $user->createToken('My Token', ['place-orders'])->accessToken; %% **JSON API** В Passport также есть JSON API для управления персональными токенами доступа. Вы можете дополнить его своим фронтендом, предоставив пользователям панель для управления токенами персонального доступа. Далее мы рассмотрим все конечные точки API для управления токенами персонального доступа. Для удобства мы используем ((https://vuejs.org Vue)) для демонстрации создания HTTP-запросов к конечным точкам. .(alert) Если вы не хотите самостоятельно реализовывать весь фронтенд управления персональными токенами доступа, вы можете использовать ((#Быстрое быстрое знакомство с фронтендом)) и получите полностью функциональный фронтенд за считанные минуты. **GET /oauth/scopes** Этот маршрут возвращает все ((#права права)), определённые для вашего приложения. Вы можете использовать этот маршрут для получения списка прав, которые пользователь может назначить персональному токену доступа: %% this.$http.get('/oauth/scopes') .then(response => { console.log(response.data); }); %% **GET /oauth/personal-access-tokens** Этот маршрут возвращает все персональные токены доступа, которые создал пользователь. Это особенно полезно для получения списка всех токенов пользователя, чтобы он мог отредактировать или удалить их: %% this.$http.get('/oauth/personal-access-tokens') .then(response => { console.log(response.data); }); %% **POST /oauth/personal-access-tokens** Этот маршрут создаёт новые персональные токены доступа. Ему необходимы следующие данные: название токена (%%name%%) и права (%%scopes%%) для него: %% const data = { name: 'Token Name', scopes: [] }; this.$http.post('/oauth/personal-access-tokens', data) .then(response => { console.log(response.data.accessToken); }) .catch (response => { // Список ошибок в отклике... }); %% **DELETE /oauth/personal-access-tokens/{token-id}** Этот маршрут удаляет персональный токен доступа: %% this.$http.delete('/oauth/personal-access-tokens/' + tokenId); %% == Защита маршрутов == === С помощью посредников === Passport содержит ((//docs/v5/authentication#добавление защитника аутентификации)), который будет проверять токены доступа во входящих запросах. После настройки защитника %%(t)api%% на использование драйвера %%(t)passport%% вам остаётся только указать посредника %%(t)auth:api%% для всех маршрутов, которые требуют корректный токен доступа: %% Route::get('/user', function () { // })->middleware('auth:api'); %% === Передача токена доступа === При вызове маршрутов, защищённых с помощью Passport, пользователи API вашего приложения должны указать свой токен доступа как токен %%(t)Bearer%% в заголовке %%(t)Authorization%% своего запроса. Например, при использовании HTTP-библиотеки Guzzle: %% $response = $client->request('GET', '/api/user', [ 'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '.$accessToken, ], ]); %% == Права токена == === Определение прав === Права позволяют клиентам вашего API запрашивать определённый набор разрешений при запросе авторизации на доступ к аккаунту. Например, если вы создаёте приложение для продаж, не всем пользователям API будет нужна возможность размещать заказы. Вместо этого вы можете позволить им только запрашивать авторизацию на доступ к статусам доставки. Другими словами, права позволяют пользователям вашего приложения ограничить действия, которые может выполнять стороннее приложение от их имени. Вы можете определить права своего API методом %%Passport::tokensCan()%% в методе %%boot()%% вашего %%(t)AuthServiceProvider%%. Метод %%tokensCan()%% принимает массив названий и описаний прав. Описание права может быть каким угодно и будет выводиться пользователям на экране подтверждения авторизации: %% use Laravel\Passport\Passport; Passport::tokensCan([ 'place-orders' => 'Размещать заказы', 'check-status' => 'Проверять статус заказа', ]); %% === Назначение прав токенам === **При запросе кодов авторизации** При запросе токена доступа с помощью предоставления кода авторизации, запрашивающая сторона должна указать необходимые ей права в виде строкового параметра запроса %%(t)scope%%. Параметр %%(t)scope%% должен быть списком прав, разделённых пробелами: %% Route::get('/redirect', function () { $query = http_build_query([ 'client_id' => 'client-id', 'redirect_uri' => 'http://example.com/callback', 'response_type' => 'code', 'scope' => 'place-orders check-status', ]); return redirect('http://your-app.com/oauth/authorize?'.$query); }); %% **При выдаче персональных токенов доступа** Если вы выдаёте персональные токены доступа с помощью метода %%createToken()%% модели %%(t)User%%, вы можете передать массив необходимых вам прав в качестве второго аргумента: %% $token = $user->createToken('My Token', ['place-orders'])->accessToken; %% === Проверка прав === Passport содержит два посредника, которые можно использовать для проверки того, что входящий запрос аутентифицирован токеном, которому выданы нужные права. Для начала добавьте следующих посредников в свойство %%$routeMiddleware%% в файле %%(t)app/Http/Kernel.php%%: %% 'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class, 'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class, %% **Проверка всех прав** Посредник %%(t)scopes%% можно назначить на маршрут для проверки того, что токен доступа входящего запроса имеет **все** перечисленные права: %% Route::get('/orders', function () { // Токен доступа имеет оба права: "check-status" и "place-orders"... })->middleware('scopes:check-status,place-orders'); %% **Проверка на любое право** Посредник %%(t)scopes%% можно назначить на маршрут для проверки того, что токен доступа входящего запроса имеет **хотя бы одно** из перечисленных прав: %% Route::get('/orders', function () { // Токен доступа имеет либо право "check-status", либо "place-orders"... })->middleware('scope:check-status,place-orders'); %% **Проверка прав экземпляра токена** Когда авторизованный токеном доступа запрос поступил в ваше приложение, у вас всё ещё есть возможность проверить, есть ли у токена определённое право, методом %%tokenCan()%% на аутентифицированном экземпляре %%(t)User%%: %% use Illuminate\Http\Request; Route::get('/orders', function (Request $request) { if ($request->user()->tokenCan('place-orders')) { // } }); %% == Использование вашего API с помощью JavaScript == При создании API бывает чрезвычайно полезно иметь возможность использовать ваш собственный API из вашего JavaScript-приложения. Такой подход к разработке API позволяет вашему приложению использовать тот же API, который вы предоставляете всем остальным. Один и тот же API может быть использован вашим веб-приложением, мобильными приложениями, сторонними приложениями и любыми SDK, которые вы можете опубликовать в различных менеджерах пакетов. Обычно, если вы хотите использовать свой API из вашего JavaScript-приложения, вам необходимо вручную послать токен доступа в приложение и передавать его с каждым запросом в ваше приложение. Однако, Passport содержит посредника, который может обработать это для вас. Вам надо только добавить посредника %%(t)CreateFreshApiToken%% в вашу группу посредников %%(t)web%%: %% 'web' => [ // Другие посредники... \Laravel\Passport\Http\Middleware\CreateFreshApiToken::class, ], %% Этот посредник будет прикреплять cookie %%(t)laravel_token%% к вашим исходящим откликам. Этот cookie содержит зашифрованный JWT, который Passport будет использовать для аутентификации API-запросов из вашего JavaScript-приложения. Теперь вы можете делать запросы в API вашего приложения, не передавая токен доступа в явном виде: %% this.$http.get('/user') .then(response => { console.log(response.data); }); %% При использовании этого метода аутентификации вам надо посылать CSRF-токен с каждым запросом, используя заголовок%%(t)X-CSRF-TOKEN%%. Laravel будет автоматически отправлять этот заголовок, если вы используете стандартные настройки ((https://vuejs.org Vue)), которые включены в фреймворк: %% Vue.http.interceptors.push((request, next) => { request.headers.set('X-CSRF-TOKEN', Laravel.csrfToken); next(); }); %% .(alert) Если вы используете другой JavaScript-фреймворк, вам надо убедиться, что он настроен на отправку этого заголовка с каждым исходящим запросом. == События == Passport создаёт события при выдаче токенов доступа и обновлении токенов. Вы можете использовать эти события для удаления или отмены других токенов доступа в вашей БД. Вы можете прикрепить слушателей к этим событиям в %%(t)EventServiceProvider%% вашего приложения: %% /** * Привязки слушателя событий для приложения. * * @var array */ protected $listen = [ 'Laravel\Passport\Events\AccessTokenCreated' => [ 'App\Listeners\RevokeOldTokens', ], 'Laravel\Passport\Events\RefreshTokenCreated' => [ 'App\Listeners\PruneOldTokens', ], ]; %%