Автор оригинала: David Wong.
Статья была переслана из профессионального сообщества разработчиков laravel. Оригинальная ссылка: https://learnku.com/laravel/t…
В этой статье мы узнаем, как создать restful API в laravel с использованием аутентификации JWT. JWT расшифровывается как веб-токены JSON. Мы также будем использовать API для создания полнофункционального приложения crud для пользовательских продуктов.
API-хороший выбор при использовании кроссплатформенных приложений. В дополнение к веб-сайту, ваш продукт может также иметь приложения для Android и IOS. В этом случае API так же хорош, потому что вы можете писать разные интерфейсы без изменения какого-либо внутреннего кода. При использовании API просто нажмите get, post или другие типы запросов с некоторыми параметрами, и сервер вернет некоторые данные в формате JSON (нотация объектов JavaScript), который обрабатывается клиентским приложением.
Объяснять
Давайте сначала запишем детали и функции вашего приложения. Мы будем использовать аутентификацию JWT для создания базового списка пользовательских продуктов в laravel с использованием restful API.
A Пользователь Будут использоваться следующие функции
- Зарегистрируйтесь и создайте новую учетную запись
- Войдите в их учетную запись
- Отмените регистрацию и откажитесь от токенов и покиньте приложение
- Получить данные пользователя для входа в систему
- Получение списка продуктов, доступных пользователям
- Поиск конкретных продуктов по идентификатору
- Добавить новый продукт в список продуктов пользователя
- Редактирование существующих сведений о продукте
- Удалите существующий продукт из списка пользователей
A Пользователь Необходимо заполнить
- имя
- электронная почта
- пароль
A Продукт Необходимо заполнить
- имя
- цена
- количество
Создайте новый проект
Выполнив следующую команду, мы можем запустить и создать новый проект laravel.
composer create-project --prefer-dist laravel/laravel jwt
Это будет называться jwt Создайте новый проект laravel в каталоге.
Настройка пакета расширения JWT
Мы будем использовать пакет расширения аутентификации tymondesigns/JWT, чтобы использовать JWT в laravel.
Установка пакета расширения аутентификации tymon/JWT
Давайте установим пакет расширения в приложение laravel. Если вы используете Laravel 5.5 или выше , выполните следующую команду, чтобы получить dev-разработку Версия пакета JWT:
composer require tymon/jwt-auth:dev-develop --prefer-source
Если вы используете Laravel 5.4 или менее , выполните следующую команду:
composer require tymon/jwt-auth
Для версии laravel Ниже 5,5 Вам также необходимо config/app. php Укажите поставщика услуг и псевдоним в файле.
'providers' => [
....
Tymon\JWTAuth\Providers\JWTAuthServiceProvider::class,
....
],
'aliases' => [
....
'JWTAuth' => Tymon\JWTAuth\Facades\JWTAuth::class,
'JWTFactory' => 'Tymon\JWTAuth\Facades\JWTFactory',
....
],Если ваша версия laravel 5.5 или выше , laravel выполнит автоматическое обнаружение пакетов.
Опубликовать профиль
о 5.5 или выше Пожалуйста, используйте следующую команду для публикации файла конфигурации:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"
Для предыдущих предыдущих версий laravel вам следует выполнить следующую команду:
php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\JWTAuthServiceProvider"
Приведенная выше команда сгенерирует config/jwt.php Файл конфигурации. Удалите раздел комментариев, и профиль будет выглядеть так:
env('JWT_SECRET'),
'keys' => [
'public' => env('JWT_PUBLIC_KEY'),
'private' => env('JWT_PRIVATE_KEY'),
'passphrase' => env('JWT_PASSPHRASE'),
],
'ttl' => env('JWT_TTL', 60),
'refresh_ttl' => env('JWT_REFRESH_TTL', 20160),
'algo' => env('JWT_ALGO', 'HS256'),
'required_claims' => [
'iss',
'iat',
'exp',
'nbf',
'sub',
'jti',
],
'persistent_claims' => [
// 'foo',
// 'bar',
],
'lock_subject' => true,
'leeway' => env('JWT_LEEWAY', 0),
'blacklist_enabled' => env('JWT_BLACKLIST_ENABLED', true),
'blacklist_grace_period' => env('JWT_BLACKLIST_GRACE_PERIOD', 0),
'decrypt_cookies' => false,
'providers' => [
'jwt' => Tymon\JWTAuth\Providers\JWT\Lcobucci::class,
'auth' => Tymon\JWTAuth\Providers\Auth\Illuminate::class,
'storage' => Tymon\JWTAuth\Providers\Storage\Illuminate::class,
],
];Сгенерировать ключ JWT
Токен JWT выдается с зашифрованным ключом. о Laravel 5.5 или выше , выполните следующую команду, чтобы сгенерировать ключ для выдачи токена.
php artisan jwt:secret
Версия Laravel меньше, чем 5.5 Бежать:
php artisan jwt:generate
В этом уроке используется Laravel 5.6 。 Следующими шагами в этом руководстве являются 5.5 и 5.6 Проверено внутри. Может не работать с laravel 5.4 или более поздней версии. Вы можете прочитать документацию для более старых версий laravel.
Регистрация Промежуточного программного обеспечения
Пакет расширения аутентификации JWT поставляется с промежуточным программным обеспечением, которое позволяет нам использовать. останься app/Http/Kernel.php Регистрация в Китае auth.jwt Промежуточное программное обеспечение:
protected $routeMiddleware = [
....
'auth.jwt' => \Tymon\JWTAuth\Http\Middleware\Authenticate::class,
];Промежуточное программное обеспечение проверяет аутентификацию пользователя, проверяя маркер, прикрепленный к запросу. Если пользователь не аутентифицирован, промежуточное программное обеспечение выдаст Исключение UnauthorizedHttpException Ненормальный.
Настройка маршрута
Прежде чем мы начнем, мы рассмотрим все пункты, обсуждаемые в этом руководстве. открыть маршруты/открыть маршруты/
Route::post('login', '[email protected]');
Route::post('register', '[email protected]');
Route::group(['middleware' => 'auth.jwt'], function () {
Route::get('logout', '[email protected]');
Route::get('user', '[email protected]');
Route::get('products', '[email protected]');
Route::get('products/{id}', '[email protected]');
Route::post('products', '[email protected]');
Route::put('products/{id}', '[email protected]');
Route::delete('products/{id}', '[email protected]');
});Обновить модель пользователя
JWT необходимо реализовать в пользовательской модели TymonJWTAuthКонтрактсJWTSубъект Интерфейс. В этом интерфейсе необходимо реализовать два метода getJWTIdentifier Сумма получить пользовательские претензии JWT 。 Обновление с помощью app/User.php 。
getKey();
}
/**
* Return a key value array, containing any custom claims to be added to the JWT.
*
* @return array
*/
public function getJWTCustomClaims()
{
return [];
}
}Логика аутентификации JWT
Давайте напишем логику API restful в laravel, используя аутентификацию JWT.
Для регистрации пользователям требуется имя, адрес электронной почты и пароль. Итак, давайте создадим запрос формы для проверки данных. Создайте файл с именем Зарегистрируйте запрос на аутентификацию Форма запроса на:
php artisan make:request RegisterAuthRequest
Это будет в приложении/Http/Запросы Создать в каталоге RegisterAuthRequest.php Документы. Вставьте следующий код в файл.
'required|string',
'email' => 'required|email|unique:users',
'password' => 'required|string|min:6|max:10'
];
}
}Выполните следующую команду, чтобы создать новый ApiController :
php artisan make:controller ApiController
Это будет в приложение/Http/Контроллеры Создать в каталоге ApiController.php Документы. Вставьте следующий код в файл.
name = $request->name;
$user->email = $request->email;
$user->password = bcrypt($request->password);
$user->save();
if ($this->loginAfterSignUp) {
return $this->login($request);
}
return response()->json([
'success' => true,
'data' => $user
], 200);
}
public function login(Request $request)
{
$input = $request->only('email', 'password');
$jwt_token = null;
if (!$jwt_token = JWTAuth::attempt($input)) {
return response()->json([
'success' => false,
'message' => 'Invalid Email or Password',
], 401);
}
return response()->json([
'success' => true,
'token' => $jwt_token,
]);
}
public function logout(Request $request)
{
$this->validate($request, [
'token' => 'required'
]);
try {
JWTAuth::invalidate($request->token);
return response()->json([
'success' => true,
'message' => 'User logged out successfully'
]);
} catch (JWTException $exception) {
return response()->json([
'success' => false,
'message' => 'Sorry, the user cannot be logged out'
], 500);
}
}
public function getAuthUser(Request $request)
{
$this->validate($request, [
'token' => 'required'
]);
$user = JWTAuth::authenticate($request->token);
return response()->json(['user' => $user]);
}
}Позвольте мне объяснить, что произошло в приведенном выше коде.
остаться зарегистрироваться Метод, мы получаем Запрос на регистрацию 。 Создайте пользователя, используя данные в запросе. Если войдите в систему После регистрации Атрибут true , после регистрации вызовите логин Метод для входа пользователя. В противном случае вместе с пользовательскими данными будет возвращен успешный ответ.
остаться войти Метод, мы получаем подмножество запроса, которое содержит только адрес электронной почты и пароль. Вызов с введенным значением в качестве параметра JWTAuth::попытка() , ответ сохраняется в переменной. Если из метода попытка , возвращается ответ об ошибке. В противном случае будет возвращен успешный ответ.
остаться выйти из системы Способ проверки того, что запрос содержит проверку маркера. Вызов метода invalidate делает токен недействительным и возвращает успешный ответ. Если захвачено Исключение JWTException , возвращается неудачный ответ.
оставайтесь getAuthUser Методом, убедитесь, что запрос содержит поле токена. Затем вызовите аутентификацию Метод, который возвращает аутентифицированного пользователя. Наконец, возвращается ответ с пользователем.
Раздел аутентификации теперь завершен.
Сборка части продукта
Чтобы создать раздел продукта, нам нужно Продукт Модели, контроллеры и файлы миграции. Выполните следующую команду, чтобы создать Продукт Модели, контроллеры и файлы миграции.
php artisan make:model Product -mc
Он будет находиться в база данных/миграции Создайте новый файл переноса базы данных в каталоге create_products_table.php , изменить вверх Метод.
public function up()
{
Schema::create('products', function (Blueprint $table) {
$table->increments('id');
$table->integer('user_id');
$table->string('name');
$table->integer('price');
$table->integer('quantity');
$table->timestamps();
$table->foreign('user_id')
->references('id')
->on('users')
->onDelete('cascade');
});
}по направлению Продукт Добавить в модель заполняемый Атрибут. остаться приложение Открыть в каталоге Product.php Файл и добавьте свойства.
protected $fillable = [
'name', 'price', 'quantity'
];Теперь в .env Создайте файл и перенесите базу данных, выполнив следующую команду.
php artisan migrate
Теперь мы должны Пользователь Добавьте связь в модель, чтобы получить связанные продукты. останься app/User.php Добавьте следующие методы в.
public function products()
{
return $this->hasMany(Product::class);
}оставайтесь приложение/Http/Контроллеры Открыть в каталоге ProductController.php Документы. Добавьте директиву use в начале файла, чтобы перезаписать предыдущую.
use App\Product; use Illuminate\Http\Request; use JWTAuth;
Теперь мы реализуем пять методов.
- индекс , получить все списки продуктов для прошедших проверку подлинности пользователей
- показать , получить конкретные продукты на основе идентификатора
- хранить , хранить новый продукт в списке продуктов
- обновить , обновить сведения о продукте в соответствии с идентификатором
- уничтожить , удалить товар из списка по идентификатору
Добавьте конструктор для получения аутентифицированного пользователя и сохраните его в атрибуте user .
protected $user;
public function __construct()
{
$this->user = JWTAuth::parseToken()->authenticate();
}парсеТокен Токен из запроса будет разрешен. аутентификация Аутентифицируйте пользователя с помощью токена.
Давайте добавим индекс Метод.
public function index()
{
return $this->user
->products()
->get(['name', 'price', 'quantity'])
->toArray();
}Приведенный выше код очень прост. Мы просто используем красноречивый метод, чтобы получить все продукты, а затем составляем массив результатов. Наконец, мы возвращаем этот массив. Laravel автоматически преобразует его в JSON и создаст код ответа 200 успешных.
Продолжайте достигать показывать Метод.
public function show($id)
{
$product = $this->user->products()->find($id);
if (!$product) {
return response()->json([
'success' => false,
'message' => 'Sorry, product with id ' . $id . ' cannot be found'
], 400);
}
return $product;
}Это также очень легко понять. Нам просто нужно найти товар по идентификатору. Если продукт не существует, возвращается ответ об ошибке 400. В противном случае возвращается массив продуктов.
Далее следует хранить Метод
public function store(Request $request)
{
$this->validate($request, [
'name' => 'required',
'price' => 'required|integer',
'quantity' => 'required|integer'
]);
$product = new Product();
$product->name = $request->name;
$product->price = $request->price;
$product->quantity = $request->quantity;
if ($this->user->products()->save($product))
return response()->json([
'success' => true,
'product' => $product
]);
else
return response()->json([
'success' => false,
'message' => 'Sorry, product could not be added'
], 500);
}оставайтесь храните Метод, убедитесь, что запрос содержит название, цену и количество. Затем используйте данные в запросе для создания новой модели продукта. Если продукт успешно записан в базу данных, будет возвращен успешный ответ, в противном случае будет возвращен настроенный ответ на 500 ошибок.
Реализация обновление Метод
public function update(Request $request, $id)
{
$product = $this->user->products()->find($id);
if (!$product) {
return response()->json([
'success' => false,
'message' => 'Sorry, product with id ' . $id . ' cannot be found'
], 400);
}
$updated = $product->fill($request->all())
->save();
if ($updated) {
return response()->json([
'success' => true
]);
} else {
return response()->json([
'success' => false,
'message' => 'Sorry, product could not be updated'
], 500);
}
}оставайтесь обновите Метод, мы получаем продукт по идентификатору. Если продукт не существует, возвращается ответ 400. Затем мы используем данные в запросе заполняем Способ заполнения сведений о продукте. Обновите модель продукта и сохраните ее в базе данных. Если запись успешно обновлена, будет возвращен ответ 200 об успешном завершении. В противном случае клиенту будет возвращен ответ на 500 внутренних ошибок сервера.
Теперь давайте добьемся уничтожения Метода.
public function destroy($id)
{
$product = $this->user->products()->find($id);
if (!$product) {
return response()->json([
'success' => false,
'message' => 'Sorry, product with id ' . $id . ' cannot be found'
], 400);
}
if ($product->delete()) {
return response()->json([
'success' => true
]);
} else {
return response()->json([
'success' => false,
'message' => 'Product could not be deleted'
], 500);
}
}В методе уничтожить мы получаем продукт в соответствии с идентификатором. если продукт не существует, мы возвращаем ответ 400. Затем мы удаляем продукт и возвращаем соответствующий ответ на основе статуса успешного выполнения операции удаления.
Код контроллера теперь завершен, и полный код контроллера находится здесь.
тест
Давайте сначала проверим аутентификацию. Мы будем использовать сервер Команда для запуска веб-службы на компьютере разработчика. Вместо этого вы также можете использовать виртуальный хост. Выполните следующую команду, чтобы запустить веб-службу.
php artisan serve
Он будет следить. локальный хост:8000
Для тестирования API restful мы используем postman. После заполнения тела запроса, давайте попросим его зарегистрироваться Маршрут.
Отправьте запрос, и вы получите токен.
Наши пользователи теперь зарегистрированы и прошли проверку подлинности. Мы можем отправить еще один запрос для обнаружения входа в систему Маршрут, результат вернет 200 и токен.
Получить сведения о пользователе
Проверка подлинности завершена. Затем протестируйте раздел продукта и сначала создайте продукт.
Теперь, по запросу индекс Метод, чтобы получить продукт.
Вы можете протестировать другие маршруты, и все они будут работать.
Исходный код учебника на GitHub.
Оригинал: “https://developpaper.com/tutorial-restful-api-certified-by-jwt-in-laravel/”