我围绕同一问题发表了多篇文章,似乎无法涵盖我的情况。
我的想法:
我正在使用JWT对用户进行身份验证,我的想法是确定只要令牌将近到期,我都希望在标头(标头授权)内返回新令牌。
我已经制作了这个中间件,只是为了测试一些东西
public function handle($request, Closure $next)
{
try {
$user = JWTAuth::parseToken()->authenticate();
$claims = JWTAuth::getPayload(JWTAuth::getToken())->toArray();
if ($claims['exp'] - (strtotime(date("Y-m-d H:i:s"))) <= 900) {
$token = JWTAuth::refresh(JWTAuth::getToken());
header('Authorization: Bearer ' . $token);
}
} catch (Exception $e) {
if ($e instanceof \Tymon\JWTAuth\Exceptions\TokenInvalidException) {
return $this->response([], 'Authorization Token is Invalid', 401);
} elseif ($e instanceof \Tymon\JWTAuth\Exceptions\TokenExpiredException) {
try {
$token = JWTAuth::refresh(JWTAuth::getToken());
header('Authorization: Bearer ' . $token);
return $this->response([], 'Authorization Token is Expired', 401);
} catch (\Tymon\JWTAuth\Exceptions\JWTException $e) {
return $this->response([], 'Authorization Token is Invalid', 401);
}
} else {
return $this->response([], 'Authorization Token not found', 401);
}
}
return $next($request);
}
到目前为止,用POSTMAN进行测试,我得到了令人满意的结果。但是,我继续写下验收测试,以测试确实如此。
public function testUserReceivesNewTokenInHeaderWhenExpiresAtIsWithin15Minutes()
{
//Arrange
$token = JWTAuth::claims(['exp' => strtotime("+1 minutes", strtotime(date('Y-m-d H:i:s')))])->fromUser($this->user);
$this->headers['HTTP_Authorization'] = "Bearer $token";
//Act
$response = $this->get('/api/justAnotherURL', $this->headers);
//Assert
$response->assertStatus(200);
$this->assertTrue($response->headers->has('Authorization'));
}
我将exp
日期设置为下一分钟之内(因此它进入了上面的验证),它确实按预期输入,但是当到达Header(Authorization: Bearer $token)
时,它抛出了一个{{1} }:
无法修改标头信息-已发送的标头(输出从/var/www/project/vendor/phpunit/phpunit/src/Util/Printer.php:109开始)
就我的研究(和尝试)而言,这与在控制台上输出请求有关,但是到目前为止,我一直没有成功。
小笔记:
Exception
是我对请求的自定义回复,您可以忽略
尝试了this->response
的其他帖子,但错误消失了,但是没有设置标题(返回了默认标题)
编辑:我尝试将标头放置在文件顶部,在try catch之前,并且它保持不变(我想知道jwt是否会在我不知道的情况下产生一些输出),并且这是唯一使用的中间件自动取款机