Я создал собственное промежуточное ПО для аутентификации, которое принимает заголовок авторизации, который используется для запроса 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 не должен искать api_token в таблице пользователей. Это не результат моего кода, поэтому я заблудился.
Изменить 2: Мой routes/api.php
выглядит так:
Route::group([
'prefix' => 'api',
//'middleware' => 'auth:api'
'middleware' => 'ApiTokenAuthentication',
], function () {
Это определенно вызывается, потому что я могу выводить переменные здесь во время тестов. Но похоже, что также вызывается стандартная аутентификация, несмотря на то, что она нигде не включена в маршруты.
В routes/api.php
замещать auth:api
в
Route::middleware('auth:api')
//or
Route::group(['middleware' => 'auth:api'])
С вашим собственным промежуточным программным обеспечением.
При использовании этого laravel по умолчанию auth:api
промежуточное ПО, оно запрашивает users
стол для api_token
,
если вы хотите отключить промежуточное ПО API laravel по умолчанию для приложения редактирования файла API / файла Providers / RouteServiceProvider.php и функции mapApiRoutes, например:
protected function mapApiRoutes()
{
Route::group([
'middleware' => 'YOUR_CUSTOME_MIDDLEWARE',
'namespace' => $this->namespace,
'prefix' => 'api',
], function ($router) {
require base_path('routes/api.php');
});
}