Laravel phpunit Невозможно изменить информацию заголовка - заголовки уже отправлены - PullRequest
0 голосов
/ 08 февраля 2019

Я просмотрел несколько постов об одной и той же проблеме, и, похоже, это не касается моего случая.

Моя идея:

Я использую 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...