Laravel (5.7) API-аутентификация (паспорт)
Для этой демонстрации у нас будет два приложения. Клиент (или потребитель) и API. Клиент будет примером приложения, пытающегося безопасно подключиться к нашему API, чтобы получить некоторые защищенные данные от API. API будет, ну, в общем, нашим искусным API.
Настройка API
Настройте новое приложение laravel:
$ laravel new todos
Теперь, когда мы закончили, мы должны создать некоторые миграции и заполнить таблицы базы данных некоторыми примерами данных.
$ cd todos
$ php artisan make:model Todo --migration --controller
Приведенная ниже команда ремесленников сделает для нас так много чудесных вещей. Сначала он создаст модель Todo, создаст миграцию для таблицы задач и, наконец, сгенерирует файл TodoController для всех нас в одну строку.
Теперь давайте быстро отредактируем созданную для нас миграцию. Откройте только что созданный файл миграции в каталоге базы данных и обновите блок миграции.
Schema::create('todos', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id');
$table->string('task');
$table->boolean('done');
$table->timestamps();
});
Теперь давайте добавим новый маршрут к файлу маршрутов / api.php. Мы добавляем его сюда, потому что мы намерены сделать его доступной конечной точкой API.
// routes/api.php
Route::get('/todos', 'TodoController');
Теперь давайте обновим TodoController, чтобы он отвечал на нашу конечную точку / todos. Конечная точка в основном возвращает все задачи в нашей системе.
// app/Http/Controllers/TodoController.php
<?php
namespace App\Http\Controllers;
use App\Todo;
class TodoController extends Controller
{
public function __invoke()
{
return Todo::all();
}
}
Теперь, когда мы закончили с контроллером, мы можем создать сеялку. Это заполнит нашу базу данных некоторыми примерами данных.
$ php artisan make:seed UsersTableSeeder
$ php artisan make:seed TodosTableSeeder
Теперь у нас есть файлы сеялки. Давайте отредактируем файлы сеялки, чтобы мы могли добавить логику для данных, которые мы хотим создать. Мы будем использовать удивительные модельные фабрики Laravel для генерации выборочных данных.
// database/seeds/UsersTableSeeder.php
factory(App\User::class)->create(['email' => '[email protected]']);
// database/seeds/TodosTableSeeder.php
factory(App\Todo::class, 10)->create(['user_id' => 1]);
// database/seeds/DatabaseSeeder.php
$this->call(UsersTableSeeder::class);
$this->call(TodosTableSeeder::class);
И, наконец, последний кусочек головоломки - создание модели фабрики. В вашей базе данных / фабрики / ModelFactory.php добавьте следующий блок:
$factory->define(App\Todo::class, function (Faker\Generator $faker) {
return [
'task' => $faker->sentence,
'done' => rand(0,1),
];
});
Теперь нам нужно убедиться, что у нас настроена база данных, и детали базы данных были введены в наш файл .env. После чего мы можем запустить команду:
$ php artisan migrate --seed
Теперь при посещении URL-адреса конечных точек http://todos.dev/api/todos должен возвращаться объект JSON, заполненный образцами элементов todo.
Настройка потребителя
Создайте новый каталог где-нибудь на вашем компьютере разработчика.
$ mkdir -p todoconsumer
$ cd todoconsumer
$ echo '<?php require "vendor/autoload.php";' > index.php
$ echo '{}' > composer.json
$ composer require guzzlehttp/guzzle
Убедитесь, что потребитель доступен через HTTP. Вот и все, чуть позже вернемся к этому потребительскому приложению.
Настройка Laravel Passport для аутентификации
Теперь, когда у нас работает API, давайте сделаем его безопасным с помощью Laravel Passport. В вашем каталоге todo API запустите команду для установки Laravel Passport.
$ composer require laravel/passport
Затем зарегистрируйте поставщика услуг Passport в массиве поставщиков вашего файла конфигурации config / app.php:
LaravelPassportPassportServiceProvider :: класс,
Теперь вы можете запустить следующие команды, чтобы полностью установить Laravel Passport в ваше приложение.
$ php artisan migrate
$ php artisan passport:install
Вы заметите, что команда passport: install artisan вернет что-то похожее на
Ключи шифрования сгенерированы успешно.
Клиент персонального доступа создан успешно.
Идентификатор клиента: 1
Секрет клиента: OUA4IhQj1t3kDRuWZ6N7DQb9h1N3ccXpQw9HS2iz
Клиент предоставления пароля успешно создан.
Идентификатор клиента: 2
Секрет клиента: oGhkm0EPSjqxJBMkaWNZ6lIuuZoby4ev787yW6cO
Паспорт автоматически установил два клиентских приложения для нас, в комплекте с ID и секретом. Запишите секрет клиента для идентификатора клиента 1, он понадобится нам позже.
Затем вам нужно добавить черту LaravelPassportHasApiTokens к вашей модели AppUser.
<?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;
}
Далее нам нужно зарегистрировать маршруты паспортов Laravel. Это то, что предоставляет нам URL-адреса авторизации для наших клиентов для создания токенов доступа и авторизации их запросов.
// app/Providers/AuthServiceProvider.php
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
Наконец, в файле конфигурации config / auth.php установите для параметра драйвера защиты аутентификации api значение passport.
'guards' => [
// ...
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Это все. Мы полностью установили паспорт Laravel.
Теперь давайте перейдем к фактическому использованию Passport.
Защита ваших конечных точек с помощью Laravel Passport
На этом этапе наша конечная точка по-прежнему возвращает весь список задач, независимо от того, уполномочены мы их видеть или нет, давайте исправим это.
В файле маршрутов добавьте промежуточное программное обеспечение auth: api к конечным точкам, которые вы хотите защитить. В нашем случае только одна конечная точка.
// routes/api.php
Route::get('todos', 'TodoController')->middleware('auth:api');
Теперь, когда мы достигаем конечной точки с помощью Postman, мы получим ошибку без аутентификации.
Это все. Мы закончили с Laravel Passport. Вы можете фактически прекратить чтение или посмотреть, как образец клиента будет использовать этот API.
Использование API из другого приложения
Теперь, когда мы успешно защитили наш драгоценный список задач, представьте, если бы мы хотели получить доступ к этому списку из нашего веб-приложения, как бы мы поступили?
Вернемся к нашему потребительскому приложению. Мы собираемся использовать тип предоставления пароля для получения токена доступа и использовать его для запроса защищенной конечной точки. Отредактируйте файл index.php в приемнике:
<?php
require "vendor/autoload.php";
$client = new GuzzleHttp\Client;
try {
$response = $client->post('http://todos.dev/oauth/token', [
'form_params' => [
'client_id' => 2,
// The secret generated when you ran: php artisan passport:install
'client_secret' => 'fx5I3bspHpnuqfHFtvdQuppAzdXC7nJclMi2ESXj',
'grant_type' => 'password',
'username' => '[email protected]',
'password' => 'secret',
'scope' => '*',
]
]);
// You'd typically save this payload in the session
$auth = json_decode( (string) $response->getBody() );
$response = $client->get('http://todos.dev/api/todos', [
'headers' => [
'Authorization' => 'Bearer '.$auth->access_token,
]
]);
$todos = json_decode( (string) $response->getBody() );
$todoList = "";
foreach ($todos as $todo) {
$todoList .="<li>{$todo->task}".($todo->done ? '?' : '')."</li>";
}
echo "<ul>{$todoList}</ul>";
} catch (GuzzleHttp\Exception\BadResponseException $e) {
echo "Unable to retrieve access token.";
}
Предыдущая: Laravel (5.7) Хеширование
Далее: Пример учебника по проверке электронной почты Laravel (5.7)
Новый контент: Composer: менеджер зависимостей для PHP , R программирования