laravel搭建passport

安裝#

安裝 Passport#

1.在你的 Shell 中執(zhí)行以下命令

composerrequirelaravel/passport

如果你使用的 Laravel 版本是 5.5 以下,你需要手動(dòng)在config/app.php文件 providers 數(shù)組中加入如下代碼

Laravel\Passport\PassportServiceProvider::class,

2.運(yùn)行遷移文件

在你的 Shell 中執(zhí)行如下命令

php artisan migrate

Passport 服務(wù)提供器使用框架注冊(cè)自己的遷移目錄窍荧,因此在注冊(cè)服務(wù)后,你可以直接運(yùn)行php artisan migrate來為 Passport 生成所需的數(shù)據(jù)表

3.生成加密密鑰

在你的 Shell 中執(zhí)行如下命令

php artisan passport:install

此命令會(huì)創(chuàng)建生成安全訪問令牌時(shí)所需的加密密鑰,同時(shí)牌柄,這條命令也會(huì)創(chuàng)建用于生成訪問令牌的「?jìng)€(gè)人訪問」客戶端和「密碼授權(quán)」魄鸦。

4.添加 Trait

將 Laravel\Passport\HasApiTokens Trait 添加到 App\User 模型中


5.注冊(cè)路由

在 AuthServiceProvider 的 boot 方法中調(diào)用 Passport::routes 函數(shù)趴生。

classAuthServiceProviderextendsServiceProvider{publicfunctionboot(){$this->registerPolicies();Passport::routes();}}

如果你的程序是需要前后端分離形式的OAuth認(rèn)證而不是多平臺(tái)認(rèn)證那么你可以在routers()方法中傳遞一個(gè)匿名函數(shù)來自定定義自己需要注冊(cè)的路由,我這里是前后端分離的認(rèn)證形式氢架,因此我只需要對(duì)我的前端一個(gè)Client提供Auth的認(rèn)證,所以我只注冊(cè)了獲取Token的路由朋魔,同時(shí)我還為它自定義了前綴名岖研。

Passport::routes(function(RouteRegistrar$router){$router->forAccessTokens();},['prefix'=>'api/oauth']);

6.更改看守器驅(qū)動(dòng)

將配置文件 config/auth.php 中授權(quán)看守器 guards 的 api 的 driver 選項(xiàng)改為 passport。此調(diào)整會(huì)讓你的應(yīng)用程序在在驗(yàn)證傳入的 API 的請(qǐng)求時(shí)使用 Passport 的 TokenGuard 來處理

'guards'=>['web'=>['driver'=>'session','provider'=>'users',],'api'=>['driver'=>'passport','provider'=>'users',],],

至此 Passport 已經(jīng)安裝完成警检,剩下的文檔里所講到的前端部分的話孙援,由于我是只需要使用它做 Auth 的認(rèn)證,并不需要實(shí)現(xiàn)完整的 OAuth 功能解滓,所以我們完全可以不使用前端頁面赃磨。

使用#

為了 Api 返回?cái)?shù)據(jù)方便,我封裝了幾個(gè)函數(shù)

functionrespond($status,$respond){returnresponse()->json(['status'=>$status,is_string($respond)?'message':'data'=>$respond]);}functionsucceed($respond='Request success!'){returnrespond(true,$respond);}functionfailed($respond='Request failed!'){returnrespond(false,$respond);}

respond 函數(shù)可以做基本返回洼裤,succeed 和 failed 是在 respond 函數(shù)上做的再次封裝邻辉,用以返回請(qǐng)求成功和請(qǐng)求失敗數(shù)據(jù)。

然后我們需要使用一層代理腮鞍。

先說一下使用代理的原因值骇,Passport 認(rèn)證的流程是 從屬應(yīng)用帶著 主應(yīng)用

生成的 Client Token 和 用戶輸入的賬號(hào)密碼去請(qǐng)求主應(yīng)用的 Passport Token 路由,以獲得 access token (訪問令牌) 和 refresh token (刷新令牌)移国,然后帶著得到的 access token 就可以訪問 auth:api 下的路由了吱瘩。但是我們并沒有從屬應(yīng)用,是由前后端分離的前端來請(qǐng)求這個(gè)token迹缀,如果從前端想來拉取這個(gè) access token 就需要把 Client token 寫死在前端里使碾,這樣是很不合理的,所以我們可以在內(nèi)部寫一個(gè)代理祝懂,由應(yīng)用自身帶著 Client token 去請(qǐng)求自身以獲取 access token票摇,這樣說可能有一點(diǎn)繞,大概請(qǐng)求過程是下面這個(gè)樣子

1.前端帶著用戶輸入的賬號(hào)密碼請(qǐng)求服務(wù)端2.服務(wù)端帶著從前端接收到賬號(hào)與密碼砚蓬,并在其中添加 Client_id 與 Client_token矢门,然后帶著這些參數(shù)請(qǐng)求自身的 Passport 認(rèn)證路由,然后返回認(rèn)證后的 Access token 與 refresh token

下面是代碼實(shí)現(xiàn),我在 App\Http\Controllers\Traits 下新建了一個(gè) ProxyHelpers 的 Trait,當(dāng)然祟剔,這個(gè)函數(shù)是我根據(jù)我的業(yè)務(wù)邏輯自己封裝的隔躲,如果不適合你的業(yè)務(wù)邏輯你可以自行調(diào)整。

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){thrownewUnauthorizedException('請(qǐng)求失敗物延,服務(wù)器錯(cuò)誤');}if($respond->getStatusCode()!==401){returnjson_decode($respond->getBody()->getContents(),true);}thrownewUnauthorizedException('賬號(hào)或密碼錯(cuò)誤');}}

config/passport.php內(nèi)容如下

['grant_type'=>env('OAUTH_GRANT_TYPE'),'client_id'=>env('OAUTH_CLIENT_ID'),'client_secret'=>env('OAUTH_CLIENT_SECRET'),'scope'=>env('OAUTH_SCOPE','*'),],];

env 文件內(nèi)容如下

OAUTH_GRANT_TYPE=passwordOAUTH_CLIENT_ID=2OAUTH_CLIENT_SECRET=2HaTQJF33Sx98HjcKDiSVWZjrhVYGgkHGP8XLG1OOAUTH_SCOPE=*

我們需要用到的 client token 是 id 為 2 的 client token宣旱,不要搞錯(cuò)了喲~

然后我們只需要在控制器中 use 這個(gè) Trait,然后調(diào)用$this->authenticate()就可以得到認(rèn)證成功的 token教届,如果請(qǐng)求失敗的話响鹃,你可以使用catch來捕捉錯(cuò)誤拋出異常。

publicfunctionlogin(Request$request){$needs=$this->validate($request,rules('login'));$user=User::where('email',$needs['email'])->first();if(!$user){thrownewUnauthorizedException('此用戶不存在');}$tokens=$this->authenticate();returnsucceed(['token'=>$tokens,'user'=>newUserResource($user)]);}

得到的 tokens 返回如以下格式

{"token_type":"Bearer","expires_in":31536000,"access_token":"token_str","refresh_token":"token_str"}

做完這一切后你就可以在前端向這樣子請(qǐng)求服務(wù)端了

axios.post('yourdomain/login',login_form).then(resource=>{})

如果請(qǐng)求成功案训,那么你將會(huì)得到 用戶的信息和 access token买置,refresh token。

然后在你的前端 http 請(qǐng)求 header 里需要加入一個(gè)參數(shù)Authorization

axios.defaults.headers.common['Authorization']=token.token_type+' '+token.access_token

然后在你需要使用到 auth 認(rèn)證的路由里使用中間件auth:api强霎,一切就大功告成啦~

轉(zhuǎn)自Seaony

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末忿项,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子城舞,更是在濱河造成了極大的恐慌轩触,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件家夺,死亡現(xiàn)場(chǎng)離奇詭異脱柱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)拉馋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門榨为,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人煌茴,你說我怎么就攤上這事随闺。” “怎么了蔓腐?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵矩乐,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我回论,道長(zhǎng)散罕,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任傀蓉,我火速辦了婚禮笨使,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘僚害。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布萨蚕。 她就那樣靜靜地躺著靶草,像睡著了一般。 火紅的嫁衣襯著肌膚如雪岳遥。 梳的紋絲不亂的頭發(fā)上奕翔,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音浩蓉,去河邊找鬼派继。 笑死,一個(gè)胖子當(dāng)著我的面吹牛捻艳,可吹牛的內(nèi)容都是我干的驾窟。 我是一名探鬼主播,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼认轨,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼绅络!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嘁字,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤恩急,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纪蜒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衷恭,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年纯续,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了随珠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡杆烁,死狀恐怖牙丽,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情兔魂,我是刑警寧澤烤芦,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站析校,受9級(jí)特大地震影響构罗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜智玻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一遂唧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吊奢,春花似錦盖彭、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铺呵。三九已至,卻和暖如春隧熙,著一層夾襖步出監(jiān)牢的瞬間片挂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工贞盯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留音念,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓躏敢,卻偏偏與公主長(zhǎng)得像闷愤,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子父丰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容