Laravel 的单元测试不能包含授权 header

Can't include Authorization header with Laravel's unit tests

在数小时内搜索和测试不同的方法后,以下似乎是包含授权 header 的方法,在 Laravel 5.2 中对 jwt-auth 进行单元测试:

$this->post(route('share.upload'), [
            'type' => 'video'
        ], ['HTTP_Authorization' => 'Bearer ' . $token])....

除此之外我还尝试了什么:

令牌也已正确生成,我使用 ->dump() 获取输出,异常是:

The token could not be parsed from the request

我将 header 转储到一个中间件中(放在 jwt.auth 之前)并且有一个授权元素:authorization

我还以为是什么鬼,可能是小写a的缘故吧!!! 但是后来对我的其余客户端做了同样的事情(returns 一个成功的响应)但它是一样的。

有什么想法吗? Thaaaanks

P.S:我也看到了这个:

您必须检查 Apache 是否剥离了您的授权 header。 因此,将以下代码添加到您的 .htaccess 中以解决此问题:

RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule .* - [e=HTTP_AUTHORIZATION:%1]

备选

当然,您可以将令牌作为 URL 参数添加,而不是作为 header.

发送

http://foo.com/page.php?token=YourJWTToken

你没有按照我的要求包含你的中间件class,所以我只能猜测。

首先你应该在你的测试中做这样的事情:

$user = User::find(1); // sample user
$token = JWTAuth::fromUser($user);

$this->post(route('share.upload'), [
            'type' => 'video'
        ], ['Authorization' => 'Bearer ' . $token]);

并且在你的中间件中,你需要确保你不简单地做:

JWTAuth::parseToken()->authenticate();

但是

JWTAuth::setRequest($request)->parseToken()->authenticate();

如果您不使用 setRequest 方法,如果使用例如 Postman 一切正常,您的测试也会失败。

我是这样解决问题的:

  1. 在我的登录方法中,添加了一行以将 jwtauth 令牌保存到文件中。但只有当env('APP_DEBUG', false) == true;
  2. 我没有使用 $token = JWTAuth::fromUser($user); 获取令牌来测试 api,而是从文件中读取了令牌。
  3. 已将包含令牌的文件添加到 .gitignore:-)