摘要:最近在寫一個前后端分離項目,本來想用開發的,但是略感笨重,于是想到了的和新出的。更改看守器驅動將配置文件中授權看守器的的選項改為。然后在你的前端請求里需要加入一個參數然后在你需要使用到認證的路由里使用中間件,一切就大功告成啦
最近在寫一個前后端分離項目,本來想用 Jwt-auth + Dingo 開發的,但是略感笨重,于是想到了 Laravel 的 Passport 和 5.5 新出的 Api Resource。Laravel Passport 是一套已經封裝好的 OAuth2 服務端實現,關于 OAuth2 我以后我會多帶帶寫一篇文章,所以這里就不細說了,先來看看怎么安裝它吧。
安裝 安裝 Passport1.在你的 Shell 中執行以下命令
composer require laravel/passport
如果你使用的 Laravel 版本是 5.5 以下,你需要手動在 config/app.php 文件 providers 數組中加入如下代碼
LaravelPassportPassportServiceProvider::class,
2.運行遷移文件
在你的 Shell 中執行如下命令
php artisan migrate
Passport 服務提供器使用框架注冊自己的遷移目錄,因此在注冊服務后,你可以直接運行 php artisan migrate 來為 Passport 生成所需的數據表
3.生成加密密鑰
在你的 Shell 中執行如下命令
php artisan passport:install
此命令會創建生成安全訪問令牌時所需的加密密鑰,同時,這條命令也會創建用于生成訪問令牌的「個人訪問」客戶端和「密碼授權」。
4.添加 Trait
將 LaravelPassportHasApiTokens Trait 添加到 AppUser 模型中
5.注冊路由
在 AuthServiceProvider 的 boot 方法中調用 Passport::routes 函數。
class AuthServiceProvider extends ServiceProvider { public function boot() { $this->registerPolicies(); Passport::routes(); } }如果你的程序是需要前后端分離形式的OAuth認證而不是多平臺認證那么你可以在routers()方法中傳遞一個匿名函數來自定定義自己需要注冊的路由,我這里是前后端分離的認證形式,因此我只需要對我的前端一個Client提供Auth的認證,所以我只注冊了獲取Token的路由,同時我還為它自定義了前綴名。
Passport::routes(function(RouteRegistrar $router) { $router->forAccessTokens(); },["prefix" => "api/oauth"]);6.更改看守器驅動
將配置文件 config/auth.php 中授權看守器 guards 的 api 的 driver 選項改為 passport。此調整會讓你的應用程序在在驗證傳入的 API 的請求時使用 Passport 的 TokenGuard 來處理
"guards" => [ "web" => [ "driver" => "session", "provider" => "users", ], "api" => [ "driver" => "passport", "provider" => "users", ], ],至此 Passport 已經安裝完成,剩下的文檔里所講到的前端部分的話,由于我是只需要使用它做 Auth 的認證,并不需要實現完整的 OAuth 功能,所以我們完全可以不使用前端頁面。
使用為了 Api 返回數據方便,我封裝了幾個函數
function respond($status, $respond) { return response()->json(["status" => $status, is_string($respond) ? "message" : "data" => $respond]); } function succeed($respond = "Request success!") { return respond(true, $respond); } function failed($respond = "Request failed!") { return respond(false, $respond); }respond 函數可以做基本返回,succeed 和 failed 是在 respond 函數上做的再次封裝,用以返回請求成功和請求失敗數據。
然后我們需要使用一層代理。
先說一下使用代理的原因,Passport 認證的流程是 從屬應用帶著 主應用
生成的 Client Token 和 用戶輸入的賬號密碼去請求主應用的 Passport Token 路由,以獲得 access token (訪問令牌) 和 refresh token (刷新令牌),然后帶著得到的 access token 就可以訪問 auth:api 下的路由了。但是我們并沒有從屬應用,是由前后端分離的前端來請求這個token,如果從前端想來拉取這個 access token 就需要把 Client token 寫死在前端里,這樣是很不合理的,所以我們可以在內部寫一個代理,由應用自身帶著 Client token 去請求自身以獲取 access token,這樣說可能有一點繞,大概請求過程是下面這個樣子1.前端帶著用戶輸入的賬號密碼請求服務端 2.服務端帶著從前端接收到賬號與密碼,并在其中添加 Client_id 與 Client_token,然后帶著這些參數請求自身的 Passport 認證路由,然后返回認證后的 Access token 與 refresh token下面是代碼實現,我在 AppHttpControllersTraits 下新建了一個 ProxyHelpers 的 Trait,當然,這個函數是我根據我的業務邏輯自己封裝的,如果不適合你的業務邏輯你可以自行調整。
root() . "/api/oauth/token"; $params = array_merge(config("passport.proxy"), [ "username" => request("email"), "password" => request("password"), ]); $respond = $client->request("POST", $url, ["form_params" => $params]); } catch (RequestException $exception) { throw new UnauthorizedException("請求失敗,服務器錯誤"); } if ($respond->getStatusCode() !== 401) { return json_decode($respond->getBody()->getContents(), true); } throw new UnauthorizedException("賬號或密碼錯誤"); } }config/passport.php 內容如下
[ "grant_type" => env("OAUTH_GRANT_TYPE"), "client_id" => env("OAUTH_CLIENT_ID"), "client_secret" => env("OAUTH_CLIENT_SECRET"), "scope" => env("OAUTH_SCOPE", "*"), ], ];env 文件內容如下
OAUTH_GRANT_TYPE=password OAUTH_CLIENT_ID=2 OAUTH_CLIENT_SECRET=2HaTQJF33Sx98HjcKDiSVWZjrhVYGgkHGP8XLG1O OAUTH_SCOPE=*我們需要用到的 client token 是 id 為 2 的 client token,不要搞錯了喲~
然后我們只需要在控制器中 use 這個 Trait,然后調用 $this->authenticate() 就可以得到認證成功的 token,如果請求失敗的話,你可以使用 catch 來捕捉錯誤拋出異常。
public function login(Request $request) { $needs = $this->validate($request, rules("login")); $user = User::where("email", $needs["email"])->first(); if (!$user) { throw new UnauthorizedException("此用戶不存在"); } $tokens = $this->authenticate(); return succeed(["token" => $tokens, "user" => new UserResource($user)]); }得到的 tokens 返回如以下格式
{ "token_type": "Bearer", "expires_in": 31536000, "access_token": "token_str", "refresh_token": "token_str" }做完這一切后你就可以在前端向這樣子請求服務端了
axios.post("yourdomain/login",login_form).then(resource => { })如果請求成功,那么你將會得到 用戶的信息和 access token,refresh token。
然后在你的前端 http 請求 header 里需要加入一個參數 Authorization
axios.defaults.headers.common["Authorization"] = token.token_type + " " + token.access_token然后在你需要使用到 auth 認證的路由里使用中間件 auth:api,一切就大功告成啦~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/26188.html
摘要:默認的時間為周。大概意思就是如果用戶有一個,那么他可以帶著他的過來領取新的,直到周的時間后,他便無法繼續刷新了,需要重新登錄。指定在刷新令牌時要保留的聲明密鑰。為了使令牌無效,您必須啟用黑名單。指定用于對用戶進行身份驗證的提供程序。 showImg(https://segmentfault.com/img/remote/1460000012606251?w=1920&h=1280); ...
showImg(https://segmentfault.com/img/bV6aHV?w=1280&h=800); 社區優秀文章 Laravel 5.5+passport 放棄 dingo 開發 API 實戰,讓 API 開發更省心 - 自造車輪。 API 文檔神器 Swagger 介紹及在 PHP 項目中使用 - API 文檔撰寫方案 推薦 Laravel API 項目必須使用的 8 個...
摘要:使用進行測試注冊接口,注冊成功后返回與用戶名登錄接口詳情接口參考了簡書浪來了的認證應用實戰 安裝larave laravel new passport_demo cd passport_demo && composer install 將 .env 中數據庫配置修改為自己的數據庫配置 DB_DATABASE=homestead DB_USERNAME=homestead DB_P...
摘要:的的認證登錄,默認是通過傳入頭的方式驗證進行認證,認證代碼如下如果不想通過頭傳遞,用傳遞參數的方式,實現方式在的里面將參數的,先接受再賦值到里面即可,也能到達驗證的目的 laravel passport的auth:api的認證登錄,默認是通過傳入header頭的方式驗證accessToken進行認證,認證代碼如下showImg(https://segmentfault.com/img/...
摘要:看到社區常有人問用于密碼驗證方式來獲取的問題,剛好我最近一個項目使用,也是使用的密碼授權來做驗證,對于如何做登錄登出,以及多賬號系統的認證等常用場景做一下簡單的使用小總結。 看到Laravel-China社區常有人問Laravel Passport用于密碼驗證方式來獲取Token的問題,剛好我最近一個API項目使用Laravel Dingo Api+Passport,也是使用Oauth...
閱讀 363·2024-11-06 13:38
閱讀 738·2024-09-10 13:19
閱讀 866·2024-08-22 19:45
閱讀 1363·2021-11-19 09:40
閱讀 2598·2021-11-18 13:14
閱讀 4266·2021-10-09 10:02
閱讀 2283·2021-08-21 14:12
閱讀 1268·2019-08-30 15:54