Laravel開發:如何使用Laravel Sanctum為SPA提供API身份驗證?
隨著單頁應用程序(SPA)的流行,我們需要一種可靠的方法來保護我們的API免受未經授權的訪問和攻擊。Laravel Sanctum是Laravel提供的一個輕量級的認證系統,它為SPA提供輕松的身份驗證。本文將向您展示如何使用Laravel Sanctum為SPA提供API身份驗證。
使用Laravel Sanctum
Laravel Sanctum是Laravel 7.x版本中的一個官方包,用于API身份驗證。Laravel Sanctum使用該API的Token來識別用戶身份,并且可以通過使用token輕松執行多個身份驗證的構建。
安裝Laravel Sanctum
首先,需確保已安裝Laravel框架。
要安裝laravel sanctum,可以使用以下命令
composer require laravel/sanctum
登錄后復制
將ServiceProvider添加到config/app.php文件的providers列表中。
'providers' => [
// ...
LaravelSanctumSanctumServiceProvider::class,
],
登錄后復制
現在,可以運行以下命令發布必要的數據庫遷移和Sanctum配置。
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
登錄后復制
執行以下命令以運行遷移:
php artisan migrate
登錄后復制
使用Sanctum進行默認身份驗證
Sanctum包含API和單頁應用程序身份驗證的默認實現。可以通過為用戶模型使用SanctumTraitsHasApiTokens trait來啟用默認身份驗證。
將HasApiTokens trait添加到用戶模型
<?php
namespace AppModels;
use IlluminateFoundationAuthUser as Authenticatable;
use IlluminateNotificationsNotifiable;
use LaravelSanctumHasApiTokens;
class User extends Authenticatable
{
use Notifiable, HasApiTokens;
// ...
}
登錄后復制
為了更好的解釋,我們將使用一個簡單的SPA示例。假設示例的URL為http://spa.test和通過http://api.spa.test公開的API。
在Laravel中配置CORS
將下面的代碼添加到app/Providers/AppServiceProvider.php文件中來允許跨域資源共享(CORS)。
...
use IlluminateSupportFacadesSchema;
use IlluminateSupportFacadesURL;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Schema::defaultStringLength(191);
if (config('app.env') === 'production') {
URL::forceScheme('https');
}
$headers = [
'Access-Control-Allow-Origin' => '*',
'Access-Control-Allow-Methods' => 'POST, GET, OPTIONS, PUT, DELETE',
'Access-Control-Allow-Headers' => 'Origin, Content-Type, Accept, Authorization, X-Request-With',
'Access-Control-Allow-Credentials' => 'true',
];
$this->app['router']->middleware('api')->get('/sanctum/csrf-cookie', function () {
return response()->json(['status' => 'success']);
});
foreach ($headers as $key => $value) {
config(['cors.supportsCredentials' => true]);
config(['cors.paths.api/*' => [
'allowedOrigins' => ['http://spa.test'],
'allowedHeaders' => [$key],
'allowedMethods' => ['*'],
'exposedHeaders' => [],
'maxAge' => 86400,
]]);
}
}
}
登錄后復制
將上述代碼中的http://spa.test替換為您的SPA的URL。
令牌驗證和API保護說明
在控制器中,我們可以使用Sanctum的auth中間件來保護路由
public function index(Request $request)
{
$user = $request->user();
// ...
}
public function store(Request $request)
{
$user = $request->user();
// ...
}
public function destroy(Request $request, string $id)
{
$user = $request->user();
// ...
}
public function update(Request $request, string $id)
{
$user = $request->user();
// ...
}
登錄后復制
這會從請求標頭中獲取Sanctum授權令牌,并使用該令牌驗證用戶。如果未在標頭中提供授權令牌,則將返回401未經授權的錯誤。
發出授權令牌請求
在我們的SPA中,我們可以使用axios庫來使用API并獲取令牌。要獲取授權令牌,我們需要首先獲取CSRF令牌,所以我們需要發送一個GET請求來獲取它。
axios.get('http://api.spa.test/sanctum/csrf-cookie').then(response => {
axios.post('http://api.spa.test/login', {
username: this.username,
password: this.password
}).then(response => {
axios.defaults.headers.common['Authorization'] = `Bearer ${response.data.token}`;
this.$router.push({ name: 'home' });
});
});
登錄后復制
上面的代碼將在http://api.spa.test中發出POST請求,在服務器上創建一個新的Sanctum授權令牌,并將令牌作為response.data.token進行響應。此后,我們可以將令牌添加到axios的通用頭文件中,以在SPA中使用所有后續請求。
注意,此示例假設有一個名為“login”的路由。
Sanctum還為我們提供了一個logout路由來撤銷授權令牌。
axios.post('http://api.spa.test/logout').then(response => {
delete axios.defaults.headers.common['Authorization'];
this.$router.push({ name: 'login' });
});
登錄后復制
結論
Laravel Sanctum是一個輕量級的簡單實用的身份驗證系統,它易于集成和使用,并提供默認的身份驗證功能,是SPA身份驗證的絕佳解決方案。一旦您與Sanctum一起使用,您將不再需要編寫自己的身份驗證系統。它能夠讓我們為我們的API快速實現安全的身份驗證,并讓我們的SPA與API在很短的時間內交互。
以上就是Laravel開發:如何使用Laravel Sanctum為SPA提供API身份驗證?的詳細內容,更多請關注www.xfxf.net其它相關文章!






