Может войдёшь?
Черновики Написать статью Профиль

API аутентификация (Passport)

перевод документация 5.х

  1. 1. Введение
  2. 2. Установка
    1. 2.1. Быстрое знакомство с фронтендом
  3. 3. Настройка
    1. 3.1. Срок действия токенов
  4. 4. Выдача токенов доступа
    1. 4.1. Управление клиентами
    2. 4.2. Запрос токенов
    3. 4.3. Обновление токенов
  5. 5. Токены предоставления пароля
    1. 5.1. Запрос токенов
    2. 5.2. Запрос всех прав
  6. 6. Неявное предоставление токенов
  7. 7. Токены предоставления учётных данных клиента
  8. 8. Персональные токены доступа
    1. 8.1. Создание клиента персонального доступа
    2. 8.2. Управление токенами персонального доступа
  9. 9. Защита маршрутов
    1. 9.1. С помощью посредников
    2. 9.2. Передача токена доступа
  10. 10. Права токена
    1. 10.1. Определение прав
    2. 10.2. Назначение прав токенам
    3. 10.3. Проверка прав
  11. 11. Использование вашего API с помощью JavaScript
  12. 12. События
Этот перевод актуален для англоязычной документации на (ветка 5.3). Опечатка? Выдели и нажми Ctrl+Enter.

Введение

В Laravel можно легко настроить аутентификацию через обычные формы входа, но что насчёт API? API обычно использует токены для аутентификации пользователей и не сохраняет состояние сессии между запросами. В Laravel реализована простая API аутентификация с помощью Laravel Passport, который предоставляет полную реализацию сервера OAuth2 для вашего приложения в считанные минуты. Passport создан на основе сервера League OAuth2, созданного Алексом Билби.

Предполагается, что вы уже знакомы с OAuth2. Если вы ничего не знаете о OAuth2, рекомендуем ознакомиться с основной терминологией и возможностями OAuth2 самостоятельно перед прочтением этой статьи.

Установка

Сначала установите Passport через менеджер пакетов Composer:

PHP
composer require laravel/passport

Затем зарегистрируйте сервис-провайдер Passport в массиве PHPproviders в файле настроек config/app.php:

PHP
Laravel\Passport\PassportServiceProvider::class,

Сервис-провайдер Passport регистрирует свой собственный каталог миграций БД в фреймворке, поэтому вам надо мигрировать вашу БД после регистрации провайдера. Миграции Passport создадут таблицы, необходимые вашему приложению для хранения клиентов и токенов доступа:

shphp artisan migrate

Затем выполните команду shpassport:install. Она создаст ключи шифрования, необходимые для генерирования надёжных токенов доступа. Кроме того команда создаст клиентов «personal access» (персональный доступ) и «password grant» (предоставление пароля), которые будут использоваться для генерирования токенов доступа:

shphp artisan passport:install

После выполнения этой команды добавьте типаж Laravel\Passport\HasApiTokens в свою модель App\User. Этот типаж предоставит вашей модели несколько вспомогательных методов, которые позволят вам проверять токен и права аутентифицированного пользователя:

PHP
<?php

namespace App;

use 
Laravel\Passport\HasApiTokens;
use 
Illuminate\Notifications\Notifiable;
use 
Illuminate\Foundation\Auth\User as Authenticatable;

class 
User extends Authenticatable
{
  use 
HasApiTokensNotifiable;
}

Затем вызовите метод PHPPassport::routes() из метода PHPboot() вашего AuthServiceProvider. Этот метод зарегистрирует маршруты, необходимые для выдачи токенов доступа и отмены действия токенов доступа, клиентов и персональных токенов доступа:

PHP
<?php

namespace App\Providers;

use 
Laravel\Passport\Passport;
use 
Illuminate\Support\Facades\Gate;
use 
Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class 
AuthServiceProvider extends ServiceProvider
{
  
/**
   * Сопоставления политик для приложения.
   *
   * @var array
   */
  
protected $policies = [
    
'App\Model' => 'App\Policies\ModelPolicy',
  ];

  
/**
   * Регистрация всех сервисов аутентификации / авторизации.
   *
   * @return void
   */
  
public function boot()
  {
    
$this->registerPolicies();

    
Passport::routes();
  }
}

И наконец, в файле настроек config/auth.php задайте значение PHPpassport параметру PHPdriver защитника аутентификации PHPapi. После этого ваше приложение будет использовать PHPTokenGuard от Passport при аутентификации входящих API-запросов:

PHP
'guards' => [
  
'web' => [
    
'driver' => 'session',
    
'provider' => 'users',
  ],

  
'api' => [
    
'driver' => 'passport',
    
'provider' => 'users',
  ],
],

Быстрое знакомство с фронтендом

Чтобы использовать Vue-компоненты Passport, вам необходимо использовать JavaScript-фреймворк Vue. Эти компоненты также используют CSS-фреймворк Bootstrap. Но даже если вы не используете эти фреймворки, компоненты будут хорошим образцом для вашей собственной реализации фронтенда.

Passport поставляется с JSON API, который можно использовать, чтобы разрешить вашим пользователям создавать клиентов и персональные токены доступа. Но написание кода фронтенда для взаимодействия с этими API может занять много времени. Поэтому Passport также содержит встроенные Vue-компоненты , которые вы можете использовать, как пример или отправную точку для своей собственной реализации.

Для публикации Vue-компонентов Passport используйте Artisan-команду shvendor:publish:

shphp artisan vendor:publish --tag=passport-components

Опубликованные компоненты будут помещены в каталог resources/assets/js/components. После публикации компонентов их необходимо зарегистрировать в файле resources/assets/js/app.js:

jsVue.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')
);

После регистрации компонентов не забудьте выполнить shgulp для перекомпилирования ваших ресурсов. После этого вы можете поместить компоненты в один из шаблонов вашего приложения, чтобы начать создавать клиентов и персональные токены доступа:

PHP
<passport-clients></passport-clients>
<
passport-authorized-clients></passport-authorized-clients>
<
passport-personal-access-tokens></passport-personal-access-tokens>

Настройка

Срок действия токенов

По умолчанию Passport выдаёт длительные токены доступа, которые вообще не надо обновлять. Если вы хотите настроить более короткое время действия токенов, используйте методы PHPtokensExpireIn() и PHPrefreshTokensExpireIn(). Эти методы надо вызывать из метода PHPboot() вашего AuthServiceProvider:

PHP
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, на который ваше приложение сможет перенаправлять пользователей, когда они запрашивают авторизацию.

Команда shpassport:client

Простейший способ создать клиента — Artisan-команда shpassport:client. Её можно использовать для создания своих клиентов для тестирования возможностей OAuth2. Когда вы запустите команду shclient, Passport запросит у вас информацию о вашем клиенте и предоставит вам ID и секрет клиента:

shphp artisan passport:client

JSON API

Поскольку у ваших пользователей не будет возможности использовать команду shclient, Passport предоставляет JSON API, который вы можете использовать для создания клиентов. Это избавляет вас от необходимости вручную писать контроллеры для создания, изменения и удаления клиентов.

Но вам надо будет дополнить Passport JSON API своим собственным фронтендом, чтобы предоставить пользователям панель для управления их клиентами. Далее мы рассмотрим все конечные точки API для управления клиентами. Для удобства мы используем Vue для демонстрации создания HTTP-запросов к конечным точкам.

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

GET /oauth/clients

Этот маршрут возвращает всех клиентов для аутентифицированного пользователя. Это особенно полезно для просмотра всех клиентов пользователя, чтобы редактировать или удалять их:

PHP
this.$http.get('/oauth/clients')
  .
then(response => {
    
console.log(response.data);
  });

POST /oauth/clients

Этот маршрут используется для создания новых клиентов. Ему необходимы следующие данные: название клиента (PHPname) и URL переадресации (PHPredirect). Этот URL будет использован для переадресации пользователя после подтверждения или отклонения запроса авторизации.

После создания клиента ему будут выданы ID клиента и секрет клиента. Эти значения будут использоваться при запросе токенов доступа у вашего приложения. Маршрут создания клиента вернёт новый экземпляр клиента:

PHP
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}

Этот маршрут используется для изменения клиентов. Ему необходимы следующие данные: название клиента (PHPname) и URL переадресации (PHPredirect). Этот URL будет использован для переадресации пользователя после подтверждения или отклонения запроса авторизации. Маршрут вернёт обновлённый экземпляр клиента:

PHP
const data = {
  
name'New Client Name',
  
redirect'http://example.com/callback'
};

this.$http.put('/oauth/clients/' clientIddata)
  .
then(response => {
    
console.log(response.data);
  })
  .catch (
response => {
    
// Список ошибок в отклике...
  
});

DELETE /oauth/clients/{client-id}

Этот маршрут используется для удаления клиентов:

PHP
this.$http.delete('/oauth/clients/' clientId)
  .
then(response => {
    
//
  
});

Запрос токенов

Переадресация для авторизации

После создания клиента разработчики могут использовать ID и секрет своего клиента для запроса кода авторизации и токенов доступа у вашего приложения. Во-первых, запрашивающее приложение должно сделать запрос переадресации в маршрут /oauth/authorize вашего приложения вот так:

PHP
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);
});

Запомните, маршрут /oauth/authorize уже определён методом PHPPassport::routes(). Вам не надо вручную определять этот маршрут.

Подтверждение запроса

При получении запросов авторизации Passport автоматически выведет пользователю шаблон, позволяя им подтвердить или отклонить запрос авторизации. Если они подтверждают запрос, то автоматически переадресуются обратно на redirect_uri, указанный запрашивающим приложением. Этот redirect_uri должен совпадать с URL redirect, указанным при создании клиента.

Если вы хотите изменить окно подтверждения авторизации, вы можете опубликовать представления Passport Artisan-командой shvendor:publish. Опубликованные представления будут размещены в каталоге resources/views/vendor/passport:

shphp artisan vendor:publish --tag=passport-views

Конвертирование кодов авторизации в токены доступа

Если пользователь подтвердит запрос авторизации, то будет переадресован обратно в запрашивающее приложение. Затем оно должно сделать POST-запрос в ваше приложение, чтобы запросить токен доступа. Запрос должен содержать код авторизации, который был выдан вашим приложением, когда пользователь подтвердил запрос авторизации. В этом примере мы используем HTTP-библиотеку Guzzle для создания POST-запроса:

PHP
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);
});

Маршрут /oauth/token вернёт JSON-отклик, содержащий атрибуты access_token, refresh_token и expires_in. Атрибут expires_in содержит число секунд до истечения действия токена доступа.

Как и маршрут /oauth/authorizePHPмаршрут(t)/oauth/tokenPHPтакже определён методомPassport::routes()%%. Вам не надо вручную определять этот маршрут.

Обновление токенов

Если ваше приложение выдаёт краткосрочные токены доступа, пользователям будет необходимо обновлять свои токены доступа с помощью токена обновления, который предоставляется при выдаче токена доступа. В этом примере мы используем HTTP-библиотеку Guzzle для обновления токена:

PHP
$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);

Маршрут /oauth/token вернёт JSON-отклик, содержащий атрибуты access_token, refresh_token и expires_in. Атрибут expires_in содержит число секунд до истечения действия токена доступа.

Токены предоставления пароля

Предоставление пароля OAuth2 позволяет вашим собственным клиентам, таким как мобильное приложение, получить токен доступа с помощью e-mail/логина и пароля. Это позволяет вам безопасно выдавать токены доступа своим собственным клиентам, не требуя от пользователя проходить через весь процесс авторизационной переадресации OAuth2.

Создание клиента предоставления пароля

Перед тем как ваше приложение сможет выдавать токены через предоставление пароля, вам надо создать клиент предоставления пароля. Это можно сделать командой shpassport:client с ключом sh--password. Если вы уже выполняли команду shpassport:install, то вам не надо выполнять эту команду:

shphp artisan passport:client --password

Запрос токенов

После создания клиента предоставления пароля вы можете запросить токен, сделав POST-запрос по маршруту /oauth/token с адресом email и паролем пользователя. Запомните, этот маршрут уже зарегистрирован методом PHPPassport::routes(), поэтому вам не надо определять его вручную. Если запрос успешен, вы получите access_token и refresh_token в JSON-отклике от сервера:

PHP
$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);

Запомните, по умолчанию токены долговременны. Но вы можете настроить максимальное время действия токенов доступа при необходимости.

Запрос всех прав

При использовании предоставления пароля вам может понадобиться авторизовать токен для всех прав, поддерживаемых в вашем приложении. Это можно сделать, запросив право PHP*. Если вы запросили право PHP*, метод PHPcan() на экземпляре токена будет всегда возвращать PHPtrue. Это право может быть выдано только токену, выданному с помощью предоставления password:

PHP
$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 или мобильных приложений, когда клиентские учётные данные не могут надёжно храниться. Для включения предоставления вызовите метод PHPenableImplicitGrant() в AuthServiceProvider:

PHP
/**
 * Регистрация всех сервисов аутентификации / авторизации.
 *
 * @return void
 */
public function boot()
{
  
$this->registerPolicies();

  
Passport::routes();

  
Passport::enableImplicitGrant();
}

После включения предоставления разработчики смогут использовать ID своего клиента для запроса токенов доступа у вашего приложения. Запрашивающее приложение должно сделать запрос переадресации по маршруту /oauth/authorize вашего приложения вот так:

PHP
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);
});

Запомните, маршрут /oauth/authorize уже определён методом PHPPassport::routes(). Вам не надо определять его вручную.

Токены предоставления учётных данных клиента

Предоставление учётных данных клиента подходит для аутентификации машина-машина. Например, вы можете использовать это предоставление в запланированной задаче, которая выполняет обслуживающие действия через API. Для получения токена сделайте запрос к конечной точке oauth/token:

PHP
$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 или упрощаете весь подход к выдаче токенов.

Персональные токены доступа всегда долговременны. Их срок действия не изменяется методами PHPtokensExpireIn() и PHPrefreshTokensExpireIn().

Создание клиента персонального доступа

Перед тем как ваше приложение сможет выдавать токены персонального доступа, вам надо создать клиент персонального доступа. Это можно сделать командой shpassport:client с ключом PHP--personal(). Если вы уже выполняли команду shpassport:install вам не надо выполнять эту команду:

shphp artisan passport:client --personal

Управление токенами персонального доступа

После создания клиента персонального доступа вы можете выдавать токены конкретному пользователю с помощью метода PHPcreateToken() на экземпляре модели User. Этот метод принимает первым аргументом название токена, а вторым аргументом — необязательный массив прав токена:

PHP
$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 для управления токенами персонального доступа. Для удобства мы используем Vue для демонстрации создания HTTP-запросов к конечным точкам.

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

GET /oauth/scopes

Этот маршрут возвращает все права, определённые для вашего приложения. Вы можете использовать этот маршрут для получения списка прав, которые пользователь может назначить персональному токену доступа:

PHP
this.$http.get('/oauth/scopes')
  .
then(response => {
    
console.log(response.data);
  });

GET /oauth/personal-access-tokens

Этот маршрут возвращает все персональные токены доступа, которые создал пользователь. Это особенно полезно для получения списка всех токенов пользователя, чтобы он мог отредактировать или удалить их:

PHP
this.$http.get('/oauth/personal-access-tokens')
  .
then(response => {
    
console.log(response.data);
  });

POST /oauth/personal-access-tokens

Этот маршрут создаёт новые персональные токены доступа. Ему необходимы следующие данные: название токена (PHPname) и права (PHPscopes) для него:

PHP
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}

Этот маршрут удаляет персональный токен доступа:

PHP
this.$http.delete('/oauth/personal-access-tokens/' tokenId);

Защита маршрутов

С помощью посредников

Passport содержит защитника аутентификации, который будет проверять токены доступа во входящих запросах. После настройки защитника api на использование драйвера passport вам остаётся только указать посредника auth:api для всех маршрутов, которые требуют корректный токен доступа:

PHP
Route::get('/user', function () {
  
//
})->middleware('auth:api');

Передача токена доступа

При вызове маршрутов, защищённых с помощью Passport, пользователи API вашего приложения должны указать свой токен доступа как токен Bearer в заголовке Authorization своего запроса. Например, при использовании HTTP-библиотеки Guzzle:

PHP
$response $client->request('GET''/api/user', [
  
'headers' => [
    
'Accept' => 'application/json',
    
'Authorization' => 'Bearer '.$accessToken,
  ],
]);

Права токена

Определение прав

Права позволяют клиентам вашего API запрашивать определённый набор разрешений при запросе авторизации на доступ к аккаунту. Например, если вы создаёте приложение для продаж, не всем пользователям API будет нужна возможность размещать заказы. Вместо этого вы можете позволить им только запрашивать авторизацию на доступ к статусам доставки. Другими словами, права позволяют пользователям вашего приложения ограничить действия, которые может выполнять стороннее приложение от их имени.

Вы можете определить права своего API методом PHPPassport::tokensCan() в методе PHPboot() вашего AuthServiceProvider. Метод PHPtokensCan() принимает массив названий и описаний прав. Описание права может быть каким угодно и будет выводиться пользователям на экране подтверждения авторизации:

PHP
use Laravel\Passport\Passport;

Passport::tokensCan([
  
'place-orders' => 'Размещать заказы',
  
'check-status' => 'Проверять статус заказа',
]);

Назначение прав токенам

При запросе кодов авторизации

При запросе токена доступа с помощью предоставления кода авторизации, запрашивающая сторона должна указать необходимые ей права в виде строкового параметра запроса scope. Параметр scope должен быть списком прав, разделённых пробелами:

PHP
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);
});

При выдаче персональных токенов доступа

Если вы выдаёте персональные токены доступа с помощью метода PHPcreateToken() модели User, вы можете передать массив необходимых вам прав в качестве второго аргумента:

PHP
$token $user->createToken('My Token', ['place-orders'])->accessToken;

Проверка прав

Passport содержит два посредника, которые можно использовать для проверки того, что входящий запрос аутентифицирован токеном, которому выданы нужные права. Для начала добавьте следующих посредников в свойство PHP$routeMiddleware в файле app/Http/Kernel.php:

PHP
'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,

Проверка всех прав

Посредник scopes можно назначить на маршрут для проверки того, что токен доступа входящего запроса имеет все перечисленные права:

PHP
Route::get('/orders', function () {
  
// Токен доступа имеет оба права: "check-status" и "place-orders"...
})->middleware('scopes:check-status,place-orders');

Проверка на любое право

Посредник scopes можно назначить на маршрут для проверки того, что токен доступа входящего запроса имеет хотя бы одно из перечисленных прав:

PHP
Route::get('/orders', function () {
  
// Токен доступа имеет либо право "check-status", либо "place-orders"...
})->middleware('scope:check-status,place-orders');

Проверка прав экземпляра токена

Когда авторизованный токеном доступа запрос поступил в ваше приложение, у вас всё ещё есть возможность проверить, есть ли у токена определённое право, методом PHPtokenCan() на аутентифицированном экземпляре User:

PHP
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 содержит посредника, который может обработать это для вас. Вам надо только добавить посредника CreateFreshApiToken в вашу группу посредников web:

PHP
'web' => [
  
// Другие посредники...
  
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],

Этот посредник будет прикреплять cookie laravel_token к вашим исходящим откликам. Этот cookie содержит зашифрованный JWT, который Passport будет использовать для аутентификации API-запросов из вашего JavaScript-приложения. Теперь вы можете делать запросы в API вашего приложения, не передавая токен доступа в явном виде:

PHP
this.$http.get('/user')
  .
then(response => {
    
console.log(response.data);
  });

При использовании этого метода аутентификации вам надо посылать CSRF-токен с каждым запросом, используя заголовокX-CSRF-TOKEN. Laravel будет автоматически отправлять этот заголовок, если вы используете стандартные настройки Vue, которые включены в фреймворк:

PHP
Vue.http.interceptors.push((requestnext) => {
  
request.headers.set('X-CSRF-TOKEN'Laravel.csrfToken);

  
next();
});

Если вы используете другой JavaScript-фреймворк, вам надо убедиться, что он настроен на отправку этого заголовка с каждым исходящим запросом.

События

Passport создаёт события при выдаче токенов доступа и обновлении токенов. Вы можете использовать эти события для удаления или отмены других токенов доступа в вашей БД. Вы можете прикрепить слушателей к этим событиям в EventServiceProvider вашего приложения:

PHP
/**
 * Привязки слушателя событий для приложения.
 *
 * @var array
 */
protected $listen = [
  
'Laravel\Passport\Events\AccessTokenCreated' => [
    
'App\Listeners\RevokeOldTokens',
  ],

  
'Laravel\Passport\Events\RefreshTokenCreated' => [
    
'App\Listeners\PruneOldTokens',
  ],
];

Как вы считаете, полезен ли этот материал? Да Нет

Комментарии (6)

CarWiz

Цитата:
«При запросе токена доступа с помощью предоставления кода авторизации, запрашивающая сторона должна указать необходимые ей права в виде строкового параметра запроса scope».

Я чего-то тут не понимаю или это действительно так. Неужели любому клиенту, который попросит те или иные права, они ему так просто присваиваются. Т.е. если любой клиент захочет права админа, он отправляет на регистрационный сервер 'scope' ⇒ 'place-admin', и все он админ. Это бред какой-то или я чего-то не понял.

Объясните пожалуйста.

Proger_XP
  1. Неужели любому клиенту, который попросит те или иные права, они ему так просто присваиваются.

Запросить можно любые права, но утверждать их потребуется отдельно. Они не выдаются автоматически.

rugleb

Пишу API для мобильного приложения и сразу возникло несколько вопросов.
1. Passport создаёт большое количество web маршрутов. Значит, они будут доступны и через мое API. Нужно ли OAuth сервер, коим является Passport, держать отдельно от API?
2. Что если я не хочу, чтобы клиенты мобильного приложения могли создавать других OAuth клиентов. Как ограничить это действие?

agoalofalife

1.Auth сервер и создаётся для предоставления Api внешним сервисам, для аутентификации и взаимодействия с ними.
В вашем проекте, кто то создаёт клиентское приложение, и с помощью вашего api взаимодействует с ним, скажем с помощью passport вы проверяете права внешних сервисов к вашим методам api. Теоретически вы можете разместить api отдельно, но стоит учитывать например дополнительные запросы и т д.
Так же можно переопределить все маршруты passport.

2.Не совсем понял вопрос. Если вы хотите запретить через api, то на запросы с мобильного приложения можете добавить заголовок или генерировать какой нибудь ключ, который отвечает 100%, что запрос сделан из телефона.

А по факту клиента может создать любой человек из браузера.
Надеюсь ответил , удачи.

YSerg

помогите плз., может я чего не так понял, хочу работать с апи, через посредника CreateFreshApiToken
после авторизации, установилась кука laravel_token, клиенту, в респонсе отправил csrf_token(), для установил header X-CSRF-TOKEN, делаю новый запрос, уже к нужному api методу, но в ответ «The payload is invalid.», полез в код и нарыл, что Laravel\Passport\Guards\TokenGuard::decodeJwtTokenCookie() пытается сделать $this->encrypter->decrypt для значения из куки laravel_token, но при установке куки в CreateFreshApiToken::createToken не делает $this->encrypter->encrypt из-за чего и упала ошибка, может я не тот механизм использую для работы с куками?

Pavel123

Нипанятна

Написать комментарий

Разметка: ? ?

Авторизуйся, чтобы прокомментировать.