Як використовувати паспорт Laravel для автентифікації REST API
У сучасній веб-розробці дуже популярні API або веб-сервіси. Розробляючи мобільний додаток, API відіграє роль моста для передачі даних між мобільним додатком та Інтернетом. Забезпечення безпечного та автентифікованого виклику API важливо для захисту даних, що передаються між програмами.
У цій статті ми вивчаємо паспорт Laravel, який дозволяє нам автентифікувати API. Паспорт побудований на верхній частині сервера OAuth2, який набагато безпечніший у своїй побудові.
Маючи справу з API, ми раніше відправляли маркер доступу, щоб перевірити, чи є вхідний запит дійсним. Якщо це дозволено, лише воно повинно дозволяти взаємодію з додатком. Паспорт Laravel забезпечує зручний спосіб створення та перевірки токена щодо виклику API.
Встановлення
Для початку ми припускаємо, що ви встановили Laravel у свою систему. Щоб встановити Паспорт, запустіть наведену нижче команду в терміналі.
composer require laravel/passport
Вищенаведена команда буде працювати з останньою версією Laravel. Якщо у вас запущена старіша версія, команда буде дещо відрізнятися залежно від вашої версії Laravel. Наприклад, якщо встановлено Laravel 5.5, то ваша команда повинна бути такою:
composer require laravel/passport=~4.0
Ця команда створює власний каталог міграцій бази даних. Ці міграції створять таблиці, в яких зберігаються клієнти та маркери доступу.
У своєму config/app.php
файлі зареєструйте постачальника послуг Passport у масиві постачальників.
config / app.php
'providers' =>[
....
LaravelPassportPassportServiceProvider::class,
],
Давайте запустимо міграцію, яка створить таблиці бази даних для Passport.
php artisan migrate
Тепер, якщо ви перейдете до клієнта бази даних, ви помітите нові таблиці, створені у вашій базі даних.
Далі запустіть наведену нижче команду, яка створює ключі шифрування для генерації маркерів безпечного доступу. Нижче команда створює клієнтів «персонального доступу» та «надання пароля», які зберігаються у таблиці oauth_clients
.
php artisan passport:install
Користувач може скопіювати ці маркери для подальших кроків. Власне, ми побачимо 2 способи створення токенів доступу. Один з них здійснюється за допомогою цього клієнта «надання пароля», а інший – аутентифікацію входу.
Конфігурація паспорта
Перейдіть до каталогів Laravel і відкрийте AppUser
файл моделі. У цьому файлі нам потрібно додати LaravelPassportHasApiTokens
ознаку.
app / User.php.
<?php
namespace App;
use LaravelPassportHasApiTokens;
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
....
}
Після цього ми повинні викликати Passport::routes
метод у boot
методі AuthServiceProvider
.
app / Providers / AuthServiceProvider.php
<?php
namespace AppProviders;
use LaravelPassportPassport;
use IlluminateSupportFacadesGate;
use IlluminateFoundationSupportProvidersAuthServiceProvider as ServiceProvider;
class AuthServiceProvider extends ServiceProvider
{
/**
* The policy mappings for the application.
*
* @var array
*/
protected $policies = [
'AppModel' => 'AppPoliciesModelPolicy',
];
/**
* Register any authentication / authorization services.
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Passport::routes();
}
}
Нарешті, у config/auth.php
файлі встановіть для параметра «драйвер» захисника автентифікації «api» значення «паспорт» таким чином:
config / auth.php
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'passport',
'provider' => 'users',
],
],
Створіть REST API і захистіть його за допомогою паспорта Laravel
Laravel створює файл, routes/api.php
де ми повинні оголосити кінцеву точку наших REST API. Ми можемо захистити наш API, додавши до нього проміжне програмне забезпечення auth:api
.
маршрути / api.php
Route::get('/api/categories', 'ApiController@categories')->middleware('auth:api');
Для кількох кінцевих точок нам не потрібно кожного разу додавати проміжне програмне забезпечення. Натомість ми можемо зробити це наступним чином:
Route::group(['middleware' => 'auth:api'], function(){
Route::get('products', 'ApiController@products');
Route::get('categories', 'ApiController@categories');
});
Оскільки наша кінцева точка "продукти" захищена, якщо ми викликаємо її безпосередньо без маркера авторизації, ми отримуємо відповідь "Неаутентифікований".
Це означає, що під час виклику API важливо передавати маркер авторизації у кожному запиті. Отже, Passport перевірить маркер і поверне відповідь.
Створити маркер доступу для API
Існує кілька способів створити маркер доступу для програми. Ми побачимо 2 з них для цього підручника.
Перший варіант
По-перше, вам потрібно викликати / oauth / token з необхідними параметрами, і ви отримаєте маркер у відповідь.
Ми вважаємо, що ви використовуєте Guzzle HTTP-бібліотеку для надсилання запитів API. Скажімо, у вас є інший проект, звідки ви робите запит API.
<?php
require_once "vendor/autoload.php";
use GuzzleHttpClient;
$client = new Client([
// Base URI is used with relative requests
'base_uri' => 'http://laravel.dev',
]);
$response = $client->post('/oauth/token', [
'form_params' => [
'grant_type' => 'password',
'client_id' => '2',
'client_secret' => '8qyKG7WKb3O3FZh2hUyEOZ3dAj5l9S5ljn2bdeJf',
'username' => '[email protected]',
'password' => 'my_password',
'scope' => '*',
],
]);
$arr_result = json_decode((string) $response->getBody(), true);
Наведений вище код повертає масив, що містить ключ ‘access_token’. Параметри client_id та client_secret ми отримали під час запуску passport:install
. Ви також можете отримати ці дані з таблиці бази даних ‘oauth_clients’.
Знову спробуйте від листоноші, передавши access_token кінцевій точці ‘products’, і ми повинні отримати відповідь.
Насправді вам потрібно викликати цей API, як показано нижче:
$response = $client->get('/products', [
'headers' => [
'Authorization' => 'Bearer '.$access_token,
]
]);
$arr_result = json_decode((string) $response->getBody(), true);
Другий варіант
У першому варіанті ви повинні знати client_id та client_secret, щоб створити свій маркер. Це може бути не зручним способом у деяких сценаріях. Passport надає ще одну можливість генерування маркера доступу лише через облікові дані для входу.
У нашому ApiController.php
додайте метод входу із запитом на повідомлення та напишіть у ньому код нижче.
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;
use IlluminateSupportFacadesAuth;
class ApiController extends Controller
{
public function login(){
if(Auth::attempt(['email' => request('email'), 'password' => request('password')])){
$user = Auth::user();
$success['token'] = $user->createToken('MyApp')-> accessToken;
return response()->json(['success' => $success], 200);
}
else{
return response()->json(['error'=>'Unauthorised'], 401);
}
}
Для здійснення цього виклику API нам потрібно зареєструвати для нього маршрут.
маршрути / api.php
Route::post('login', 'ApiController@login');
Користувач може зробити запит на публікацію HTTP до цього API, написавши код нижче:
$response = $client->post('/api/login', [
'form_params' => [
'email' => '[email protected]',
'password' => 'my_password'
],
]);
$arr_result = json_decode((string) $response->getBody(), true);
Ми сподіваємось, ви розумієте використання Laravel Passport для автентифікації REST API. Ми хотіли б почути ваші думки в розділі коментарів нижче. Ми також рекомендуємо переглянути статтю Підручник з API Laravel: Як створити та протестувати RESTful API, який ми знайшли корисним для читачів.