当前位置: 首页 > 知识库问答 >
问题:

Laravel Tymon\JWT Auth:验证前检查未完成的有效令牌?

柴良哲
2023-03-14

我正在尝试使用Tymon的JWTAuth在Laravel5.5中实现基于令牌的身份验证。我遵循了该库的GitHub文档,并使用以下身份验证流。以下是我的登录路径的身份验证部分:

try {

    // attempt to verify the credentials and create a token for the user
    if (!$token = JWTAuth::attempt($credentials)) {
        return response()->json(['success' => false, 'error' => 'Invalid Credentials. Please make sure you entered the right information and you have verified your email address.'], 401);
    }

} 

catch (JWTException $e) {
    // something went wrong whilst attempting to encode the token
    return response()->json(['success' => false, 'error' => 'could_not_create_token'], 500);
}

// all good so return the token
return response()->json(['success' => true, 'data'=> [ 'token' => $token ]]);

以下是路线:

Route::group([

    'middleware' => ['jwt.auth', 'jwt.refresh'],

    ], 

    function () {

        // Routes requiring authentication
        Route::get('/logout', 'Auth\LoginController@logout');
        Route::get('/protected', function() {
            return 'This is a protected page. You must be logged in to see it.';
    });

});

您可以看到我正在使用jwt.auth和jwt.refresh中间件。现在,一切似乎都按预期运行,我可以用令牌验证用户。每个令牌都有一个使用寿命,在每个请求(刷新流)之后,我会获得另一个有效令牌。

但是,我的问题是,如果我有一个尚未使用的用户的有效令牌,然后我将其从标头中删除,并使用有效凭据点击/login路由,我将获得另一个有效令牌。因此,现在我有两个有效的令牌可以用来验证用户,因为我的/login路由不会使以前发布的令牌失效。

是否有人知道一种检查用户是否有未完成的有效令牌的方法,以便在用户从其他地方登录时使其失效?

共有1个答案

韦宣
2023-03-14

我将在做一些研究后回答我自己的问题。根据我的理解,JWT令牌是有效的,除非明确列入黑名单。只要服务器认识到它自己创建了令牌,那么它就可以使用密钥破译令牌,并假设它是有效的。这就是为什么代币寿命如此重要。因此,如果您想使已发行的令牌无效,您要么必须等待到期,要么将其列入黑名单。

 类似资料:
  • 在测试中,我使用的是mockobject: 我试图验证其方法的使用: 但它抛出以下异常: 组织。莫基托。例外情况。滥用。UnfinishedVerificationException:此处缺少验证(模拟)的方法调用: 这一行的例外点是: setMaxRows接受一个int。 当我注释掉这一行时,测试成功了。调试程序时,我可以看到正在设置的setMaxRows方法: BrandLabels是一个Li

  • 我使用Knock gem(https://github.com/nsarno/Knock)在我的Rails5应用程序中进行基于JWT的身份验证。生成的身份验证令牌在一天后自动过期。有什么方法可以防止令牌自动过期或延长过期? 谢谢

  • 在完成TLS握手之前,我需要使用Go作为客户端对服务器证书进行OCSP吊销检查,即[启动握手->获取服务器证书->检查吊销状态->如果被吊销则中止],而不是[启动握手->完成握手->检查吊销状态]

  • 我在两篇关于堆栈溢出的文章中读到过关于这个问题的文章,但它们没有详细说明。我相信这与在嘲笑中嵌套嘲笑有关(根据我读到的)。然而,我并没有看到或完全理解人们张贴的小片段。 我的测试类如下所示(省略了不必要的代码): 我需要调用的方法:

  • 除了我不想使用Laravel的用户身份验证系统(相反,我使用自己的)之外,我正在构建一个Restful api。 所以我被困在这里: 这给了我以下错误: 类型错误:传递给Illumb\Auth\EloquentUserProvider::validateCredentials()的参数1必须是Illumb\Contracts\Auth\Authenticatable的实例,App\User给定的实

  • 在Effective Java(第二版)的第2项中,作者提到了以下关于在使用构建器时对参数施加不变量的内容: 在将参数从构建器复制到对象后,必须检查它们,并在对象字段而不是构建器字段上检查它们(项目 39)。如果违反任何不变量,则生成方法应引发非法状态异常(项 60)。 这是否意味着构建方法创建目标对象后,应该将其传递给验证例程以进行任何所需的验证? 另外,有人能解释一下这背后的原因吗?