dongshen7407 2018-01-19 15:43 采纳率: 0%
浏览 3017

Laravel jwt身份验证令牌已过期,token_invalid

我对jwt auth令牌到期有个问题。 情况是这样的:我把laravel中的API作为一个项目来编写。 这个API使用另一个laravel项目(客户端)。 但是当我尝试用户登录,一切都很好,但之后我开始意识到TTL(60分钟)(时间生活)通过,然后当我试图让用户资源(需要登录用户)我得到json错误响应{“错误”= >“token_expired”}。 这是我使用jwt的代码的路由部分。 auth中间件:

Route::group(['middleware' => 'jwt.auth'], function () {
    Route::get('account/getUserDetails', 'Api\AccountController@getUserDetails');
});

我很困惑为什么令牌不会自动刷新,我是否需要在某个地方明确指定刷新令牌的方式,难道不是这样的吗?

“refresh_ttl”=比;20160,在jwt.php中。端点看起来是这样的:

public function getUserDetails(Request $request)
{

    try {
        if (! $user = JWTAuth::parseToken()->authenticate()) {

            return response()->json(['user_not_found'], 404);
        }

    } catch (Tymon\JWTAuth\Exceptions\TokenExpiredException $e) {

        $refreshed = JWTAuth::refresh(JWTAuth::getToken());
        $user = JWTAuth::setToken($refreshed)->toUser();
        return $this->response->withArray(['token' => $refreshed]);
    } catch (Tymon\JWTAuth\Exceptions\TokenInvalidException $e) {

        return response()->json(['token_invalid'], $e->getStatusCode());

    } catch (Tymon\JWTAuth\Exceptions\JWTException $e) {

        return response()->json(['token_absent'], $e->getStatusCode());

    }

    return $user;
}
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-08-07 05:04
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    你已经正确地设置了JWT令牌的有效期(TTL)。在你的auth中间件中,你可以看到设置了一个名为refresh_ttl的属性,并将其与JWT的exp字段一起使用。

    当你尝试获取用户的详细信息时,如果JWTAuth::parseToken()无法解析出有效的令牌,则返回一个JSON响应并包含错误消息{"error": "token_expired"}

    如果你在尝试获取用户详情之前成功地获取到了有效的令牌,那么JWTAuth::parseToken()会正常解析出有效的令牌。在这种情况下,JWTAuth::setToken()方法会被调用,它将重新生成一个新的令牌并将其传递给$this->response->withArray()方法。

    然而,当你的应用程序运行超过refresh_ttl的时间限制时,新的令牌将会被重置为旧的令牌,这会导致你遇到错误。

    要解决这个问题,你需要在你的应用中添加一个定时器或者任务来定期检查当前有效令牌的剩余时间,并相应地更新或替换现有令牌。例如,你可以创建一个定时任务,每五分钟执行一次,检查当前有效的令牌的剩余时间,并根据需要更新或替换令牌。

    以下是一个简单的示例:

    // 在config/app.php文件中添加以下配置
    
    'mailgun' => [
        'driver' => env('MAILGUN_DRIVER', 'gun'),
        'domain' => env('MAILGUN_DOMAIN', 'example.com'),
        'key' => env('MAILGUN_KEY', ''),
    ],
    'mailgun_from' => [
        'address' => env('MAILGUN_FROM_ADDRESS', 'no-reply@example.com'),
        'name' => env('MAILGUN_FROM_NAME', 'Mailgun'),
    ],
    
    'token' => env('JWT_SECRET'),
    
    // 在app/Http/Kernel.php文件中添加以下方法
    
    protected function boot()
    {
        parent::boot();
    
        // 定义定时器以检查令牌有效期
        Timer::every(function ($timer) use ($this) {
            $this->checkTokenExpiration();
        }, 5 * 60)->runInCurrentLoop();
    }
    
    private function checkTokenExpiration()
    {
        // 获取当前有效的令牌
        $token = JWTAuth::getToken();
    
        // 如果令牌超时,生成新令牌并更新现有令牌
        if (is_null(JWTAuth::parseToken($token))) {
            $newToken = JWTAuth::setToken()->toToken();
            JWTAuth::setToken($newToken);
    
            // 发送通知或更新状态
            // ...
        }
    }
    

    这个解决方案依赖于你正在使用的邮件服务提供商(如Mailgun)提供的功能。你可以查看他们的文档以了解如何使用这些功能。

    评论

报告相同问题?