2017-02-21 26 views
0

我创建了自己的身份验证中间件,该身份验证中间件接受用于查询api_tokens表的查找标头,以查找匹配的标记并检查到期日期。身份验证在RESTful测试中失败

当手动测试但是自动化测试正在做一些奇怪的事情时,这样工作正常。我的测试基本上是这样的:

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不应该被搜索的用户表中的api_token。这不是我的代码的结果,所以我迷路了。

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

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

这绝对是被调用,因为我可以输出在测试过程中瓦尔在这里。但它似乎也被称为标准身份验证,尽管它不包含在路由的任何地方。

+0

你试过'AUTH() - >登录($用户)'全局函数? –

+0

我现在有但没有变化。谢谢您的好意。 – Dubby

回答

0

routes/api.php取代auth:api

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

用你自己的中间件。

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

+0

谢谢。我忘了在最初的问题中显示我的路由代码。我已经完成了编辑。我的中间件正在被调用,但也是默认的Laravel,尽管被注释掉了。 – Dubby

+0

好吧,我已经证明,默认的Laravel'auth' midddleware是通过在''routeMiddleware''中的''auth'=> \ Illuminate \ Auth \ Middleware \ Authenticate :: class' app/Http/Kernel',它会导致一个新的500错误,因为它不能被实例化。我可以通过在测试文件中添加'使用WithoutMiddleware'来防止这种情况,但这也会阻止我的中间件运行。有没有办法控制哪些不运行? – Dubby

+0

如果可能,请添加您的中间件代码。 – EddyTheDove

0

,如果你想禁用的API文档编辑应用程序/供应商/ RouteServiceProvider.php文件默认laravel API中间件和mapApiRoutes功能是这样的:

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