You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPOpenSourceSaver JWT刷新令牌过期问题及更新方案咨询

问题解决方案

1. Refresh Token过期的处理逻辑

当Refresh Token过期时,无法通过现有机制刷新令牌——这是JWT认证的安全设计,Refresh Token作为会话的最终凭证,过期意味着用户的长期会话已失效,此时必须让用户重新登录,生成全新的Access Token和Refresh Token。

你需要在中间件中捕获Refresh Token过期的异常,返回明确的重新认证提示:

try {
    JWTAuth::parseToken()->authenticate();
} catch (TokenExpiredException $e) {
    try {
        // 尝试刷新Access Token
        $refreshedToken = auth()->refresh(JWTAuth::getToken());
        JWTAuth::setToken($refreshedToken)->toUser();
        
        $bearerToken = "Bearer {$refreshedToken}";
        $request->headers->set('Authorization', $bearerToken);
    } catch (TokenExpiredException $refreshExpired) {
        // Refresh Token也过期了,返回401让用户重新登录
        return response()->json(['message' => '会话已过期,请重新登录'], 401);
    }
} catch (JWTException $e) {
    // 其他JWT异常处理
    return response()->json(['message' => '令牌无效'], 401);
}

2. 更新Access Token时同步更新Refresh Token

可以实现同步更新。PHPOpenSourceSaver的refresh()方法支持第二个参数$forceRefresh,设置为true时会生成新的Refresh Token,同时返回新的Access Token(参数以当前包版本文档为准)。

修改你的中间件代码,同时处理新Refresh Token的存储:

// 在捕获TokenExpiredException的代码块中
// 传入true强制生成新的Refresh Token
[$newAccessToken, $newRefreshToken] = auth()->refresh(JWTAuth::getToken(), true);

// 更新请求头的Access Token
$bearerToken = "Bearer {$newAccessToken}";
$request->headers->set('Authorization', $bearerToken);

// 将新的Refresh Token存入Cookie(需提前定义JWTValues::REFRESH_TOKEN常量)
$refreshCookie = cookie()->forever(JWTValues::REFRESH_TOKEN, $newRefreshToken);

后续响应中同时携带两个Token的Cookie:

if (!is_null($bearerToken) && !is_null($refreshCookie)) {
    return $next($request)
        ->withCookie(cookie()->forever(JWTValues::ACCESS_TOKEN, $bearerToken))
        ->withCookie($refreshCookie);
}

注意:

  • 要确保Refresh Token的存储、读取逻辑一致,比如后续刷新操作需从Cookie中获取Refresh Token
  • 合理设置Refresh Token有效期,平衡用户体验与安全性

内容的提问来源于stack exchange,提问作者Juan Pablo B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 19:52:47