【发布时间】:2015-03-19 06:17:11
【问题描述】:
我正在尝试使用 Codeception 测试我的 Laravel 4 REST API,但是当我尝试通过我的 Authorization 标头(使用 REST 模块的 $I->amBearerAuthenticated() 函数)发送时,它没有通过最终请求。
据我所见,Symfony2 BrowserKit 模块会修改任何添加到 HTTP_XXX_XXX 格式的标头,因此发送的标头似乎是 HTTP_AUTHORIZATION - 但是,当我在应用程序中输出接收到的标头时,授权和 HTTP_AUTHORIZATION 都不存在.
如果有帮助,这是我的 Codeception 测试:
public function loginAndHitProtectedPage(ApiTester $I)
{
$I->wantTo('login and successfully get to a protected page');
$I->sendPOST('/auth/login', ['username' => 'user1', 'password' => 'pass']);
$I->seeResponseIsJson();
$token = $I->grabDataFromJsonResponse('token');
$I->amBearerAuthenticated($token);
$I->sendGET('/runs');
$I->seeResponseCodeIs(200);
$I->seeResponseIsJson();
$I->dontSeeResponseContains('error');
}
根据 BrowserKit 发送的标头(REST 模块中$this->client->getInternalRequest()->getServer() 的输出):
HTTP_HOST : localhost
HTTP_USER_AGENT : Symfony2 BrowserKit
HTTP_AUTHORIZATION : Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3RcL2F1dGhcL2xvZ2luIiwic3ViIjoxLCJpYXQiOjE0MjE3ODY0NDEsImV4cCI6MTQyMTg3Mjg0MX0.XxxxZMe8gwF9GS8CdKsh5coNQer1c6G6prK05QJEmDQ
HTTP_REFERER : http://localhost/auth/login
HTTPS : false
根据 PHP 接收的标头:
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Language: en-us,en;q=0.5
Content-Type: application/x-www-form-urlencoded
Host: localhost
Referer: http://localhost/auth/login
User-Agent: Symfony2 BrowserKit
令牌已正确接收,但我的 API(正确)在 GET 请求上返回 401,因为它没有收到令牌。
任何帮助将不胜感激!
【问题讨论】:
-
我让 PHPStorm 调试为我的测试工作,我在查明这个问题方面取得了一些进展,尽管我仍然有点卡住。看起来我用于授权的 JWTAuth 模块是问题的一部分 - 因为我在同一个测试中进行了两次 REST 调用,所以 JWTAuth 模块似乎只为第一个初始化,并且作为初始化的一部分请求被存储。然后,当进行第二次调用时,将使用第一个请求的标头,因此 Authorization 标头不存在。如果我对令牌进行硬编码并只进行第二个 GET,它就可以工作。继续...
标签: php laravel authorization codeception bearer-token