Добавьте аутентификацию пользователя в свой REST API с помощью Laravel Passport

PHP

Laravel

В этом руководстве мы увидим, как использовать аутентификацию по паспорту laravel в приложении Laravel. мы также будем использоватьАутентификация паспорта LaravelСоздайте простой продукт (создайте, запросите, обновите и удалите).

Laravel уже предоставляет традиционную аутентификацию через форму входа, но что, если вы хотите использовать API? API используют токены для аутентификации пользователей, поскольку они не используют сеансы. Когда пользователь входит в систему через API, генерируется и отправляется пользователю токен, который можно использовать для аутентификации. Laravel предоставляетPassport, API-аутентификацию можно использовать без труда.

Давайте посмотрим, как установить и настроить Laravel Passport для аутентификации API и RESTful API в приложении Laravel.

Создать новое приложение

мы создаем новыйLaravelзаявление. Выполните следующую команду, чтобы создать новыйlaravelзаявление.

composer create-project --prefer-dist laravel/laravel passport

УстановитьPassportрасширять

Мы используемcomposerУстановитьPassportрасширение. Выполните следующую команду, чтобы установить это расширение.

composer require laravel/passport

LaravelнастроитьPassport

Laravel PassportРасширения требуют некоторой настройки.

поставщики услуг

мы используемLaravel 5.6В последней версии он может использовать обнаружение пакетов и автоматически регистрировать службы. если вы используетеларавель 5.4 или ниже, тебе следуетconfig/app.phpфайлPassportЗарегистрируйте услугу. Вот и все, в этом файлеprovidersДобавьте зарегистрированные сервисы в массив.

'providers' => [
    ....
    Laravel\Passport\PassportServiceProvider::class,
]

Миграция и установка

Задайте учетные данные базы данных в файле **.env**. Laravel Passport предоставляет файлы миграции, для которых требуются таблицы паспорта в нашей базе данных. Миграции паспортов используются для хранения токенов и клиентской информации. бегатьmigrationКоманда для переноса схемы в базу данных.

php artisan migrate

Далее вам необходимо установить с помощью следующей командыPassport. Он сгенерирует ключ шифрования, необходимый для создания токена секретного доступа.

php artisan passport:install

Конфигурация паспорта

На этом шаге нам нужноLaravelвнесите изменения в приложение, чтобы завершитьPassportконфигурация.

app/User.php

В твоем Userдобавить в модельLaravel\Passport\HasApiTokensчерта . Он предоставит некоторые вспомогательные методы.

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    /**
     * 这是可被赋值属性集合
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * 这是应该被隐藏的属性集合
     *
     * @var array
     */
    protected $hidden = [
        'password', 'remember_token',
    ];
}

AuthServiceProvider

существуетAuthServiceProviderдобавить в метод начальной загрузкиPassport :: routes()метод. Он сгенерирует необходимые маршруты. Это app/Providers/AuthServiceProvider.phpКак это выглядит после замены.

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * The policy mappings for the application.
     *
     * @var array
     */
    protected $policies = [
        'App\Model' => 'App\Policies\ModelPolicy',
    ];

    /**
     * Register any authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Passport::routes();
    }
}

config/auth.php

существует config/auth.phpфайл, установить драйвер на паспорт.

return [
    ....

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],

    ....
]

Создать маршрут

Давайте создадим маршрут API, вroutes/api.phpДобавить маршрут.

Route::post('login', 'PassportController@login');
Route::post('register', 'PassportController@register');

Route::middleware('auth:api')->group(function () {
    Route::get('user', 'PassportController@details');

    Route::resource('products', 'ProductController');
});

Создайте контроллер аутентификации

Настроим логику аутентификации. Создайте контроллер Passport, выполнив следующую команду.

php artisan make:controller PassportController

Скопируйте следующий код вapp/Http/Controllers/PassportController.php

<?php

namespace App\Http\Controllers;

use App\User;
use Illuminate\Http\Request;

class PassportController extends Controller
{
    /**
     * Handles Registration Request
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function register(Request $request)
    {
        $this->validate($request, [
            'name' => 'required|min:3',
            'email' => 'required|email|unique:users',
            'password' => 'required|min:6',
        ]);

        $user = User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => bcrypt($request->password)
        ]);

        $token = $user->createToken('TutsForWeb')->accessToken;

        return response()->json(['token' => $token], 200);
    }

    /**
     * Handles Login Request
     *
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function login(Request $request)
    {
        $credentials = [
            'email' => $request->email,
            'password' => $request->password
        ];

        if (auth()->attempt($credentials)) {
            $token = auth()->user()->createToken('TutsForWeb')->accessToken;
            return response()->json(['token' => $token], 200);
        } else {
            return response()->json(['error' => 'UnAuthorised'], 401);
        }
    }

    /**
     * Returns Authenticated User Details
     *
     * @return \Illuminate\Http\JsonResponse
     */
    public function details()
    {
        return response()->json(['user' => auth()->user()], 200);
    }
}

Позвольте мне объяснить код выше

существует registerметод, мы проверяем данные запроса, а затем создаем пользователя. Мы используем createTokenМетод создает токен, передавая имя в качестве параметра. Наконец, мы возвращаем токен в ответе JSON.

существует loginметод, мы пытаемся пройти аутентификацию, используя параметры запроса. Затем верните соответствующий ответ в зависимости от успеха или неудачи попытки.

существует detailsВ методе мы просто возвращаем модель User.

Создать продукт CRUD

Давайте создадим CRUD продукта. Выполните следующие команды, чтобы сгенерировать модель продукта, файл миграции и контроллер.

php artisan make:model Product -mc

Это создаст новый файл миграции базы данныхcreate_products_table.php существует database/migrations папка. Буду upМетод обновлен до следующего кода.

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id');
        $table->string('name');
        $table->integer('price');
        $table->timestamps();

        $table->foreign('user_id')
            ->references('id')
            ->on('users');
    });
}

Теперь добавьтеfillableприписыватьProductмодель.открытьappв папкеProduct.phpдокумент.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    protected $fillable = [
        'name', 'price'
    ];
}

Теперь запускаем миграцию данных.

php artisan migrate

Теперь давайтеapp/User.phpДобавьте метод ассоциации в файл.

public function products()
{
    return $this->hasMany(Product::class);
}

Открыть app/Http/Controllersв папкеProductController.phpдокумент. Скопируйте следующий код в контроллер продукта.

<?php

namespace App\Http\Controllers;

use App\Product;
use Illuminate\Http\Request;

class ProductController extends Controller
{
    public function index()
    {
        $products = auth()->user()->products;

        return response()->json([
            'success' => true,
            'data' => $products
        ]);
    }

    public function show($id)
    {
        $product = auth()->user()->products()->find($id);

        if (!$product) {
            return response()->json([
                'success' => false,
                'message' => 'Product with id ' . $id . ' not found'
            ], 400);
        }

        return response()->json([
            'success' => true,
            'data' => $product->toArray()
        ], 400);
    }

    public function store(Request $request)
    {
        $this->validate($request, [
            'name' => 'required',
            'price' => 'required|integer'
        ]);

        $product = new Product();
        $product->name = $request->name;
        $product->price = $request->price;

        if (auth()->user()->products()->save($product))
            return response()->json([
                'success' => true,
                'data' => $product->toArray()
            ]);
        else
            return response()->json([
                'success' => false,
                'message' => 'Product could not be added'
            ], 500);
    }

    public function update(Request $request, $id)
    {
        $product = auth()->user()->products()->find($id);

        if (!$product) {
            return response()->json([
                'success' => false,
                'message' => 'Product with id ' . $id . ' not found'
            ], 400);
        }

        $updated = $product->fill($request->all())->save();

        if ($updated)
            return response()->json([
                'success' => true
            ]);
        else
            return response()->json([
                'success' => false,
                'message' => 'Product could not be updated'
            ], 500);
    }

    public function destroy($id)
    {
        $product = auth()->user()->products()->find($id);

        if (!$product) {
            return response()->json([
                'success' => false,
                'message' => 'Product with id ' . $id . ' not found'
            ], 400);
        }

        if ($product->delete()) {
            return response()->json([
                'success' => true
            ]);
        } else {
            return response()->json([
                'success' => false,
                'message' => 'Product could not be deleted'
            ], 500);
        }
    }
}

тестовое задание

Теперь, когда наша логика завершена, давайте начнем тестирование. Мы проверим это на сервере разработки PHP, но вы можете использовать виртуальные хосты, если хотите. Выполните следующие команды, чтобы обслуживать приложение на сервере разработки PHP.

php artisan serve

Теперь давайте проверим наш API с помощью тестового жгута.Postman.

интерфейс регистрации

Laravel Passport Authentication Register

интерфейс входа

Laravel Passport Authentication Login

Детальный интерфейс

При тестировании интерфейса сведений или любого API, требующего аутентификации пользователя, необходимо указать два заголовка запроса заголовка. Ты должен бытьAuthorizationЗаголовок запроса указывает токен какBearerтокен. По сути, вы должны ввести токен, полученный после входа и регистрации, вBearerПосле этого оставьте пробел.

'headers' => [
    'Accept' => 'application/json',
    'Authorization' => 'Bearer '. $accessToken,
]

Laravel Passport Authentication Details

Интерфейс списка продуктов

Passport Authentication Product Index

интерфейс добавления продукта

Passport Authentication Product store

интерфейс отображения продукта

Passport Authentication Product show

интерфейс обновления продукта

Passport Authentication Product update

Интерфейс удаления продукта

Passport Authentication Product delete

Полный код для этого руководства можно получить на github.GitHub

Статья перепечатана с:Learncool.com/la-ravel/he/2…
Еще статьи:Learncool.com/pull-ravel/from/he…