Ошибка аутентификации в тесте RESTful

Я создал собственное промежуточное ПО для аутентификации, которое принимает заголовок авторизации, который используется для запроса 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 () {

Это определенно вызывается, потому что я могу выводить переменные здесь во время тестов. Но похоже, что также вызывается стандартная аутентификация, несмотря на то, что она нигде не включена в маршруты.

0

Решение

В routes/api.php замещать auth:api в

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

С вашим собственным промежуточным программным обеспечением.

При использовании этого laravel по умолчанию auth:api промежуточное ПО, оно запрашивает users стол для api_token,

0

Другие решения

если вы хотите отключить промежуточное ПО 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');
});
}
0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector