我使用的是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分。
如何创建过期令牌?谢谢
发布于 2021-07-21 15:56:13
我花了几个小时试图弄清楚,当发送过期的JWT时(出于测试目的),它为什么仍然响应200成功代码。事实证明,JWT包将声明缓存在\Tymon\JWTAuth\Factory实例中。要修复它,您只需在生成JWT之后并将其发送到控制器之前清除声明:
\Tymon\JWTAuth\Facades\JWTAuth::getPayloadFactory()->emptyClaims();否则,它会认为这是相同的请求,并将重用已构建的\Tymon\JWTAuth\Claims\Claim实例来解码另一个JWT。我会考虑在GitHub上创建一个问题。
https://stackoverflow.com/questions/59019367
复制相似问题