摘要:在本教程中,我們將了解如何在應(yīng)用中使用認(rèn)證。當(dāng)用戶通過登錄時(shí),會(huì)生成令牌并將其發(fā)送給用戶,該用戶可用于身份驗(yàn)證。提供,可以毫無困難地使用認(rèn)證。服務(wù)提供者我們使用的最新版本,它可以使用包發(fā)現(xiàn)并自動(dòng)注冊服務(wù)。
在本教程中,我們將了解如何在 Laravel 應(yīng)用中使用 laravel passport 認(rèn)證。 我們還將使用 Laravel Passport 認(rèn)證 構(gòu)建一個(gè)簡單的產(chǎn)品 (創(chuàng)建, 查詢, 更新和刪除 )。
Laravel 已經(jīng)提供了傳統(tǒng)的登錄表單身份驗(yàn)證,但是如果你想使用 APIs 呢?APIs 使用令牌來驗(yàn)證用戶,因?yàn)樗鼈儾皇褂脮?huì)話。當(dāng)用戶通過 API 登錄時(shí),會(huì)生成令牌并將其發(fā)送給用戶,該用戶可用于身份驗(yàn)證。Laravel 提供 Passport ,可以毫無困難地使用 API 認(rèn)證。
讓我們看看如何在 Laravel 應(yīng)用程序中設(shè)置和配置用于 API 認(rèn)證和 RESTful APIs 的 Laravel Passport 。
創(chuàng)建一個(gè)新的應(yīng)用我們新建一個(gè)Laravel 應(yīng)用。 執(zhí)行下面的命令就可以創(chuàng)建一個(gè)全新的laravel應(yīng)用。
composer create-project --prefer-dist laravel/laravel passport安裝Passport 擴(kuò)展
我們使用composer 安裝Passport 擴(kuò)展。 執(zhí)行下面的命令來安裝這個(gè)擴(kuò)展。
composer require laravel/passportLaravel配置Passport
Laravel Passport 擴(kuò)展需要做一些配置。
服務(wù)提供者我們使用的 Laravel 5.6最新版本,它可以使用包發(fā)現(xiàn)并自動(dòng)注冊服務(wù)。如果你使用?laravel 5.4 或者 更低版本,你需要在?config/app.php?文件中為Passport注冊服務(wù)。就這樣,在這個(gè)文件中的providers數(shù)組中添加注冊服務(wù)。
"providers" => [ .... LaravelPassportPassportServiceProvider::class, ]遷移和安裝
在.env 文件中設(shè)置數(shù)據(jù)庫憑據(jù)。 Laravel Passport 提供了需要在我們的數(shù)據(jù)庫中的護(hù)照表的遷移文件。 Passport遷移用于存儲(chǔ)令牌和客戶端信息。 運(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ū)動(dòng)程序設(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)建一個(gè)產(chǎn)品的 CRUD。運(yùn)行以下命令生成產(chǎn)品模型、遷移文件、和控制器。
php artisan make:model Product -mc它將創(chuàng)建一個(gè)新的數(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 時(shí),你需要指定兩個(gè)標(biāo)頭請求頭信息。 你必須在 Authorization 請求頭中將 token 指定為 Bearer token。 基本上,你必須將登錄和注冊后收到的 token 拼到 Bearer 后面,當(dāng)中空一個(gè)空格。
"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://m.specialneedsforspecialkids.com/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 項(xiàng)目中使用 - API 文檔撰寫方案 推薦 Laravel API 項(xiàng)目必須使用的 8 個(gè)...
摘要:本文來自原文鏈接歡迎作客我們的學(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)行的遷移命令來自動(dòng)創(chuàng)建存儲(chǔ)客戶端和令牌的數(shù)據(jù)表第三步接下來,運(yùn)行命令來創(chuàng)建生成安全訪問令牌時(shí)所需的加密密鑰,同時(shí),這條命令也會(huì)創(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是一個(gè)安全框架,控制著程序受保護(hù)部分的準(zhǔn)入,主要是控制不同的客戶端如何來調(diào)取API,保證它們在請求相應(yīng)資源的時(shí)候有相應(yīng)的權(quán)限。 Larav...
摘要:最近在寫一個(gè)前后端分離項(xiàng)目,本來想用開發(fā)的,但是略感笨重,于是想到了的和新出的。更改看守器驅(qū)動(dòng)將配置文件中授權(quán)看守器的的選項(xiàng)改為。然后在你的前端請求里需要加入一個(gè)參數(shù)然后在你需要使用到認(rèn)證的路由里使用中間件,一切就大功告成啦 最近在寫一個(gè)前后端分離項(xiàng)目,本來想用 Jwt-auth + Dingo 開發(fā)的,但是略感笨重,于是想到了 Laravel 的 Passport 和 5.5 新出的...
閱讀 1999·2021-11-19 09:40
閱讀 1955·2021-09-28 09:36
閱讀 2291·2021-09-22 10:02
閱讀 2732·2019-08-30 14:00
閱讀 1957·2019-08-29 15:31
閱讀 2904·2019-08-29 15:11
閱讀 2913·2019-08-29 13:04
閱讀 1087·2019-08-27 10:55