在Laravel API中实现JWT认证 - StackPuz博客
作者:API传播员 · 2025-11-19 · 阅读时间:6分钟
JWT(JSON Web令牌)是一种高效且广泛应用的身份验证方式,主要用于保护API端点,确保只有经过身份验证的用户才能访问。与传统的基于会话的身份验证不同,JWT是无状态的,不需要服务器端会话存储,因此非常适合构建可扩展和高效的应用程序。在本指南中,我们将详细介绍如何在Laravel API中实现JWT身份验证,从生成用户登录令牌到验证这些令牌以保护API端点,全面提升应用程序的数据和资源安全性。
先决条件
在开始之前,请确保您已安装以下工具:
- PHP >= 8.0
- Composer
- Laravel 11.0.3
此外,您需要具备基本的Laravel框架使用经验。
设置项目
-
创建一个新的Laravel项目:
composer create-project laravel/laravel laravel_api 11.0.3 cd laravel_api -
安装必要的依赖包:
composer require laravel/ui "^4.0" composer require tymon/jwt-auth
项目结构
以下是项目的基本目录结构:
├─ .env
├─ app
│ ├─ Http
│ │ ├─ 控制器
│ │ │ └─ Auth
│ │ │ └─ LoginController.php
│ │ └─ 中间件
│ │ └─ Authenticate.php
│ └─ 模型
│ └─ User.php
├─ 配置
│ └─ auth.php
├─ 数据库
│ └─ database.sqlite
├─ 资源
│ └─ 视图
│ ├─ index.html
│ └─ login.html
└─ 路由
├─ api.php
└─ web.php
配置项目文件
配置 .env 文件
更新 .env 文件以支持JWT身份验证:
SESSION_DRIVER=file
CACHE_STORE=file
DB_CONNECTION=sqlite
JWT_SECRET=b0WciedNJvFCqFRbB2A1QhZoCDnutaoen5g1FEDO0HsLTUGINP4GXh2OXVpTqQL
配置 api.php
定义API路由:
'auth'], function () {
Route::get('/user', [LoginController::class, 'getUser']);
});
配置 web.php
定义Web路由:
<?php
Route::get('/', function () {
return view('index');
});Route::get('/login', function () {
return view('login');
});
自定义中间件 Authenticate.php
修改默认的身份验证中间件以返回401错误:
<?php
namespace AppHttpMiddleware;use IlluminateAuthMiddlewareAuthenticate as Middleware;class Authenticate extends Middleware
{
protected function redirectTo($request)
{
abort(401);
}
}
配置 auth.php
设置JWT为默认的身份验证驱动:
[
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'web' => [
'driver' => 'session',
'provider' => 'users',
],
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => AppModelsUser::class,
],
],
];
配置 User.php
修改用户模型以支持JWT:
getKey();
} public function getJWTCustomClaims()
{
return [];
}
}
配置 LoginController.php
实现用户登录和获取用户信息:
json(['name' => Auth::user()->name]);
} public function credentials()
{
return [
'name' => request()->name,
'password' => request()->password,
];
}
}
前端视图文件
index.html
主页显示用户登录状态: