摘要:在開發中,用戶認證是核心,是數據是否有保障的前提,目前主要有兩種常用方式進行用戶認證和。附是為了在網絡應用環境間傳遞聲明而執行的一種基于的開放標準。
好久沒寫 PHP 代碼了,尤其是 Lumen,我是 Lumen 的忠實用戶,自從面世開始,我就將 Lumen 作為我 API 的主要框架使用。
但說到 API,不得不說的一個概念:「前后端分離」,現在越來越多的團隊都采用前后端分離,徹底解放出前端的優勢,也讓后臺更加集中于數據的輸出。關于這方面的討論,不在這里討論了,可以參考一些文章深入研究:
https://segmentfault.com/a/11...
正因為有了前后端分離,后臺關注于接口 API 的輸出,當時 Lumen 的出現,就是為 RESTful API 而生的:
Decidedly Laravel. Delightfully Minimal.
Lightning fast micro-services and APIs delivered with the elegance you expect.
將 Lumen 作為接口框架使用,不得不解決一個核心問題:如何對訪問者進行「認證」。
用戶認證Lumen 雖然與 Laravel 使用了相同的底層類庫實現,但是因 Lumen 面向的是無狀態 API 的開發,不支持 session,所以默認的配置不同。Lumen 必須使用無狀態的機制來實現,如 API 令牌(Token)。
我們看看 Lumen 官網提供的例子:
use IlluminateHttpRequest; $app->get("/post/{id}", ["middleware" => "auth", function (Request $request, $id) { $user = Auth::user(); $user = $request->user(); // }]);
其中使用了中間件:"middleware" => "auth",我們看看 auth 中間件函數:
$app->routeMiddleware([ "auth" => AppHttpMiddlewareAuthenticate::class, ]);
關聯的是 Authenticate 類,我們看 Authenticate 的 handle 函數:
/** * Handle an incoming request. * * @param IlluminateHttpRequest $request * @param Closure $next * @param string|null $guard * @return mixed */ public function handle($request, Closure $next, $guard = null) { if ($this->auth->guard($guard)->guest()) { return response("Unauthorized.", 401); } return $next($request); }
首先會判斷$this->auth->guard($guard)->guest()。我們繼續跟進代碼到 AuthManager 中:
/** * Attempt to get the guard from the local cache. * * @param string $name * @return IlluminateContractsAuthGuard|IlluminateContractsAuthStatefulGuard */ public function guard($name = null) { $name = $name ?: $this->getDefaultDriver(); return isset($this->guards[$name]) ? $this->guards[$name] : $this->guards[$name] = $this->resolve($name); }
默認傳入的 $name = null,所以我們看看 $this->getDefaultDriver():
/** * Get the default authentication driver name. * * @return string */ public function getDefaultDriver() { return $this->app["config"]["auth.defaults.guard"]; }
這就到了默認的配置 config 中了:
從 Lumen 源代碼中可以看出 Lumen 的默認認證方式「api」。
我們再來看看 Laravel 的默認認證方式:
Laravel 默認采用「web」方式,而 web 方式是使用 session 來進行用戶認證。這也就很好的說明了 Lumen 的無狀態性。
接著我們需要明白 Lumen 如何通過「api」來進行用戶認證的。
AuthServiceProvider 存放在 app/Providers 文件夾中,此文件中只有一個 Auth::viaRequest 調用。viaRequest 會在系統需要認證的時候被調用,此方法接受一個匿名函數傳參,在此匿名函數內,你可以任意的解析 AppUser 并返回,或者在解析失敗時返回 null,如:
/** * Boot the authentication services for the application. * * @return void */ public function boot() { // Here you may define how you wish users to be authenticated for your Lumen // application. The callback which receives the incoming request instance // should return either a User instance or null. You"re free to obtain // the User instance via an API token or any other method necessary. $this->app["auth"]->viaRequest("api", function ($request) { if ($request->input("api_token")) { return User::where("api_token", $request->input("api_token"))->first(); } }); }
我們來看看 viaRequest 函數:
/** * Register a new callback based request guard. * * @param string $driver * @param callable $callback * @return $this */ public function viaRequest($driver, callable $callback) { return $this->extend($driver, function () use ($callback) { $guard = new RequestGuard($callback, $this->app["request"], $this->createUserProvider()); $this->app->refresh("request", $guard, "setRequest"); return $guard; }); }
這里關鍵的是 RequestGuard,這個類的核心函數:
/** * Get the currently authenticated user. * * @return IlluminateContractsAuthAuthenticatable|null */ public function user() { // If we"ve already retrieved the user for the current request we can just // return it back immediately. We do not want to fetch the user data on // every call to this method because that would be tremendously slow. if (! is_null($this->user)) { return $this->user; } return $this->user = call_user_func( $this->callback, $this->request, $this->getProvider() ); }
這個是判斷是否獲取用戶信息,主要是調用callback 函數,而這個函數就是我們從 viaRequest 傳入的:
function ($request) { if ($request->input("api_token")) { return User::where("api_token", $request->input("api_token"))->first(); } }
而這只是舉一個驗證用戶的例子,判斷請求是否傳入 api_token參數,并通過 User Model 直接匹配查找獲取 User or null。
當然在實際開發中,我們不能只是簡單的獲取 api_token直接關聯數據庫查找用戶信息。
在 API 開發中,用戶認證是核心,是數據是否有保障的前提,目前主要有兩種常用方式進行用戶認證: JWT 和 OAuth2。
下一步當前只是對 Lumen 的「用戶認證」進行簡單的了解,下一步通過對 「JWT」的學習,來看看如何利用 JWT 來有效的用戶認證,更加安全的保障接口信息被有效的用戶訪問。
附:
Json web token (JWT), 是為了在網絡應用環境間傳遞聲明而執行的一種基于JSON 的開放標準 (RFC 7519)。該 token 被設計為緊湊且安全的,特別適用于分布式站點的單點登錄(SSO)場景。JWT 的聲明一般被用來在身份提供者和服務提供者間傳遞被認證的用戶身份信息,以便于從資源服務器獲取資源,也可以增加一些額外的其它業務邏輯所必須的聲明信息,該 token 也可直接被用于認證,也可被加密。
「未完待續」
coding01 期待您繼續關注
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25956.html
摘要:在開發中,用戶認證是核心,是數據是否有保障的前提,目前主要有兩種常用方式進行用戶認證和。為了學習在中的使用,最好的辦法就是在程序員同志網搜索有關插件,找個最多的那個拿來研究研究。 通過上一篇《學習 Lumen 用戶認證 (一)》https://mp.weixin.qq.com/s/KVUQE2DUetNB2kqxHs0VDg的學習,大致懂了 Lumen 的用戶認證主要使用 「api」的...
摘要:如何做用戶認證根據文檔描述,提供用戶認證的接口,他的核心是看守器和提供器,看守器定義怎么認證用戶,提供器定義怎么檢索用戶。 最近的一個PHP項目,上一個項目是采用ThinkPHP來弄的,因為很早就聽說過Laravel的大名,所以進了Laravel的官網,意外發現了Lumen,正好我項目是提供API的,所以選擇了Lumen,因為是Laravel的精簡版,看了幾天的Laravel文檔,也總...
摘要:的現狀目前是版本,是基于開發。入口文件啟動文件和配置文件框架的入口文件是。在路由中指定控制器類必須寫全命名空間,不然會提示找不到類。目前支持四種數據庫系統以及。使用時發生錯誤,因為在文件中,的默認驅動是。 最近使用 Lumen 做了 2 個業余項目,特此記錄和分享一下。 Lumen 的介紹 在使用一項新的技術時,了解其應用場景是首要的事情。 Lumen 的口號:為速度而生的 La...
摘要:發布,新增隊列驅動,緩存驅動移動至,使用老版本的需要修改中緩存驅動加載位置。目前支持根據獲取配置的基本讀寫等。和可以繼續使用自帶的驅動,兩者互不影響。下一步如有需要可以繼續完善這兩部分的驅動。 歡迎關注我的博客 http://targetliu.com Lumen的確是一款適合做API,速度很快的框架。但是在項目中使用Redis時發現Lumen默認使用的 predis/predis 會...
摘要:最近在學習框架寫接口,記憶力比較差所以順便寫下筆記分割線因為直接學最新版的所以,記得開啟的,,擴展還有可以用的打開命令 最近在學習lumen框架寫API接口,記憶力比較差所以順便寫下筆記~ -----------------------------分割線-------------------------------- 因為直接學最新版的所以,PHP >=7.0記得開啟php.ini的o...
閱讀 3272·2021-11-22 14:44
閱讀 1116·2021-11-16 11:53
閱讀 1268·2021-11-12 10:36
閱讀 703·2021-10-14 09:43
閱讀 3695·2019-08-30 15:55
閱讀 3402·2019-08-30 14:14
閱讀 1740·2019-08-26 18:37
閱讀 3414·2019-08-26 12:12