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組件安裝一樣抓艳,按照文檔一步一步來即可
-
執(zhí)行
composer require laravel/passport
-
將 Passport 的服務(wù)提供者注冊到配置文件 config/app.php 的 providers 數(shù)組中:
Laravel\Passport\PassportServiceProvider::class,
-
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
-
接下來对供,你需要運行 passport:install 命令來創(chuàng)建生成安全訪問令牌時用到的加密密鑰位他,同時氛濒,這條 命令也會創(chuàng)建「私人訪問」客戶端和「密碼授權(quán)」客戶端:
執(zhí)行:
php artisan passport:install
-
上面命令執(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(); } }
-
接下來醒串,需要在 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)載請**注明出處**慎框,否則后果自負!