【问题标题】:tymondesigns/jwt-auth: how create an expired token?tymondesigns/jwt-auth:如何创建过期令牌?
【发布时间】:2020-03-20 00:13:00
【问题描述】:

我使用的是https://github.com/tymondesigns/jwt-auth的V1

我需要创建一个过期的令牌来测试我的代码中的TokenExpiredException

public function handle($request, Closure $next)
    {
        try {
            JWTAuth::parseToken()->authenticate();
        } catch (Exception $e) {
            if ($e instanceof TokenInvalidException) {
                return response()->json(['status' => 'Token is Invalid'], 401);
            } elseif ($e instanceof TokenExpiredException) {
                return response()->json(['status' => 'Token is Expired'], 401);
            } else {
                return response()->json(['status' => 'Authorization Token not found'], 401);
            }
        }
        return $next($request);
    }

我做不到:

public function setUp(): void
    {
        parent::setUp();
        $password = '123456';
        $user = new User([
            'email' => 'info@example.com',
            'password' => Hash::make($password),
        ]);
        $user->save();
    }

public function testExpiredToken()
{
    $user = User::first();
    $token = JWTAuth::fromUser($user, ['exp'=> 123456]);

   $response = $this->withHeaders([
            'Authorization' => 'Bearer '.$token,
        ])->get(Route('test_data_read_closed'));
        $response->assertStatus(401);
}

但我从测试中得到 200(令牌接受,我从我的路线得到答案)而不是 401。

如何创建过期令牌?谢谢

【问题讨论】:

    标签: php laravel jwt-auth


    【解决方案1】:

    我花了几个小时试图弄清楚为什么在发送过期的 JWT 时它仍然响应 200 成功代码(用于测试目的)。事实证明,JWT 包缓存了 \Tymon\JWTAuth\Factory 实例中的声明。要修复它,您只需在生成 JWT 之后并将其发送到控制器之前清除声明:

    \Tymon\JWTAuth\Facades\JWTAuth::getPayloadFactory()->emptyClaims();
    

    否则,它会认为这是同一个请求,并会重新使用已构建的 \Tymon\JWTAuth\Claims\Claim 实例来解码另一个 JWT。我将看到有关在 GitHub 上创建问题的信息。

    【讨论】:

      猜你喜欢
      • 2015-06-28
      • 2019-08-08
      • 2018-03-30
      • 2017-06-13
      • 2020-04-20
      • 2016-08-16
      • 2021-12-31
      • 2017-03-04
      • 2019-07-04
      相关资源
      最近更新 更多