В этом руководстве мы увидим, как использовать аутентификацию по паспорту 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.
интерфейс регистрации
интерфейс входа
Детальный интерфейс
При тестировании интерфейса сведений или любого API, требующего аутентификации пользователя, необходимо указать два заголовка запроса заголовка. Ты должен бытьAuthorizationЗаголовок запроса указывает токен какBearerтокен. По сути, вы должны ввести токен, полученный после входа и регистрации, вBearerПосле этого оставьте пробел.
'headers' => [
'Accept' => 'application/json',
'Authorization' => 'Bearer '. $accessToken,
]
Интерфейс списка продуктов
интерфейс добавления продукта
интерфейс отображения продукта
интерфейс обновления продукта
Интерфейс удаления продукта
Полный код для этого руководства можно получить на github.GitHub
Статья перепечатана с:Learncool.com/la-ravel/he/2…
Еще статьи:Learncool.com/pull-ravel/from/he…