кодесурса
«Laravel

Laravel (5.7) API-аутентификация (паспорт)

script1adsense2code
script1adsense3code

Для этой демонстрации у нас будет два приложения. Клиент (или потребитель) и 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 программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code