Laravel phpunit无法修改标头信息-标头已发送

时间:2019-02-08 12:21:04

标签: php laravel phpunit

我围绕同一问题发表了多篇文章,似乎无法涵盖我的情况。

我的想法:

我正在使用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开始)

就我的研究(和尝试)而言,这与在控制台上输出请求有关,但是到目前为止,我一直没有成功。

  

相关帖子:How to fix "Headers already sent" error in PHP

小笔记:

Exception是我对请求的自定义回复,您可以忽略

尝试了this->response的其他帖子,但错误消失了,但是没有设置标题(返回了默认标题)

编辑:我尝试将标头放置在文件顶部,在try catch之前,并且它保持不变(我想知道jwt是否会在我不知道的情况下产生一些输出),并且这是唯一使用的中间件自动取款机

0 个答案:

没有答案