摘要:在本教程中,我們將了解如何在應(yīng)用中使用認(rèn)證。當(dāng)用戶通過登錄時,會生成令牌并將其發(fā)送給用戶,該用戶可用于身份驗(yàn)證。提供,可以毫無困難地使用認(rèn)證。服務(wù)提供者我們使用的最新版本,它可以使用包發(fā)現(xiàn)并自動注冊服務(wù)。
在本教程中,我們將了解如何在 Laravel 應(yīng)用中使用 laravel passport 認(rèn)證。 我們還將使用 Laravel Passport 認(rèn)證 構(gòu)建一個簡單的產(chǎn)品 (創(chuàng)建, 查詢, 更新和刪除 )。
Laravel 已經(jīng)提供了傳統(tǒng)的登錄表單身份驗(yàn)證,但是如果你想使用 APIs 呢?APIs 使用令牌來驗(yàn)證用戶,因?yàn)樗鼈儾皇褂脮?。?dāng)用戶通過 API 登錄時,會生成令牌并將其發(fā)送給用戶,該用戶可用于身份驗(yàn)證。Laravel 提供 Passport ,可以毫無困難地使用 API 認(rèn)證。
讓我們看看如何在 Laravel 應(yīng)用程序中設(shè)置和配置用于 API 認(rèn)證和 RESTful APIs 的 Laravel Passport 。
創(chuàng)建一個新的應(yīng)用我們新建一個Laravel 應(yīng)用。 執(zhí)行下面的命令就可以創(chuàng)建一個全新的laravel應(yīng)用。
composer create-project --prefer-dist laravel/laravel passport安裝Passport 擴(kuò)展
我們使用composer 安裝Passport 擴(kuò)展。 執(zhí)行下面的命令來安裝這個擴(kuò)展。
composer require laravel/passportLaravel配置Passport
Laravel Passport 擴(kuò)展需要做一些配置。
服務(wù)提供者我們使用的 Laravel 5.6最新版本,它可以使用包發(fā)現(xiàn)并自動注冊服務(wù)。如果你使用?laravel 5.4 或者 更低版本,你需要在?config/app.php?文件中為Passport注冊服務(wù)。就這樣,在這個文件中的providers數(shù)組中添加注冊服務(wù)。
"providers" => [ .... LaravelPassportPassportServiceProvider::class, ]遷移和安裝
在.env 文件中設(shè)置數(shù)據(jù)庫憑據(jù)。 Laravel Passport 提供了需要在我們的數(shù)據(jù)庫中的護(hù)照表的遷移文件。 Passport遷移用于存儲令牌和客戶端信息。 運(yùn)行migration 命令以將架構(gòu)遷移到數(shù)據(jù)庫。
php artisan migrate
接下來,需要使用以下命令安裝 Passport。 它將生成生成秘密訪問令牌所需的加密密鑰。
php artisan passport:installPassport 配置
在此步驟中,我們需要在 Laravel 應(yīng)用程序中進(jìn)行更改以完成 Passport 配置。
app/User.php在你的 ?User?model 中添加?LaravelPassportHasApiTokens?trait 。它將提供一些輔助方法。
AuthServiceProvider在 AuthServiceProvider 的引導(dǎo)方法中添加 Passport :: routes() 方法。 它將生成必要的路由。 這是?app/Providers/AuthServiceProvider.php?在更改后的樣子。
"AppPoliciesModelPolicy", ]; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Passport::routes(); } }config/auth.php在?config/auth.php?文件中,將驅(qū)動程序設(shè)置為 passport。
return [ .... "guards" => [ "web" => [ "driver" => "session", "provider" => "users", ], "api" => [ "driver" => "passport", "provider" => "users", ], ], .... ]創(chuàng)建路由讓我們創(chuàng)建 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"); });創(chuàng)建認(rèn)證控制器讓我們設(shè)置身份驗(yàn)證邏輯。通過運(yùn)行以下命令創(chuàng)建 Passport 控制器。
php artisan make:controller PassportController將以下代碼復(fù)制到?app/Http/Controllers/PassportController.php
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 IlluminateHttpJsonResponse */ 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 IlluminateHttpJsonResponse */ public function details() { return response()->json(["user" => auth()->user()], 200); } }讓我來解釋一下上面的代碼
在?register?的方法中,我們驗(yàn)證請求數(shù)據(jù)然后創(chuàng)建用戶。我們使用 ?createToken?方法創(chuàng)建 token,并將名稱作為參數(shù)傳遞。最后,我們在 JSON 響應(yīng)中返回 token。
在 ?login?方法中,我們嘗試使用請求參數(shù)進(jìn)行身份驗(yàn)證。然后,根據(jù)嘗試的成功或失敗返回適當(dāng)?shù)捻憫?yīng)。
在?details?方法中我們只返回用戶模型。
創(chuàng)建產(chǎn)品 CRUD讓我們創(chuàng)建一個產(chǎn)品的 CRUD。運(yùn)行以下命令生成產(chǎn)品模型、遷移文件、和控制器。
php artisan make:model Product -mc它將創(chuàng)建一個新的數(shù)據(jù)庫遷移文件?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"); }); }現(xiàn)在, 添加?fillable?屬性到?Product?模型. 打開?app 文件夾下的?Product.php?文件.
現(xiàn)在我們運(yùn)行數(shù)據(jù)遷移。
php artisan migrate現(xiàn)在,讓我們在?app/User.php?文件中添加關(guān)聯(lián)關(guān)系方法。
public function products() { return $this->hasMany(Product::class); }打開?app/Http/Controllers 文件夾中的?ProductController.php?文件。復(fù)制以下代碼到到產(chǎn)品控制器。
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); } } }測試現(xiàn)在,我們的邏輯已經(jīng)完成,讓我們開始測試。 我們將在 PHP 開發(fā)服務(wù)器上測試它,但你可以根據(jù)需要使用虛擬主機(jī)。 運(yùn)行以下命令以在 PHP 開發(fā)服務(wù)器上提供應(yīng)用程序。
php artisan serve現(xiàn)在讓我們用測試工具測試我們的API?Postman.
注冊接口
登陸接口
詳情接口
在測試詳情接口或需要用戶進(jìn)行身份驗(yàn)證的任何 API 時,你需要指定兩個標(biāo)頭請求頭信息。 你必須在 Authorization 請求頭中將 token 指定為 Bearer token。 基本上,你必須將登錄和注冊后收到的 token 拼到 Bearer 后面,當(dāng)中空一個空格。
"headers" => [ "Accept" => "application/json", "Authorization" => "Bearer ". $accessToken, ]產(chǎn)品列表接口
產(chǎn)品添加接口
產(chǎn)品展示接口
產(chǎn)品更新接口
產(chǎn)品刪除接口
本教程的完整代碼可以從 github 獲取?GitHub
文章轉(zhuǎn)自:https://learnku.com/laravel/t...
更多文章:https://learnku.com/laravel/c...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31408.html
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區(qū)優(yōu)秀文章 Laravel 5.5+passport 放棄 dingo 開發(fā) API 實(shí)戰(zhàn),讓 API 開發(fā)更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...
摘要:本文來自原文鏈接歡迎作客我們的學(xué)習(xí)群比如說你要給你的手機(jī)用戶創(chuàng)建,使用的是你已有的系統(tǒng)里的數(shù)據(jù)庫,尤其是用戶數(shù)據(jù)。 本文來自pilishen.com----原文鏈接; 歡迎作客我們的php&Laravel學(xué)習(xí)群:109256050 比如說你要給你的手機(jī)APP用戶創(chuàng)建API,使用的是你已有的Laravel系統(tǒng)里的數(shù)據(jù)庫,尤其是用戶數(shù)據(jù)。現(xiàn)在我們來看一下,這里使用的是Laravel Pas...
摘要:第一部分安裝第一步使用安裝第二步服務(wù)提供器使用框架注冊自己的數(shù)據(jù)庫遷移目錄,因此在注冊提供器后,就應(yīng)該運(yùn)行的遷移命令來自動創(chuàng)建存儲客戶端和令牌的數(shù)據(jù)表第三步接下來,運(yùn)行命令來創(chuàng)建生成安全訪問令牌時所需的加密密鑰,同時,這條命令也會創(chuàng)建用于生 第一部分 安裝Passport(laravel/passport) 第一步. 使用 Composer 安裝 Passport :composer...
摘要:模糊授權(quán),跟上面的認(rèn)證碼授權(quán)類似,不同的是,我們的資源服務(wù)器,返回的直接就是準(zhǔn)入令牌,而不是認(rèn)證碼。 本文來自pilishen.com----原文鏈接; 歡迎來和pilishen一起學(xué)習(xí)php&Laravel;學(xué)習(xí)群:109256050 OAuth2是一個安全框架,控制著程序受保護(hù)部分的準(zhǔn)入,主要是控制不同的客戶端如何來調(diào)取API,保證它們在請求相應(yīng)資源的時候有相應(yīng)的權(quán)限。 Larav...
摘要:最近在寫一個前后端分離項目,本來想用開發(fā)的,但是略感笨重,于是想到了的和新出的。更改看守器驅(qū)動將配置文件中授權(quán)看守器的的選項改為。然后在你的前端請求里需要加入一個參數(shù)然后在你需要使用到認(rèn)證的路由里使用中間件,一切就大功告成啦 最近在寫一個前后端分離項目,本來想用 Jwt-auth + Dingo 開發(fā)的,但是略感笨重,于是想到了 Laravel 的 Passport 和 5.5 新出的...
閱讀 2001·2021-11-19 09:40
閱讀 1960·2021-09-28 09:36
閱讀 2291·2021-09-22 10:02
閱讀 2733·2019-08-30 14:00
閱讀 1962·2019-08-29 15:31
閱讀 2904·2019-08-29 15:11
閱讀 2915·2019-08-29 13:04
閱讀 1088·2019-08-27 10:55