【问题标题】:Can't include Authorization header with Laravel's unit tests不能在 Laravel 的单元测试中包含授权标头
【发布时间】:2016-02-08 12:20:45
【问题描述】:

在搜索和测试不同方法数小时后,以下似乎是在 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

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

我还以为是什么鬼,也许是因为小写a! 但是后来对我的休息客户端做了同样的事情(它返回一个成功的响应),但它是一样的。

有什么想法吗?塔安克斯

P.S:我也看过这个:Laravel TestCase not sending Authorization headers (JWT Token)

【问题讨论】:

  • 只是为了确保我们都能看到代码,请附上您正在使用的中间件代码并告诉我们您使用的版本(主版本还是开发版本)?
  • 中间件是我的 ACL 实现。我刚刚添加了类似var_dump($request->headers()->all()); exit(); 的代码来查看存在哪些标题。我正在使用 5.2 的主分支

标签: unit-testing laravel-5 phpunit jwt laravel-5.2


【解决方案1】:

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

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

$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 一切正常。

【讨论】:

  • 感谢马尔辛的回答。但我想我误导了你。引发异常的中间件是默认的 jwt.auth 中间件,它在任何地方都可以正常工作,但在测试时。我提到的中间件:我只是添加了一行来查看标题并查看授权是否存在。
  • 另外我刚刚检查了 jwtauth 中间件,它包含你所说的:if (! $token = $this->auth->setRequest($request)->getToken())(duh!)
  • 问题出在这里 => $token = JWTAuth::fromUser($user); 这正是我正在做的事情,如果我以其他方式获得有效令牌,异常就会消失!
【解决方案2】:

您必须检查 Apache 是否对您的 Authorization 标头进行了条带化​​。 因此,将以下代码添加到您的 .htaccess 以解决此问题:

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

另类

当然,您可以将令牌添加为 URL 参数,而不是作为标头发送。

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

【讨论】:

  • 非常感谢您的回复。但我忘了提一下,不幸的是我做了这两件事都无济于事。
【解决方案3】:

这是我解决问题的方法:

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

【讨论】:

    猜你喜欢
    • 2019-06-05
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多