在本教程中,咱們將瞭解如何在 Laravel 應用中使用 laravel passport 認證。 咱們還將使用 Laravel Passport 認證 構建一個簡單的產品 (建立, 查詢, 更新和刪除 )。php
Laravel 已經提供了傳統的登陸表單身份驗證,可是若是你想使用 APIs 呢?APIs 使用令牌來驗證用戶,由於它們不使用會話。當用戶經過 API 登陸時,會生成令牌並將其發送給用戶,該用戶可用於身份驗證。Laravel 提供 Passport ,能夠毫無困難地使用 API 認證。laravel
讓咱們看看如何在 Laravel 應用程序中設置和配置用於 API 認證和 RESTful APIs 的 Laravel Passport 。git
咱們新建一個Laravel
應用。 執行下面的命令就能夠建立一個全新的laravel
應用。github
composer create-project --prefer-dist laravel/laravel passport
Passport
擴展咱們使用composer
安裝Passport
擴展。 執行下面的命令來安裝這個擴展。web
composer require laravel/passport
Laravel
配置Passport
Laravel
Passport
擴展須要作一些配置。數據庫
咱們使用的 Laravel 5.6
最新版本,它能夠使用包發現並自動註冊服務。若是你使用 laravel 5.4 或者 更低版本,你須要在 config/app.php 文件中爲Passport
註冊服務。就這樣,在這個文件中的providers數組中添加註冊服務。json
'providers' => [ .... Laravel\Passport\PassportServiceProvider::class, ]
在.env 文件中設置數據庫憑據。 Laravel Passport 提供了須要在咱們的數據庫中的護照表的遷移文件。 Passport遷移用於存儲令牌和客戶端信息。 運行migration
命令以將架構遷移到數據庫。api
php artisan migrate
接下來,須要使用如下命令安裝 Passport
。 它將生成生成祕密訪問令牌所需的加密密鑰。數組
php artisan passport:install
在此步驟中,咱們須要在 Laravel
應用程序中進行更改以完成 Passport
配置。服務器
在你的 User model 中添加 LaravelPassportHasApiTokens trait 。它將提供一些輔助方法。
<?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 的引導方法中添加 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 文件中,將驅動程序設置爲 passport。
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 方法建立 token,並將名稱做爲參數傳遞。最後,咱們在 JSON 響應中返回 token。
在 login 方法中,咱們嘗試使用請求參數進行身份驗證。而後,根據嘗試的成功或失敗返回適當的響應。
在 details 方法中咱們只返回用戶模型。
讓咱們建立一個產品的 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 請求頭中將 token 指定爲 Bearer token。 基本上,你必須將登陸和註冊後收到的 token 拼到 Bearer 後面,當中空一個空格。
'headers' => [ 'Accept' => 'application/json', 'Authorization' => 'Bearer '. $accessToken, ]
產品列表接口
產品添加接口
產品展現接口
產品更新接口
產品刪除接口
本教程的完整代碼能夠從 github 獲取 GitHub
文章轉自: https://learnku.com/laravel/t...
更多文章: https://learnku.com/laravel/c...