Unetway

Laravel - Passport

Создать свой сайт

Вступление

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\HasApiTokensApp\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::routesbootAuthServiceProvider

<?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.phpdriverapipassportTokenGuard

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

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

Настройка миграции

Если вы не собираетесь использовать миграцию Passport по умолчанию, вам следует вызвать метод в вашем методе . Вы можете экспортировать миграции по умолчанию, используя .Passport::ignoreMigrationsregisterAppServiceProviderphp 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/componentsresources/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 выдает долговременные токены доступа, срок действия которых истекает через год. Если вы хотите , чтобы настроить длинный / короткий срок службы маркеров, вы можете использовать tokensExpireInrefreshTokensExpireInи 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:clientclient

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и redirectURL. redirectURL, где пользователь будет перенаправлен после утверждения или отказа в просьбе о выдаче разрешения.

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

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

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/authorizePassport::routes

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

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

Если вы хотите настроить экран подтверждения авторизации, вы можете опубликовать представления Passport с помощью команды Artisan. Опубликованные просмотры будут размещены в :vendor:publishresources/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/tokenaccess_tokenrefresh_tokenexpires_inexpires_in

Как и маршрут, маршрут определяется для вас методом. Нет необходимости вручную определять этот маршрут. По умолчанию этот маршрут регулируется с помощью настроек промежуточного программного обеспечения./oauth/authorize/oauth/tokenPassport::routesThrottleRequests

 

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

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

 

Предоставить токены

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

 

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

Прежде чем ваше приложение сможет выдавать токены с помощью предоставления пароля, вам нужно будет создать клиент предоставления пароля. Вы можете сделать это, используя команду с опцией. Если вы уже выполнили команду, вам не нужно запускать эту команду:passport:client--passwordpassport:install

php artisan passport:client --password

 

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

После создания клиента предоставления пароля вы можете запросить токен доступа, отправив POSTзапрос на маршрут с адресом электронной почты и паролем пользователя. Помните, этот маршрут уже зарегистрирован методом, поэтому нет необходимости определять его вручную. Если запрос выполнен успешно, вы получите и в ответ JSON с сервера:/oauth/tokenPassport::routesaccess_tokenrefresh_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_credentialsgrant:

$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/authorizePassport::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--personalpassport: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::tokensCanbootAuthServiceProvidertokensCan

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::cookiebootAuthServiceProvider

/**
 * 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-TOKENX-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);
}