Я просмотрел несколько постов об одной и той же проблеме, и, похоже, это не касается моего случая.
Моя идея:
Я использую JWT для аутентификации пользователей имоя идея состоит в том, чтобы определить, что всякий раз, когда токен почти истекает, я хочу вернуть новый токен в заголовках (Header Authorization).
Я сделал это промежуточное программное обеспечение, просто чтобы проверить некоторые вещи
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)
, он выдает Exception
:
Невозможно изменить информацию заголовка - заголовки уже отправлены (вывод начался с / var / www/project/vendor/phpunit/phpunit/src/Util/Printer.php:109)
Что касается моих исследований (и попыток), то речь идет о выводе запроса на консоль, ноЯ был неудачным до сих пор.
Похожие записи: Как исправить ошибку «Заголовки уже отправлены» в PHP
Небольшие заметки:
this->response
мой собственный пользовательский ответ на запрос, вы можете игнорировать, что
Пробовал @runInSeparateProcess
из другого поста, и ошибка исчезает, но заголовок не установлен (возвращается заголовок по умолчанию)
Редактировать: Я попытался поместить заголовок в верхнюю часть файла, до того, как попытка перехватить, и он остался прежним (мне было интересно, если бы jwt сделал какой-то вывод без моего ведома), и это единственное промежуточное программное обеспечение, используемое в atm