隨著restful api的普及和應(yīng)用的廣泛使用,越來越多的應(yīng)用程序需要對api進行身份驗證和授權(quán),因此api安全性已成為當(dāng)今軟件開發(fā)中極其重要的一個方面。laravel sanctum是laravel 7.0引入的開箱即用的輕量級身份驗證系統(tǒng),它旨在讓api身份驗證變得簡單而安全。在本篇文章中,我們將介紹如何在laravel中使用sanctum來保證api的安全性。
- 安裝Laravel Sanctum
在開始之前,我們需要確認已經(jīng)安裝好Laravel 7.0+版本。然后我們可以使用composer安裝Laravel Sanctum依賴:
composer require laravel/sanctum
安裝完Sanctum之后,在config/app.php文件中加入以下代碼:
'providers' => [ // ... LaravelSanctumSanctumServiceProvider::class, ], 'aliases' => [ //... 'Sanctum' => LaravelSanctumSanctum::class, ]
這樣,Laravel應(yīng)用程序就已經(jīng)使用了Sanctum提供的服務(wù)和功能。
- 配置數(shù)據(jù)庫
接下來,在執(zhí)行數(shù)據(jù)庫遷移之前,我們需要設(shè)置Sanctum的數(shù)據(jù)庫表。 Larave lSanctum默認提供了一個包含以下字段的personal_access_tokens數(shù)據(jù)庫表:
- id:令牌的唯一標(biāo)識符
- tokenable_type:與令牌關(guān)聯(lián)的模型的類名
- tokenable_id:與令牌關(guān)聯(lián)的模型的ID
- name:令牌的名稱
- token:API令牌的值
- abilities:令牌的授權(quán)
在創(chuàng)建personal_access_tokens表之前,我們需要先創(chuàng)建模型關(guān)系??梢酝ㄟ^在AuthServiceProvider中注冊以下內(nèi)容來完成:
use LaravelSanctumSanctum; //... public function boot() { $this->registerPolicies(); Sanctum::ignoreMigrations(); Sanctum::actingAs( null, [ 'superuser' ]); }
Sanctum::ignoreMigrations()用于阻止Laravel在artisan migrate命令中執(zhí)行Sanctum的數(shù)據(jù)庫遷移文件。但是,在大多數(shù)情況下,我們只是將其添加到數(shù)據(jù)庫遷移文件的命令中。Sanctum::actingAs()還提供了一種僅用于開發(fā)的方法,該方法在沒有用戶身份驗證的情況下模擬用戶身份。
然后,我們需要運行以下命令來創(chuàng)建personal_access_tokens表:
php artisan migrate
- 創(chuàng)建API令牌
Laravel Sanctum為我們提供了兩種方式來為API生成令牌。一種是CreateToken方法,該方法可以創(chuàng)建一個或多個包含可選名稱和授予權(quán)限的API令牌。這里我們介紹第二種方法,即使用hasApiTokens()函數(shù)配合createToken()函數(shù):
// use the HasApiTokens trait within your User Model use LaravelSanctumHasApiTokens; class User extends Authenticatable { use HasApiTokens, Notifiable; // ... } // create a Token with User ID and given Abilities $personalAccessToken = $user->createToken('API Token', ['server:get','server:post']);
這里我們在用戶模型中使用了HasApiTokensTrait,以便在用戶模型中實現(xiàn)API令牌功能。我們使用createToken方法來創(chuàng)建一個API令牌,并在創(chuàng)建令牌時指定了一個可選的名稱和授權(quán)的權(quán)限鍵。
- 保護API路由
有了API密鑰,我們就可以將其注入到每個請求中以進行身份驗證。我們可以在Laravel的路由文件中使用sanctum中間件來保護API路由,以便驗證請求中的令牌:
// A Group of API routes that require a valid Token Route::group(['middleware' => 'auth:sanctum'], function () { Route::get('/user', function (Request $request) { return $request->user(); }); });
在這段代碼中,我們定義了一個包含驗證sanctum中間件的路由組。 路由組中包含一條路由,該路由僅需要一個有效的Token才能訪問。
- 使用Bearer令牌
使用Bearer令牌是通過HTTP Authorization頭來發(fā)送API令牌的最常見方法??梢酝ㄟ^在請求頭中加入Authorization: Bearer {{$personalAccessToken->plainTextToken}}來授權(quán)令牌:
curl -H "Authorization: Bearer xxxxx" http://example.com/api/user
- 撤銷API令牌
最后,我們需要了解如何撤銷API令牌。我們可以使用tokens()->delete()函數(shù)來刪除某個用戶的所有API令牌,或使用revoke()函數(shù)來撤銷單個API令牌:
$user->tokens()->delete(); $personalAccessToken->revoke();
結(jié)束語
現(xiàn)在我們已經(jīng)成功地實現(xiàn)了Sanctum身份驗證來保護我們的API。Sanctum和Laravel提供了簡單而強大的API身份驗證,這使得開發(fā)人員可以專注于構(gòu)建強大的API,并將主要的關(guān)注點放在業(yè)務(wù)邏輯上。在使用Sanctum時,強烈建議您仔細閱讀官方文檔,這樣您就可以全面了解API的身份驗證過程,并確保應(yīng)用程序具有最高的安全性。