我创建了自己的身份验证中间件,它接受一个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也被调用,尽管它没有被包含在路径的任何地方。
答案 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');
});
}