Вступление
Laravel уже упрощает аутентификацию с помощью традиционных форм входа в систему, но как насчет API? API обычно используют токены для аутентификации пользователей и не поддерживают состояние сеанса между запросами. Laravel упрощает аутентификацию API, используя Laravel Passport, который обеспечивает полную реализацию сервера OAuth2 для вашего приложения Laravel за считанные минуты. Паспорт построен поверх сервера OAuth2 League, который поддерживают Энди Миллингтон и Саймон Хэмп.
В этой документации предполагается, что вы уже знакомы с OAuth2. Если вы ничего не знаете об OAuth2, перед продолжением ознакомьтесь с общей терминологией и функциями OAuth2.
Установка
Для начала установите Passport через менеджер пакетов Composer:
composer require laravel/passport
Поставщик услуг Passport регистрирует свой собственный каталог миграции базы данных в платформе, поэтому вы должны перенастроить вашу базу данных после установки пакета. Миграция Passport создаст таблицы, необходимые вашему приложению для хранения клиентов и токенов доступа:
php artisan migrate
Далее вы должны запустить команду. Эта команда создаст ключи шифрования, необходимые для создания токенов безопасного доступа. Кроме того, команда создаст клиентов «персональный доступ» и «предоставление пароля», которые будут использоваться для генерации токенов доступа:passport:install
php artisan passport:install
После выполнения этой команды добавьте черту к вашей модели. Эта особенность предоставит несколько вспомогательных методов для вашей модели, которые позволят вам проверить токен и области действия аутентифицированного пользователя:Laravel\Passport\HasApiTokens
App\User
<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
}
Затем вы должны вызвать метод внутри вашего метода . Этот метод регистрирует маршруты, необходимые для выдачи токенов доступа и аннулирования токенов доступа, клиентов и персональных токенов доступа:Passport::routes
boot
AuthServiceProvider
<?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
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'App\Model' => 'App\Policies\ModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
Наконец, в вашем файле конфигурации вы должны установить опцию защиты аутентификации на . Это даст вашему приложению команду использовать Passport при аутентификации входящих запросов API:config/auth.php
driver
api
passport
TokenGuard
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Настройка миграции
Если вы не собираетесь использовать миграцию Passport по умолчанию, вам следует вызвать метод в вашем методе . Вы можете экспортировать миграции по умолчанию, используя .Passport::ignoreMigrations
register
AppServiceProvider
php artisan vendor:publish --tag=passport-migrations
По умолчанию Passport использует целочисленный столбец для хранения user_id
. Если ваше приложение использует другой тип столбца для идентификации пользователей (например, UUID), вы должны изменить миграции Passport по умолчанию после их публикации.
Интерфейс Quickstart
Чтобы использовать компоненты Passport Vue, вы должны использовать инфраструктуру Vue JavaScript. Эти компоненты также используют платформу Bootstrap CSS. Однако, даже если вы не используете эти инструменты, компоненты служат ценным справочным материалом для вашей собственной реализации интерфейса.
Паспорт поставляется с JSON API, который вы можете использовать, чтобы позволить вашим пользователям создавать клиенты и персональные токены доступа. Однако может потребоваться много времени для написания кода для взаимодействия с этими API. Итак, Passport также включает в себя предварительно созданные компоненты Vue, которые вы можете использовать в качестве примера реализации или отправной точки для собственной реализации.
Чтобы опубликовать компоненты Passport Vue, используйте команду Artisan:vendor:publish
php artisan vendor:publish --tag=passport-components
Опубликованные компоненты будут размещены в вашем каталоге. После того, как компоненты были опубликованы, вы должны зарегистрировать их в своем файле:resources/js/components
resources/js/app.js
Vue.component(
'passport-clients',
require('./components/passport/Clients.vue').default
);
Vue.component(
'passport-authorized-clients',
require('./components/passport/AuthorizedClients.vue').default
);
Vue.component(
'passport-personal-access-tokens',
require('./components/passport/PersonalAccessTokens.vue').default
);
До Laravel v5.7.19 добавление при регистрации компонентов приводило к ошибке консоли. Объяснение этого изменения можно найти в примечаниях к выпуску Laravel Mix v4.0.0 .
.default
После регистрации компонентов обязательно запустите, npm run dev
чтобы перекомпилировать ваши активы. После того, как вы перекомпилировали свои ресурсы, вы можете поместить компоненты в один из шаблонов вашего приложения, чтобы начать создавать клиенты и токены личного доступа:
<passport-clients></passport-clients>
<passport-authorized-clients></passport-authorized-clients>
<passport-personal-access-tokens></passport-personal-access-tokens>
Развертывание паспорта
При первом развертывании Passport на ваших производственных серверах вам, вероятно, потребуется выполнить команду. Эта команда генерирует ключи шифрования, необходимые Паспорту для генерации токена доступа. Сгенерированные ключи обычно не хранятся в системе контроля версий:passport:keys
php artisan passport:keys
При необходимости вы можете указать путь, по которому ключи Паспорта должны быть загружены. Вы можете использовать метод для достижения этой цели:Passport::loadKeysFrom
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::loadKeysFrom('/secret-keys/oauth');
}
Кроме того, вы можете загрузить ключи из переменных среды:
PASSPORT_PRIVATE_KEY="-----BEGIN RSA PRIVATE KEY-----\n<private key here>\n-----END RSA PRIVATE KEY-----"
PASSPORT_PUBLIC_KEY="-----BEGIN PUBLIC KEY-----\n<public key here>\n-----END PUBLIC KEY-----\n"
Конфигурация
Время жизни токена
По умолчанию Passport выдает долговременные токены доступа, срок действия которых истекает через год. Если вы хотите , чтобы настроить длинный / короткий срок службы маркеров, вы можете использовать tokensExpireIn
, refreshTokensExpireIn
и personalAccessTokensExpireIn
методу. Эти методы должны вызываться из boot
метода вашего AuthServiceProvider
:
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::tokensExpireIn(now()->addDays(15));
Passport::refreshTokensExpireIn(now()->addDays(30));
Passport::personalAccessTokensExpireIn(now()->addMonths(6));
}
Переопределение моделей по умолчанию
Вы можете свободно расширять модели, используемые в Passport. Затем вы можете поручить Passport использовать ваши пользовательские модели через Passport
класс:
use App\Models\Passport\Client;
use App\Models\Passport\Token;
use App\Models\Passport\AuthCode;
use App\Models\Passport\PersonalAccessClient;
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::useTokenModel(Token::class);
Passport::useClientModel(Client::class);
Passport::useAuthCodeModel(AuthCode::class);
Passport::usePersonalAccessClientModel(PersonalAccessClient::class);
}
Выдача токенов доступа
Использование OAuth2 с кодами авторизации - это то, как большинство разработчиков знакомы с OAuth2. При использовании кодов авторизации клиентское приложение перенаправит пользователя на ваш сервер, где он либо утвердит, либо отклонит запрос на выдачу токена доступа клиенту.
Управление клиентами
Во-первых, разработчики, создающие приложения, которым необходимо взаимодействовать с API вашего приложения, должны зарегистрировать свое приложение у своего, создав «клиента». Как правило, это состоит из предоставления названия своего приложения и URL-адреса, на который ваше приложение может перенаправлять после того, как пользователи утвердят свой запрос на авторизацию.
Commandpassport:client
Самый простой способ создать клиента - использовать команду Artisan. Эта команда может использоваться для создания ваших собственных клиентов для тестирования вашей функциональности OAuth2. Когда вы запустите команду, Passport запросит у вас дополнительную информацию о вашем клиенте и предоставит вам идентификатор клиента и секрет:passport:client
client
php artisan passport:client
URL перенаправления
Если вы хотите внести в белый список несколько URL-адресов перенаправления для своего клиента, вы можете указать их, используя список с разделителями-запятыми, когда запросит URL-адрес командой:passport:client
http://example.com/callback,http://examplefoo.com/callback
Все URL, содержащие запятые, должны быть закодированы.
JSON API
Поскольку ваши пользователи не смогут использовать эту client
команду, Passport предоставляет JSON API, который вы можете использовать для создания клиентов. Это избавляет вас от необходимости вручную кодировать контроллеры для создания, обновления и удаления клиентов.
Однако вам нужно будет соединить JSON API Passport с вашим собственным интерфейсом, чтобы предоставить пользователям инструментальную панель для управления своими клиентами. Ниже мы рассмотрим все конечные точки API для управления клиентами. Для удобства мы будем использовать Axios для демонстрации выполнения HTTP-запросов к конечным точкам.
JSON API охраняется web
и auth
промежуточного программного обеспечения ; следовательно, он может быть вызван только из вашего собственного приложения. Он не может быть вызван из внешнего источника.
Если вы не хотите реализовывать весь клиентский интерфейс управления самостоятельно, вы можете использовать быстрый старт внешнего интерфейса, чтобы получить полностью функциональный веб-интерфейс за считанные минуты.
GET /oauth/clients
Этот маршрут возвращает всех клиентов для аутентифицированного пользователя. Это в первую очередь полезно для перечисления всех клиентов пользователя, чтобы они могли редактировать или удалять их:
axios.get('/oauth/clients')
.then(response => {
console.log(response.data);
});
POST /oauth/clients
Этот маршрут используется для создания новых клиентов. Требуется две части данных: клиент name
и redirect
URL. redirect
URL, где пользователь будет перенаправлен после утверждения или отказа в просьбе о выдаче разрешения.
Когда клиент создан, ему будет выдан идентификатор клиента и секрет клиента. Эти значения будут использоваться при запросе токенов доступа из вашего приложения. Маршрут создания клиента вернет новый экземпляр клиента:
const data = {
name: 'Client Name',
redirect: 'http://example.com/callback'
};
axios.post('/oauth/clients', data)
.then(response => {
console.log(response.data);
})
.catch (response => {
// List errors on response...
});
PUT /oauth/clients/{client-id}
Этот маршрут используется для обновления клиентов. Требуется две части данных: клиент name
и redirect
URL. redirect
URL, где пользователь будет перенаправлен после утверждения или отказа в просьбе о выдаче разрешения. Маршрут вернет обновленный экземпляр клиента:
const data = {
name: 'New Client Name',
redirect: 'http://example.com/callback'
};
axios.put('/oauth/clients/' + clientId, data)
.then(response => {
console.log(response.data);
})
.catch (response => {
// List errors on response...
});
DELETE /oauth/clients/{client-id}
Этот маршрут используется для удаления клиентов:
axios.delete('/oauth/clients/' + clientId)
.then(response => {
//
});
Запрос токенов
Перенаправление для авторизации
После создания клиента разработчики могут использовать свой идентификатор клиента и секрет, чтобы запросить код авторизации и токен доступа из вашего приложения. Во-первых, приложение-потребитель должно сделать запрос перенаправления на маршрут вашего приложения следующим образом:/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);
});
Помните, что маршрут уже определен методом. Вам не нужно вручную определять этот маршрут.
/oauth/authorize
Passport::routes
Утверждение запроса
При получении запросов на авторизацию Passport автоматически отображает шаблон для пользователя, позволяя ему одобрить или отклонить запрос на авторизацию. Если они одобрят запрос, они будут перенаправлены обратно на тот, redirect_uri
который был указан приложением-потребителем. redirect_uri
Должен соответствовать redirect
URL , который был указан при создании клиента.
Если вы хотите настроить экран подтверждения авторизации, вы можете опубликовать представления Passport с помощью команды Artisan. Опубликованные просмотры будут размещены в :vendor:publish
resources/views/vendor/passport
php artisan vendor:publish --tag=passport-views
Преобразование кодов авторизации в токены доступа
Если пользователь утвердит запрос на авторизацию, он будет перенаправлен обратно в приложение-потребитель. Потребитель должен затем отправить POST
запрос в ваше приложение, чтобы запросить токен доступа. Запрос должен включать код авторизации, который был выдан вашим приложением, когда пользователь утвердил запрос на авторизацию. В этом примере мы используем HTTP-библиотеку Guzzle для выполнения 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);
});
Этот маршрут будет возвращать ответ JSON , содержащий , и атрибуты. Атрибут содержит количество секунд , пока маркер доступа , пока не истечет./oauth/token
access_token
refresh_token
expires_in
expires_in
Как и маршрут, маршрут определяется для вас методом. Нет необходимости вручную определять этот маршрут. По умолчанию этот маршрут регулируется с помощью настроек промежуточного программного обеспечения.
/oauth/authorize
/oauth/token
Passport::routes
ThrottleRequests
Обновление токенов
Если ваше приложение выдает недопустимые токены доступа, пользователям необходимо обновить свои токены доступа с помощью токена обновления, который был предоставлен им при выдаче токена доступа. В этом примере мы будем использовать 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);
Этот маршрут будет возвращать ответ JSON , содержащий , и атрибуты. Атрибут содержит количество секунд , пока маркер доступа , пока не истечет./oauth/token
access_token
refresh_token
expires_in
expires_in
Предоставить токены
Предоставление пароля OAuth2 позволяет вашим сторонним клиентам, таким как мобильное приложение, получить токен доступа, используя адрес электронной почты / имя пользователя и пароль. Это позволяет безопасно выдавать токены доступа вашим сторонним клиентам, не требуя от пользователей проходить весь процесс перенаправления кода авторизации OAuth2.
Создание клиента предоставления пароля
Прежде чем ваше приложение сможет выдавать токены с помощью предоставления пароля, вам нужно будет создать клиент предоставления пароля. Вы можете сделать это, используя команду с опцией. Если вы уже выполнили команду, вам не нужно запускать эту команду:passport:client
--password
passport:install
php artisan passport:client --password
Запрос токенов
После создания клиента предоставления пароля вы можете запросить токен доступа, отправив POST
запрос на маршрут с адресом электронной почты и паролем пользователя. Помните, этот маршрут уже зарегистрирован методом, поэтому нет необходимости определять его вручную. Если запрос выполнен успешно, вы получите и в ответ JSON с сервера:/oauth/token
Passport::routes
access_token
refresh_token
$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);
Помните, что токены доступа являются долгоживущими по умолчанию. Тем не менее, вы можете настроить максимальное время жизни токена доступа, если это необходимо.
Запрос всех областей
При использовании предоставления пароля или предоставления клиентских учетных данных вы можете авторизовать токен для всех областей, поддерживаемых вашим приложением. Вы можете сделать это, запросив *
объем. Если вы запрашиваете *
область, can
метод на экземпляре токена всегда будет возвращаться true
. Эта область может быть назначена только токену, выпущенному с использованием password
или client_credentials
grant:
$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' => '*',
],
]);
Настройка поля имени пользователя
При аутентификации с использованием предоставления пароля Passport будет использовать email
атрибут вашей модели в качестве «имени пользователя». Однако вы можете настроить это поведение, определив findForPassport
метод в вашей модели:
<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
/**
* Find the user instance for the given username.
*
* @param string $username
* @return \App\User
*/
public function findForPassport($username)
{
return $this->where('username', $username)->first();
}
}
Настройка проверки пароля
При аутентификации с использованием предоставления пароля Passport будет использовать password
атрибут вашей модели для проверки заданного пароля. Если ваша модель не имеет password
атрибута или вы хотите настроить логику проверки пароля, вы можете определить validateForPassportPasswordGrant
метод для вашей модели:
<?php
namespace App;
use Laravel\Passport\HasApiTokens;
use Illuminate\Support\Facades\Hash;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
/**
* Validate the password of the user for the Passport password grant.
*
* @param string $password
* @return bool
*/
public function validateForPassportPasswordGrant($password)
{
return Hash::check($password, $user->password);
}
}
Неявные Гранты Жетоны
Неявное предоставление аналогично предоставлению кода авторизации; однако токен возвращается клиенту без обмена кодом авторизации. Этот грант чаще всего используется для JavaScript или мобильных приложений, где учетные данные клиента не могут быть надежно сохранены. Чтобы включить грант, вызовите enableImplicitGrant
метод в вашем AuthServiceProvider
:
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::enableImplicitGrant();
}
Как только грант включен, разработчики могут использовать свой идентификатор клиента для запроса токена доступа из вашего приложения. Потребляющее приложение должно сделать запрос перенаправления на маршрут вашего приложения следующим образом:/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);
});
Помните, что маршрут уже определен методом. Вам не нужно вручную определять этот маршрут.
/oauth/authorize
Passport::routes
Клиентские учетные данные предоставят токены
Предоставление учетных данных клиента подходит для проверки подлинности между компьютерами. Например, вы можете использовать этот грант в запланированном задании, которое выполняет задачи обслуживания через API.
Прежде чем ваше приложение сможет выдавать токены с помощью привилегии клиента, вам нужно будет создать клиент гранта клиента. Вы можете сделать это, используя --client
опцию команды:passport:client
php artisan passport:client --client
Далее, чтобы использовать этот тип гранта, вам нужно добавить CheckClientCredentials
промежуточное ПО в $routeMiddleware
свойство вашего файла:app/Http/Kernel.php
use Laravel\Passport\Http\Middleware\CheckClientCredentials;
protected $routeMiddleware = [
'client' => CheckClientCredentials::class,
];
Затем прикрепите промежуточное ПО к маршруту:
Route::get('/orders', function (Request $request) {
...
})->middleware('client');
Чтобы ограничить доступ к маршруту для определенных областей, вы можете предоставить список необходимых областей, разделенных запятыми, при подключении client
промежуточного программного обеспечения к маршруту:
Route::get('/orders', function (Request $request) {
...
})->middleware('client:check-status,your-scope');
Получение токенов
Чтобы получить токен, используя этот тип предоставления, сделайте запрос к конечной точке: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',
],
]);
return json_decode((string) $response->getBody(), true)['access_token'];
Жетоны личного доступа
Иногда ваши пользователи могут захотеть выдать токены доступа самим себе, не проходя типичный процесс перенаправления кода авторизации. Разрешение пользователям самостоятельно выдавать токены через пользовательский интерфейс вашего приложения может быть полезным для предоставления пользователям возможности экспериментировать с вашим API или может служить более простым подходом к выдаче токенов доступа в целом.
Создание клиента личного доступа
Прежде чем ваше приложение сможет выдать токены личного доступа, вам нужно будет создать клиент личного доступа. Вы можете сделать это, используя команду с опцией. Если вы уже выполнили команду, вам не нужно запускать эту команду:passport:client
--personal
passport:install
php artisan passport:client --personal
Если вы уже определили клиент персонального доступа, вы можете поручить Passport использовать его, используя personalAccessClientId
метод. Как правило, этот метод должен вызываться из boot
метода вашего AuthServiceProvider
:
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::personalAccessClientId('client-id');
}
Управление токенами личного доступа
Создав клиент персонального доступа, вы можете выдать токены для данного пользователя, используя createToken
метод в User
экземпляре модели. createToken
Метод принимает имя маркера в качестве первого аргумента и дополнительный массив областей в качестве второго аргумента:
$user = App\User::find(1);
// Creating a token without scopes...
$token = $user->createToken('Token Name')->accessToken;
// Creating a token with scopes...
$token = $user->createToken('My Token', ['place-orders'])->accessToken;
JSON API
Passport также включает JSON API для управления токенами личного доступа. Вы можете связать это со своим собственным интерфейсом, чтобы предложить своим пользователям панель управления для управления токенами личного доступа. Ниже мы рассмотрим все конечные точки API для управления токенами личного доступа. Для удобства мы будем использовать Axios для демонстрации выполнения HTTP-запросов к конечным точкам.
JSON API охраняется web
и auth
промежуточного программного обеспечения ; следовательно, он может быть вызван только из вашего собственного приложения. Он не может быть вызван из внешнего источника.
Если вы не хотите самостоятельно реализовывать внешний интерфейс токена личного доступа, вы можете использовать быстрый запуск внешнего интерфейса, чтобы получить полностью функциональный внешний интерфейс за считанные минуты.
GET /oauth/scopes
Этот маршрут возвращает все области, определенные для вашего приложения. Вы можете использовать этот маршрут для получения списка областей, которые пользователь может назначить для персонального токена доступа:
axios.get('/oauth/scopes')
.then(response => {
console.log(response.data);
});
GET /oauth/personal-access-tokens
Этот маршрут возвращает все маркеры личного доступа, созданные аутентифицированным пользователем. Это в первую очередь полезно для перечисления всех токенов пользователя, чтобы они могли редактировать или удалять их:
axios.get('/oauth/personal-access-tokens')
.then(response => {
console.log(response.data);
});
POST /oauth/personal-access-tokens
Этот маршрут создает новые персональные токены доступа. Требуется две части данных: токен name
и тот, scopes
который должен быть назначен токену:
const data = {
name: 'Token Name',
scopes: []
};
axios.post('/oauth/personal-access-tokens', data)
.then(response => {
console.log(response.data.accessToken);
})
.catch (response => {
// List errors on response...
});
DELETE /oauth/personal-access-tokens/{token-id}
Этот маршрут может быть использован для удаления токенов личного доступа:
axios.delete('/oauth/personal-access-tokens/' + tokenId);
Защита маршрутов
Через промежуточное ПО
Паспорт включает в себя защиту аутентификации, которая будет проверять токены доступа на входящие запросы. После того, как вы настроили api
защиту для использования passport
драйвера, вам нужно только указать промежуточное ПО на любых маршрутах, для которых требуется действительный токен доступа:auth:api
Route::get('/user', function () {
//
})->middleware('auth:api');
Передача токена доступа
При вызове маршрутов, защищенных Passport, потребители API вашего приложения должны указывать свой токен доступа в качестве Bearer
токена в Authorization
заголовке своего запроса. Например, при использовании библиотеки Guzzle HTTP:
$response = $client->request('GET', '/api/user', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '.$accessToken,
],
]);
Области применения токенов
Области позволяют вашим клиентам API запрашивать определенный набор разрешений при запросе авторизации для доступа к учетной записи. Например, если вы создаете приложение электронной коммерции, не всем потребителям API потребуется возможность размещать заказы. Вместо этого вы можете разрешить потребителям запрашивать только авторизацию для доступа к статусам отгрузки заказа. Другими словами, области позволяют пользователям вашего приложения ограничивать действия, которые стороннее приложение может выполнять от их имени.
Определение областей
Вы можете определить области действия своего API, используя метод в методе вашего . Метод принимает массив имен области видимости и описаний области видимости. Описание области может быть любым по вашему желанию и будет отображаться пользователям на экране подтверждения авторизации:Passport::tokensCan
boot
AuthServiceProvider
tokensCan
use Laravel\Passport\Passport;
Passport::tokensCan([
'place-orders' => 'Place orders',
'check-status' => 'Check order status',
]);
Область действия по умолчанию
Если клиент не запрашивает какие-либо конкретные области, вы можете настроить свой сервер Passport на присоединение области действия по умолчанию к токену, используя setDefaultScope
метод. Как правило, вы должны вызывать этот метод из boot
метода вашего AuthServiceProvider
:
use Laravel\Passport\Passport;
Passport::setDefaultScope([
'check-status',
'place-orders',
]);
Назначение областей действия токенам
При запросе кодов авторизации
При запросе токена доступа с использованием предоставления кода авторизации потребители должны указать свои желаемые области в качестве scope
параметра строки запроса. 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);
});
При выдаче токенов личного доступа
Если вы выдаете персональные токены доступа с использованием метода User
модели createToken
, вы можете передать массив требуемых областей в качестве второго аргумента метода:
$token = $user->createToken('My Token', ['place-orders'])->accessToken;
Проверка областей
Паспорт включает в себя два промежуточных программного обеспечения, которые могут использоваться для проверки того, что входящий запрос аутентифицирован с помощью токена, которому предоставлена данная область. Для начала добавьте следующее промежуточное ПО в $routeMiddleware
свойство вашего файла:app/Http/Kernel.php
'scopes' => \Laravel\Passport\Http\Middleware\CheckScopes::class,
'scope' => \Laravel\Passport\Http\Middleware\CheckForAnyScope::class,
Проверьте для всех областей
scopes
Промежуточный слой может быть назначен на маршрут , чтобы убедиться , что маркер доступа входящего запроса имеет все из перечисленных областей:
Route::get('/orders', function () {
// Access token has both "check-status" and "place-orders" scopes...
})->middleware('scopes:check-status,place-orders');
Проверьте наличие любых областей
scope
Промежуточный слой может быть назначен на маршрут , чтобы убедиться , что маркер доступа входящего запроса имеет по крайней мере один из перечисленных областей:
Route::get('/orders', function () {
// Access token has either "check-status" or "place-orders" scope...
})->middleware('scope:check-status,place-orders');
Проверка областей действия в экземпляре токена
Как только запрос аутентификации токена доступа вошел в ваше приложение, вы все равно можете проверить, имеет ли токен заданную область, используя tokenCan
метод для аутентифицированного User
экземпляра:
use Illuminate\Http\Request;
Route::get('/orders', function (Request $request) {
if ($request->user()->tokenCan('place-orders')) {
//
}
});
Дополнительные методы охвата
scopeIds
Метод возвращает массив всех определенных идентификаторов / имен:
Laravel\Passport\Passport::scopeIds();
scopes
Метод возвращает массив всех определенных областей как экземпляры :Laravel\Passport\Scope
Laravel\Passport\Passport::scopes();
scopesFor
Метод возвращает массив экземпляров , совпадающих с заданными идентификаторами / имена:Laravel\Passport\Scope
Laravel\Passport\Passport::scopesFor(['place-orders', 'check-status']);
Вы можете определить, была ли определенная область определена с помощью hasScope
метода:
Laravel\Passport\Passport::hasScope('place-orders');
Использование вашего API с JavaScript
При создании API может быть чрезвычайно полезно иметь возможность использовать свой собственный API из приложения JavaScript. Такой подход к разработке API позволяет вашему приложению использовать тот же API, которым вы делитесь со всем миром. Один и тот же API может использоваться вашим веб-приложением, мобильными приложениями, сторонними приложениями и любыми SDK, которые вы можете публиковать в различных менеджерах пакетов.
Как правило, если вы хотите использовать свой API из приложения JavaScript, вам нужно будет вручную отправить маркер доступа к приложению и передавать его с каждым запросом к вашему приложению. Тем не менее, Passport включает промежуточное программное обеспечение, которое может обработать это для вас. Все, что вам нужно сделать, это добавить CreateFreshApiToken
промежуточное web
программное обеспечение в группу промежуточного программного обеспечения в вашем файле:app/Http/Kernel.php
'web' => [
// Other middleware...
\Laravel\Passport\Http\Middleware\CreateFreshApiToken::class,
],
Вы должны убедиться, что
EncryptCookies
промежуточное программное обеспечение указано в списке доCreateFreshApiToken
промежуточного программного обеспечения в вашем стеке промежуточного программного обеспечения.
Это промежуточное программное обеспечение для паспорта будет прикреплять laravel_token
файлы cookie к вашим исходящим ответам. Этот файл cookie содержит зашифрованный JWT, который Passport будет использовать для аутентификации запросов API из вашего приложения JavaScript. Теперь вы можете делать запросы к API вашего приложения без явной передачи токена доступа:
axios.get('/api/user')
.then(response => {
console.log(response.data);
});
Настройка имени куки
При необходимости вы можете настроить имя laravel_token
файла cookie, используя метод. Как правило, этот метод должен вызываться из метода вашего :Passport::cookie
boot
AuthServiceProvider
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
Passport::cookie('custom_name');
}
CSRF Защита
При использовании этого метода аутентификации по умолчанию Laravel JavaScript подмости инструктирует AXIOS всегда посылать и заголовки. Однако вы должны обязательно включить свой токен CSRF в метатег HTML :X-CSRF-TOKEN
X-Requested-With
// In your application layout...
<meta name="csrf-token" content="{{ csrf_token() }}">
// Laravel's JavaScript scaffolding...
window.axios.defaults.headers.common = {
'X-Requested-With': 'XMLHttpRequest',
};
События
Паспорт вызывает события при выдаче токенов доступа и обновлений токенов. Вы можете использовать эти события для удаления или отзыва других токенов доступа в вашей базе данных. Вы можете прикрепить слушателей к этим событиям в вашем приложении EventServiceProvider
:
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Laravel\Passport\Events\AccessTokenCreated' => [
'App\Listeners\RevokeOldTokens',
],
'Laravel\Passport\Events\RefreshTokenCreated' => [
'App\Listeners\PruneOldTokens',
],
];
Тестирование
actingAs
Метод Passport может использоваться для указания аутентифицируемого пользователя, а также его областей действия. Первый аргумент, данный actingAs
методу, является экземпляром пользователя, а второй - массивом областей, которые должны быть предоставлены токену пользователя:
use App\User;
use Laravel\Passport\Passport;
public function testServerCreation()
{
Passport::actingAs(
factory(User::class)->create(),
['create-servers']
);
$response = $this->post('/api/create-server');
$response->assertStatus(201);
}
0 комментариев