tymondesigns/jwt-auth:如何创建过期令牌?
Posted
技术标签:
【中文标题】tymondesigns/jwt-auth:如何创建过期令牌?【英文标题】:tymondesigns/jwt-auth: how create an expired token? 【发布时间】: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。
如何创建过期令牌?谢谢
【问题讨论】:
【参考方案1】:我花了几个小时试图弄清楚为什么在发送过期的 JWT 时它仍然响应 200 成功代码(用于测试目的)。事实证明,JWT 包缓存了 \Tymon\JWTAuth\Factory
实例中的声明。要修复它,您只需在生成 JWT 之后并将其发送到控制器之前清除声明:
\Tymon\JWTAuth\Facades\JWTAuth::getPayloadFactory()->emptyClaims();
否则,它会认为这是同一个请求,并会重新使用已构建的 \Tymon\JWTAuth\Claims\Claim
实例来解码另一个 JWT。我将看到有关在 GitHub 上创建问题的信息。
【讨论】:
以上是关于tymondesigns/jwt-auth:如何创建过期令牌?的主要内容,如果未能解决你的问题,请参考以下文章