【发布时间】:2015-09-27 08:00:08
【问题描述】:
总结
我们正在编写单元测试来测试 JWT 令牌的创建和失效,并且每次我们尝试 JWTAuth::invalidate 令牌时都会从 JWTException 返回“无法从请求中解析令牌”错误。
说明
在我们的控制器内部,为了创建用户令牌,我们传递用户电子邮件地址,然后返回 JWT 令牌。
之后,我们通过使用 invalidateToken 方法使令牌无效并通过发送授权标头来传递令牌来销毁令牌。
public function invalidateToken()
{
try {
JWTAuth::invalidate(JWTAuth::getToken());
return Response::json(['status' => 'success'], 200);
} catch (JWTException $e) {
return Response::json(['status' => 'error', 'message' => $e->getMessage()], 401);
}
}
这可以通过使用 Postman 以及 PHPStorms Restful 客户端完美运行。
当我们尝试为此方法编写测试时,我们会遇到错误响应和“无法从请求中解析令牌”错误消息。
我们的测试如下:
public function testInvalidateToken()
{
$createUserToken = $this->call('POST', '/token/create', ['email' => 'test@test.com']);
$user = $this->parseJson($createUserToken);
$response = $this->call('POST', '/token/invalidate',
[/* params */], [/* cookies */], [/* files */], ['HTTP_Authorization' => 'Bearer '.$user->token]);
// var_dump($user->token);
// die();
$data = $this->parseJson($response);
$this->assertEquals($data->status, 'success');
$this->assertEquals($data->status, '200');
}
我们使用的是 Laravel 5.1(在服务器参数之前有 cookie 作为参数)
PHP 版本 5.6.10
PHPUnit 3.7.28
* 编辑 * 更新到 PHPUnit 4.7.6 仍然无法通过 Authorization 标头发送。
* 解决方案 *
在我的控制器 __construct 方法中,我有这几行代码正在运行并解决了我的问题。
if ((\App::environment() == 'testing') && array_key_exists("HTTP_Authorization", Request::server())) {
JWTAuth::setRequest(\Route::getCurrentRequest());
}
【问题讨论】:
标签: php phpunit laravel-5 testcase