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])....
除此之外我还尝试了什么:
- 使用
Authorization
代替 HTTP_Authorization
- 将
['HTTP_Authorization' => 'Bearer ' . $token]
放入 ['headers' => _HERE_ ]
令牌也已正确生成,我使用 ->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.
发送
你没有按照我的要求包含你的中间件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 一切正常,您的测试也会失败。
我是这样解决问题的:
- 在我的登录方法中,添加了一行以将 jwtauth 令牌保存到文件中。但只有当
env('APP_DEBUG', false) == true;
- 我没有使用
$token = JWTAuth::fromUser($user);
获取令牌来测试 api,而是从文件中读取了令牌。
- 已将包含令牌的文件添加到
.gitignore
:-)
在数小时内搜索和测试不同的方法后,以下似乎是包含授权 header 的方法,在 Laravel 5.2 中对 jwt-auth 进行单元测试:
$this->post(route('share.upload'), [
'type' => 'video'
], ['HTTP_Authorization' => 'Bearer ' . $token])....
除此之外我还尝试了什么:
- 使用
Authorization
代替HTTP_Authorization
- 将
['HTTP_Authorization' => 'Bearer ' . $token]
放入['headers' => _HERE_ ]
令牌也已正确生成,我使用 ->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.
发送你没有按照我的要求包含你的中间件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 一切正常,您的测试也会失败。
我是这样解决问题的:
- 在我的登录方法中,添加了一行以将 jwtauth 令牌保存到文件中。但只有当
env('APP_DEBUG', false) == true;
- 我没有使用
$token = JWTAuth::fromUser($user);
获取令牌来测试 api,而是从文件中读取了令牌。 - 已将包含令牌的文件添加到
.gitignore
:-)