Рубрики
Uncategorized

[учебное пособие] API restful, сертифицированный JWT в laravel

Автор оригинала: 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/”