Laravel 的 API 認證系統(tǒng) Passport 三部曲(一偿洁、passport安裝+配置)

Laravel 的 API 認證系統(tǒng) Passport 三部曲(一五鲫、passport安裝+配置)

博主最近在搞app開發(fā)屡江,但是用戶的登錄授權(quán)因為不能像web一樣實用session驅(qū)動授權(quán)芭概,這里我們使用Laravel 中的 Passport 實現(xiàn) API 授權(quán)過程。Passport 基于 League OAuth2 server 實現(xiàn)惩嘉。
坑:中文文檔對授權(quán)的介紹不全罢洲,文檔的例子都是基于laravel自帶的user表來進行的設(shè)計開發(fā),但是其用戶表往往滿足不了我們的需求宏怔,需要自己設(shè)計用戶表奏路,如何讓自建的用戶表去完美兼容auth認證,下文給你答案臊诊。
這里我的用戶表為“l(fā)ogin”表,主鍵為char(32)的guid(默認的user表主鍵為自增id)斜脂,用戶名為varchar(64)的username(默認的user表用戶名為email)

安裝

和普通的composer組件安裝一樣抓艳,按照文檔一步一步來即可

  1. 執(zhí)行

    composer require laravel/passport
    
  2. 將 Passport 的服務(wù)提供者注冊到配置文件 config/app.php 的 providers 數(shù)組中:

    Laravel\Passport\PassportServiceProvider::class,
    
  3. Passport 使用服務(wù)提供者注冊內(nèi)部的數(shù)據(jù)庫遷移腳本目錄,所以上一步完成后帚戳,你需要更新你的數(shù)據(jù)庫結(jié)構(gòu)玷或。Passport 的遷移腳本會自動創(chuàng)建應(yīng)用程序需要的客戶端數(shù)據(jù)表和令牌數(shù)據(jù)表:

    地址:/vendor/laravel/passport/database/migrations
    坑:由于用戶表的用戶id為char(32),默認為自增id片任,這里四個表的用戶id(user_id)類型需要進行修改為char(32)(如果設(shè)計到團隊開發(fā)最好是新建修改字段類型的migration來修改用戶id類型)

    $table->char('user_id',32);
    

    執(zhí)行:

    php artisan migrate
    

有些會報錯“ Changing columns for table "oauth_auth_codes" requires Doctrine DBAL; install "doctrine/dbal". ”偏友,需要安裝組件,執(zhí)行如下命令

    composer require doctrine/dbal
  1. 接下來对供,你需要運行 passport:install 命令來創(chuàng)建生成安全訪問令牌時用到的加密密鑰位他,同時氛濒,這條 命令也會創(chuàng)建「私人訪問」客戶端和「密碼授權(quán)」客戶端:

    執(zhí)行:

    php artisan passport:install
    
  2. 上面命令執(zhí)行后,請將 Laravel\Passport\HasApiTokens Trait 添加到 App\Login 模型中鹅髓,這個 Trait 會給你的模型提供一些輔助函數(shù)舞竿,用于檢查已認證用戶的令牌和使用作用域:

    如果裝了ideaHelp組件可以按ctrl追加進去看具體屬性和功能
    由于使用了自建用戶表,這里要將表名窿冯、主鍵類型骗奖、主鍵名、用戶名重寫

    <?php
    
    namespace App\Model;
    
    use Laravel\Passport\HasApiTokens;
    use Illuminate\Notifications\Notifiable;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class Login extends Authenticatable
    {
        use HasApiTokens, Notifiable;
        
        // 表名
         protected $table = 'data_login_info';
    
         // 主鍵
         protected $primaryKey = 'guid';
    
        // 主鍵類型
        protected $keyType = 'string';
        
        /**
         * 說明:自定義授權(quán)用戶名(默認為email)
         *
         * @param $username
         * @return \Illuminate\Database\Eloquent\Model|null|static
         * @author 郭慶
         */
        public function findForPassport($username)
        {
            return CompanyLogin::where('username', $username)->first();
        }
    
    }
    
    
  3. 接下來醒串,需要在 AuthServiceProvider 的 boot 方法中調(diào)用 Passport::routes 执桌、enableImplicitGrant、tokensCan芜赌、tokensExpireIn鼻吮、refreshTokensExpireIn具體作用看注釋。

    public function boot()
    {
        $this->registerPolicies();
            
        // 會注冊一些在訪問令牌较鼓、客戶端椎木、私人訪問令牌的發(fā)放和吊銷過程中會用到的必要路由
        Passport::routes();        
        
        // 簡化授權(quán)
        // Passport::enableImplicitGrant();
        
        // 定義令牌作用域
        Passport::tokensCan([
            'place-orders' => 'Place orders',
            'check-status' => 'Check order status',
        ]);
    
        // accessToken有效期
        Passport::tokensExpireIn(Carbon::now()->addDays(15));
    
        // accessRefushToken有效期
        Passport::refreshTokensExpireIn(Carbon::now()->addDays(30)); 
    }
    

7. 最后,需要將配置文件 config/auth.php 中 api 部分的授權(quán)保護項( driver )改為 passport 博烂。此調(diào)整會讓你的應(yīng)用程序在接收到 API 的授權(quán)請求時使用 Passport 的 TokenGuard 來處理:

    ```
    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'login',
        ],
    
        'api' => [
            'driver' => 'passport',
            'provider' => 'login',
        ],
    ],
    
    'providers' => [
        'login'  => [
            'driver' => 'eloquent',
            'model' => App\Model\Login::class,
        ]
    ],

    ```
    
8. 以上步驟完成之后香椎,passport的安裝就完成了,具體配置的修改根據(jù)自己的新建的用戶表來進行修改配置禽篱。

9. 明后天博主會出具體的令牌發(fā)放修改(二部曲)姨蟋、整體實現(xiàn)api授權(quán)認證登錄api整體流程(三部曲)盡請期待!


> 本文博主**親自**手碼曹抬,手寫不易棵逊,歡迎轉(zhuǎn)載,**打賞**悼吱,轉(zhuǎn)載請**注明出處**慎框,否則后果自負!
    
    

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末后添,一起剝皮案震驚了整個濱河市笨枯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌遇西,老刑警劉巖馅精,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粱檀,居然都是意外死亡洲敢,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門茄蚯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來压彭,“玉大人睦优,你說我怎么就攤上這事∠” “怎么了刨秆?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長忆畅。 經(jīng)常有香客問我衡未,道長,這世上最難降的妖魔是什么家凯? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任缓醋,我火速辦了婚禮,結(jié)果婚禮上绊诲,老公的妹妹穿的比我還像新娘送粱。我一直安慰自己,他們只是感情好掂之,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布抗俄。 她就那樣靜靜地躺著,像睡著了一般世舰。 火紅的嫁衣襯著肌膚如雪动雹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天跟压,我揣著相機與錄音胰蝠,去河邊找鬼。 笑死震蒋,一個胖子當著我的面吹牛茸塞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播查剖,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钾虐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了梗搅?” 一聲冷哼從身側(cè)響起禾唁,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎无切,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丐枉,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡哆键,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘦锹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片籍嘹。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡闪盔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辱士,到底是詐尸還是另有隱情泪掀,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布颂碘,位于F島的核電站异赫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏头岔。R本人自食惡果不足惜塔拳,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望峡竣。 院中可真熱鬧靠抑,春花似錦、人聲如沸适掰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽类浪。三九已至载城,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間戚宦,已是汗流浹背个曙。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留受楼,地道東北人垦搬。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像艳汽,于是被迫代替她去往敵國和親猴贰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

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