!!?。∞D載請注明作者和本文鏈接!!??!
前言
隨著公司業(yè)務的發(fā)展,需要把各個業(yè)務后臺通用的功能,抽出來做成單獨的項目,并后臺接口,供各個業(yè)務后臺使用,所以要研究一下怎么使用Api認證??戳艘幌沦Y料,Laravel官方給的Passport擴展包,提供了整個OAuth2.0的功能,所以就準備用Passport實現Api認證
介紹Passport的文檔一大堆,從安裝到是有都有非常詳細的步驟,會告訴你每一步執(zhí)行什么命令,去什么文件加什么代碼
比如:
Passport OAuth 認證
Laravel Passport 多表用戶認證踩坑
Laravel Passport API 認證使用小結
但是很少有一步步展開來講每一步是為了解決什么問題,設置為什么那么做,代碼為什么要那么寫。當然,這里并不是說上面兩篇文章不好,文檔和文章寫得挺好的。只是個人覺得從學習的角度去看,很多時候遇到問題,不是說單純的復制粘貼代碼解決項目問題就完事了,更多的是要多問幾個為什么,最后才能靈活掌握和運用這個知識,自己的能力才能得到增長。
廢話不多說了,進入正題,這篇先講一下Passport的安裝和基本使用。(以下需要laravel使用和OAuth2.0的基本知識,小白可以先去學習一下)
1.passport安裝
以安裝4.0為例
composer require laravel/passport:~4.0
如果遇到paragonie/random_compat版本不兼容的問題安裝命令,可以先執(zhí)行以下命令讓paragonie/random_compat版本回退,再用上面的命令安裝passport
composer require paragonie/random_compat:^2.0
2.做passport的數據遷移
passport會使用到一些數據庫表,執(zhí)行這個遷移,就會在數據庫中生成這些表,其中XXXXX為環(huán)境名(現在公司使用一般都是多環(huán)境,如果單一環(huán)境就不用加--env參數了)
php artisan migrate --env=XXXXX
3.創(chuàng)建生成安全訪問令牌(token)所需的加密鍵
php artisan passport:keys
執(zhí)行完這個以后,在項目的storage文件夾下就會生成oauth-private.key和oauth-public.key。請注意,這兩個文件是機器相關的,所以不應該提交到源代碼控制(比如SVN,GIT等)中,應該在第一次部署的時候讓機器生成。
4.注冊路由
Passport::routes()給我們提供了passport使用的路由,我們要先去注冊一下(我用的是laravel5.5,后面的要不要注冊,我就不知道了,大家可以去查一下具體的文檔)
app/Providers/AuthServiceProvider.php
use Carbon\Carbon;
use Laravel\Passport\Passport;
.
.
.
public function boot()
{
$this->registerPolicies();
// Passport的路由,這句是一定要加上
Passport::routes();
//下面是設置token的過期時間,默認是永久,如果要永久就不用寫下面兩行代碼了
//設置 access_token 15天過期
Passport::tokensExpireIn(Carbon::now()->addDays(15));
//設置 refreshTokens 30天過期
Passport::refreshTokensExpireIn(Carbon::now()->addDays(30));
}
.
.
.
5.生成客戶端
(1)命令行生成
如果用的是密碼模式,可以使用下面的命令生成一個密鑰,XXX可以指定名字,你可以根據項目需要起名字
php artisan passport:client --password --name='XXX'
然后命令行會給出clientID和client secret,保存下來
這里需要說明一點:
php artisan passport:keys和php artisan passport:install的區(qū)別
passport:install 用來創(chuàng)建生成安全訪問令牌時所需的加密密鑰,同時,這條命令也會創(chuàng)建用于生成訪問令牌的「個人訪問」客戶端和「密碼授權」客戶端
(詳見 Passport OAuth 認證)
所以,如果前面用了install后面就不需要再執(zhí)行生成客戶端這一步了。如果你只想要密鑰+密碼授權客戶端,你就拆開來做
(2)接口生成
接口:POST /oauth/clients
因為我項目中是機器對機器的認證,就用的client模式
image.png
6.更改Guard和Provider
app/Providers/AuthServiceProvider.php
'api' => [
'driver' => 'passport', //api認證,這里需要改成passport
'provider' => 'users', //這里填的是下面providers里面提供
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => App\User::class, //你可以根據項目需要,改成項目里其他的model,但是這個model必需要extend Authenticatable
],
],
7.給Api加上認證
(1)授權碼模式
Route::post('/a/b','XXController@getResult')->middleware('auth:api');
(2)client模式
先去注冊中間件
app/Http/kernel.php
use Laravel\Passport\Http\Middleware\CheckClientCredentials;
protected $routeMiddleware = [
...
'client' => CheckClientCredentials::class,
];
然后加上驗證
Route::post('/a/b','XXController@getResult')->middleware('client');
8.調試
我們直接在postman中給/a/b發(fā)送請求,不帶token

接下來,我們帶著token給接口發(fā)送請求

可以正常訪問了!
后續(xù)的篇章會繼續(xù)寫如何自定義Passport的配置以及返回等等
?。。?!轉載請注明作者和本文鏈接!?。?!
