RESTful测试中的身份验证失败

时间:2017-02-21 00:07:39

标签: php laravel authentication testing

我创建了自己的身份验证中间件,它接受一个Authorization标头,用于查询api_tokens表以查找匹配的标记并检查过期。

手动测试时工作正常,但自动化测试做得很奇怪。我的测试基本上是这样的:

public function testGetLocation()
{
    $user = factory(\App\Models\User::class, 'userA')->create();
    $token = factory(\App\Models\ApiToken::class, 'userA-token')-create();
    $location = factory(\App\Models\Location::class, 'userA-location1')->create();

    $this->json('GET', '/api/location/'.$location->id, [], ['Authorization' => 'Bearer '. $token->token])
         ->assertStatus(200);
}

然而,当我运行测试时,我收到500错误,表示列users.api_token不存在。我已从用户表中删除此列,因为它不再需要。如果我把它放回去我没有收到错误,但测试用户无法进行身份验证。很明显,Laravel或phpunit在某种程度上忽略了我试图使用的身份验证。我无法看到。

在搜索Google之后,我尝试了其他人提到的内容,例如添加actingAs($user)$this->be(),但这并没有帮助。

有什么建议吗?

编辑:MySQL日志显示正在执行此查询:

select * from `users` where `api_token` = 'userA-token' limit 1

Laravel不应该在users表中搜索api_token。这不是我的代码的结果,所以我迷路了。

编辑2:我的routes/api.php看起来像这样:

Route::group([
    'prefix' => 'api',
    //'middleware' => 'auth:api'
    'middleware' => 'ApiTokenAuthentication',
], function () {

这肯定是被调用的,因为我可以在测试期间输出变量。但似乎标准的auth也被调用,尽管它没有被包含在路径的任何地方。

2 个答案:

答案 0 :(得分:0)

routes/api.php中替换

中的auth:api
Route::middleware('auth:api')
//or 
Route::group(['middleware' => 'auth:api'])

使用您自己的中间件。

使用此laravel默认auth:api中间件时,它会在users表中查询api_token

答案 1 :(得分:0)

如果您想为api文件编辑app / Providers / RouteServiceProvider.php文件和mapApiRoutes函数禁用默认laravel api中间件,请执行以下操作:

protected function mapApiRoutes()
{
    Route::group([
        'middleware' => 'YOUR_CUSTOME_MIDDLEWARE',
        'namespace' => $this->namespace,
        'prefix' => 'api',
    ], function ($router) {
        require base_path('routes/api.php');
    });
}