使用tymondesigns/jwt-auth快速实现Laravel API认证
在现代Web开发中,JSON Web Token (JWT)已成为API认证的主流方案之一。本文将详细介绍如何在Laravel应用中快速集成tymondesigns/jwt-auth包来实现基于JWT的认证系统。
准备工作
在开始之前,请确保已经按照官方文档完成了包的安装配置。本文假设你已经在Laravel或Lumen环境中正确安装了该包。
用户模型改造
首先需要对User模型进行改造,使其支持JWT认证:
<?php
namespace App;
use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
class User extends Authenticatable implements JWTSubject
{
use Notifiable;
// 其他代码省略...
/**
* 获取JWT标识符
* 通常是用户主键
*/
public function getJWTIdentifier()
{
return $this->getKey();
}
/**
* 返回自定义的JWT声明
* 可以在这里添加额外的用户信息到token中
*/
public function getJWTCustomClaims()
{
return [];
}
}
getJWTIdentifier()
方法返回用户的唯一标识,通常是数据库主键。getJWTCustomClaims()
方法允许你向token中添加自定义数据,如用户角色等。
配置认证守卫
接下来需要配置Laravel的认证系统使用JWT驱动:
// config/auth.php
'defaults' => [
'guard' => 'api',
'passwords' => 'users',
],
'guards' => [
'api' => [
'driver' => 'jwt',
'provider' => 'users',
],
],
这里我们将默认守卫设置为'api',并使用'jwt'作为驱动。这样配置后,Laravel的认证系统就会在背后使用JWT来处理认证逻辑。
实现认证路由
创建API路由来处理认证相关请求:
// routes/api.php
Route::group([
'middleware' => 'api',
'prefix' => 'auth'
], function ($router) {
Route::post('login', 'AuthController@login');
Route::post('logout', 'AuthController@logout');
Route::post('refresh', 'AuthController@refresh');
Route::post('me', 'AuthController@me');
});
这些路由提供了完整的认证流程:
- login: 用户登录获取token
- logout: 注销当前token
- refresh: 刷新即将过期的token
- me: 获取当前认证用户信息
创建认证控制器
生成AuthController并实现认证逻辑:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
class AuthController extends Controller
{
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login']]);
}
public function login()
{
$credentials = request(['email', 'password']);
if (! $token = auth()->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized'], 401);
}
return $this->respondWithToken($token);
}
public function me()
{
return response()->json(auth()->user());
}
public function logout()
{
auth()->logout();
return response()->json(['message' => 'Successfully logged out']);
}
public function refresh()
{
return $this->respondWithToken(auth()->refresh());
}
protected function respondWithToken($token)
{
return response()->json([
'access_token' => $token,
'token_type' => 'bearer',
'expires_in' => auth()->factory()->getTTL() * 60
]);
}
}
控制器中的关键点:
- 构造函数中设置中间件,只有login方法不需要认证
- login方法验证用户凭证并返回token
- me方法返回当前认证用户信息
- logout方法使当前token失效
- refresh方法刷新token有效期
- respondWithToken方法统一格式化token响应
测试认证流程
完成上述步骤后,你可以向/auth/login
发送POST请求测试登录:
{
"email": "your@email.com",
"password": "yourpassword"
}
成功后将返回类似响应:
{
"access_token": "eyJhbGciOiJIUzI1NiIs...",
"token_type": "bearer",
"expires_in": 3600
}
使用Token访问受保护路由
获取token后,可以通过以下方式在请求中携带token:
-
Authorization头(推荐方式):
Authorization: Bearer your.token.here
-
查询参数:
GET /api/protected?token=your.token.here
-
POST参数:在POST请求体中发送token
-
Cookie:将token存储在cookie中
-
Laravel路由参数:在路由中包含token
最佳实践建议
- 始终使用HTTPS传输token
- 设置合理的token过期时间
- 考虑实现token黑名单机制
- 在
getJWTCustomClaims()
中添加必要的用户信息,减少数据库查询 - 为敏感操作实现二次验证
通过以上步骤,你已经成功在Laravel应用中实现了基于JWT的认证系统。这套方案简洁高效,非常适合现代API开发。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考