Как использовать Laravel Passport для аутентификации REST API
В современной веб-разработке очень популярны API или веб-сервисы. При разработке мобильного приложения API играет роль моста для передачи данных между мобильным приложением и Интернетом. Обеспечение безопасности и аутентификации вызовов API важно для защиты данных, передаваемых между приложением.
В этой статье мы изучаем Laravel Passport, который позволяет нам аутентифицировать API. Passport построен поверх сервера OAuth2, который намного безопаснее с точки зрения безопасности.
При работе с API мы использовали для отправки токена доступа, чтобы проверить, действителен ли входящий запрос. Если он авторизован, то только он должен разрешать взаимодействие с приложением. Паспорт Laravel предоставляет удобный способ создания токена и проверки его соответствия вызову API.
Монтаж
Для начала предположим, что вы установили Laravel в своей системе. Чтобы установить Паспорт, выполните следующую команду в терминале.
composer require laravel/passport
Вышеупомянутая команда будет работать с последней версией Laravel. Если вы используете более старую версию, команда будет немного отличаться в зависимости от вашей версии Laravel. Например, если у вас установлен Laravel 5.5, ваша команда должна быть:
composer require laravel/passport=~4.0
Эта команда создает собственный каталог миграции базы данных. Эти миграции создадут таблицы, в которых будут храниться клиенты и токены доступа.
В своем config/app.php
файле зарегистрируйте поставщика услуг паспорта в массиве поставщиков.
config / app.php
'providers' =>[
....
LaravelPassportPassportServiceProvider::class,
],
Давайте запустим миграцию, которая создаст таблицы базы данных для Passport.
php artisan migrate
Теперь, если вы перейдете к своему клиенту базы данных, вы заметите новые таблицы, созданные в вашей базе данных.
Затем запустите приведенную ниже команду, которая создает ключи шифрования для генерации токенов безопасного доступа. Команда ниже создает клиентов «персональный доступ» и «предоставление пароля», которые сохраняются в таблице oauth_clients
.
php artisan passport:install
Пользователь может скопировать эти токены для следующих шагов. Фактически, мы увидим 2 способа создания токенов доступа. Один – через клиентов с «предоставлением пароля», а другой – через аутентификацию при входе в систему.
Конфигурация паспорта
Перейдите в каталоги Laravel и откройте AppUser
файл модели. В этом файле нам нужно добавить LaravelPassportHasApiTokens
трейт.
приложение / User.php.
<?php
namespace App;
use LaravelPassportHasApiTokens;
use IlluminateNotificationsNotifiable;
use IlluminateFoundationAuthUser as Authenticatable;
class User extends Authenticatable
{
use HasApiTokens, Notifiable;
....
}
После этого мы должны вызвать Passport::routes
метод в boot
методе AuthServiceProvider
.
приложение / Провайдеры / 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 Passport
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 / с необходимыми параметрами, и вы получите токен в ответ.
Мы предполагаем, что вы используете HTTP-библиотеку Guzzle для выполнения запросов к 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. Мы хотели бы услышать ваши мысли в разделе комментариев ниже. Мы также рекомендуем ознакомиться со статьей Laravel API Tutorial: How to Build and Test RESTful API, которую мы нашли полезной для читателей.