JSON Web Token(JWT)是一個開放標(biāo)準(zhǔn)(RFC 7519),定義了一種緊湊而自包含的方式,用于在各方之間以JSON對象的形式安全傳遞信息。JWT廣泛應(yīng)用于Web開發(fā)中的身份驗證和信息交換,尤其是在單點登錄(SSO)場景中。
首先,創(chuàng)建一個新的Laravel項目并配置為API開發(fā):
composer create-project laravel/laravel laravel-jwt-api
cd laravel-jwt-api
接下來,更新項目根目錄下的.env文件,填入您的數(shù)據(jù)庫憑據(jù)。
在Laravel中,我們使用 tymon/jwt-auth 包來實現(xiàn)JWT認(rèn)證。通過Composer安裝該包:
composer require tymon/jwt-auth
發(fā)布包的配置文件:
php artisan vendor:publish --provider="TymonJWTAuthProvidersLaravelServiceProvider"
生成JWT密鑰:
php artisan jwt:secret
更新 User 模型以實現(xiàn)JWT接口:
use TymonJWTAuthContractsJWTSubject;
class User extends Authenticatable implements JWTSubject
{
// 獲取JWT標(biāo)識符
public function getJWTIdentifier()
{
return $this->getKey();
} // 獲取自定義的JWT聲明
public function getJWTCustomClaims()
{
return [];
}
}
在 routes/api.php 文件中,定義身份驗證和受保護資源的路由:
use AppHttpControllersAuthController;
Route::group(['prefix' => 'auth'], function () {
Route::post('login', [AuthController::class, 'login']);
Route::middleware(['auth:api'])->group(function () {
Route::get('protected', function () {
return response()->json(['message' => '訪問受保護資源成功']);
});
});
});
創(chuàng)建一個 AuthController 來處理JWT認(rèn)證邏輯:
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesAuth;class AuthController extends Controller
{
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login']]);
} public function login(Request $request)
{
$credentials = $request->only('email', 'password'); if ($token = Auth::guard('api')->attempt($credentials)) {
return $this->respondWithToken($token);
} return response()->json(['error' => 'Unauthorized'], 401);
} protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => Auth::guard('api')->factory()->getTTL() * 60
]);
}
}
使用Postman或cURL工具測試API:
登錄獲取JWT令牌:
POST /api/auth/login
Content-Type: application/json
{
"email": "user@example.com",
"password": "password"
}
訪問受保護路由:
GET /api/protected
Authorization: Bearer {your_jwt_token}
在生產(chǎn)環(huán)境中啟用HTTPS以確保數(shù)據(jù)傳輸?shù)陌踩浴?/p>
使用Laravel的速率限制中間件防止API濫用和暴力攻擊。
使用Laravel的驗證功能防止SQL注入和跨站腳本(XSS)攻擊。
設(shè)置JWT的短期過期時間,并提供令牌刷新功能以提升安全性。
使用.env文件存儲API密鑰、數(shù)據(jù)庫憑據(jù)等敏感信息,避免直接暴露在代碼中。
通過自定義異常處理和全面的日志記錄提高API的安全性和可維護性。
確保Laravel框架和所有依賴項保持最新,以獲得最新的安全補丁。
通過結(jié)合Laravel和JWT,您可以輕松構(gòu)建安全、可擴展的后端API。本文詳細(xì)介紹了從環(huán)境配置到安全最佳實踐的完整流程,幫助開發(fā)者創(chuàng)建高效且安全的API。
請記住,安全是一個持續(xù)的過程。定期審查代碼并關(guān)注最新的安全趨勢,確保您的API始終保持高效和安全。
原文鏈接: https://www.ceiboo.com/blog/developing-a-backend-api-in-laravel-with-jwt-authentication-28