当前位置:首页 > 问答 > 正文

JWT刷新 Laravel前后端分离:laravel中jwt无感刷新,ajax token自动续签方法

JWT刷新 Laravel前后端分离:laravel中jwt无感刷新,ajax token自动续签方法

🚀 Laravel JWT无感刷新 + Ajax自动续签攻略(2025最新版)

🔑 后端配置:Laravel JWT无感刷新

1️⃣ 中间件魔法:自动捕获Token过期

<?php
namespace App\Http\Middleware;
use Tymon\JWTAuth\Exceptions\TokenExpiredException;
class RefreshToken extends \Tymon\JWTAuth\Http\Middleware\BaseMiddleware
{
    public function handle($request, Closure $next)
    {
        try {
            return parent::handle($request, $next);
        } catch (TokenExpiredException $e) {
            $token = $this->auth->refresh(); // 🔄 刷新Token
            return $this->setAuthenticationHeader($next($request), $token);
        }
    }
}

2️⃣ 路由保护:给API加把锁 🔒

// routes/api.php
Route::group(['middleware' => ['token.refresh', 'auth:api']], function () {
    Route::get('/user', 'UserController@info');
});

3️⃣ .env配置:时间参数调优 ⏰

JWT_TTL=120                # Token有效期2小时
JWT_REFRESH_TTL=20160       # 刷新期2周(120*24*7)
JWT_BLACKLIST_ENABLED=true # 启用黑名单
JWT_BLACKLIST_GRACE_PERIOD=600 # 宽限时间10分钟

🧙♂️ 前端实现:Ajax自动续签

1️⃣ Axios拦截器:401自动续命 🕶️

axios.interceptors.response.use(
    response => response,
    async error => {
        if (error.response.status === 401) {
            try {
                const { data } = await axios.post('/api/refresh');
                localStorage.setItem('token', data.token); // 💾 存储新Token
                error.config.headers.Authorization = `Bearer ${data.token}`;
                return axios(error.config); // 🔁 重试原请求
            } catch (refreshError) {
                window.location.href = '/login'; // 🚪 刷新失败跳转
            }
        }
        return Promise.reject(error);
    }
);

2️⃣ 并发请求处理:避免重复刷新 🔄

let isRefreshing = false;
axios.interceptors.response.use(..., async (error) => {
    if (error.response.status === 401 && !isRefreshing) {
        isRefreshing = true;
        // 🔒 上锁,其他请求等待
        const { data } = await axios.post('/api/refresh');
        // 📢 通知所有等待的请求更新Token
        ...
        isRefreshing = false;
    }
});

🛡️ 安全优化与2025新特性

1️⃣ Token存储:HTTP-Only Cookie 🍪

// 后端设置Cookie
return response()->json(['token' => $token])
    ->cookie('jwt_token', $token, 43200, null, null, true, true);

2️⃣ 刷新接口防刷:Redis计数器 📈

// 每次刷新检查Redis
if (Redis::incr('refresh_count:' . $userId) > 5) {
    abort(429, '刷新太频繁啦!');
}

3️⃣ 2025年Laravel新特性 🆕

  • 自动包更新:使用ServBay工具一键升级tymon/jwt-auth
  • Pest测试
    test('token自动续签', function () {
        $user = User::factory()->create();
        $response = $this->actingAs($user)->get('/api/user');
        $response->assertJson(['token' => $newToken]);
    });
  • 🚀 无感刷新:用户写表单时,Token在后台偷偷“续命”,提交时丝滑如初!
  • 🔒 安全加固:给Token加上“时间锁”,过期自动换新,比变魔术还神奇!
  • 🧙♂️ 中间件魔法:后端中间件像守门员,自动处理过期Token,前端完全无感知!

💡 提示:2025年记得定期用composer update更新包,安全补丁比游戏更新还重要哦!

JWT刷新 Laravel前后端分离:laravel中jwt无感刷新,ajax token自动续签方法

发表评论