2017-02-21 13 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 каким-то образом игнорируют auth, который я пытаюсь использовать. Я не вижу, где.

После поиска в Google я пробовал другие вещи, такие как добавление actingAs($user) и $this->be(), но это не помогло.

Любые предложения?

Edit: Бревно показать MySQL, что этот запрос выполняется:

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

Laravel не следует искать в api_token в таблице пользователей. Это не результат моего кода, поэтому я потерян.

Edit 2: My routes/api.php выглядит следующим образом:

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

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

+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 вызывается, прокомментировав строку' 'auth '=> \ Illuminate \ Auth \ Middleware \ Authenticate :: class,' в массиве '$ routeMiddleware' в' app/Http/Kernel', который вызывает новую ошибку 500, потому что она не может быть создана. Я могу предотвратить это, добавив 'use WithoutMiddleware' в тестовый файл, но это также предотвращает запуск моего промежуточного программного обеспечения. Есть ли способ контроля, который не запускается? – Dubby

+0

Если возможно, добавьте код промежуточного кода. – EddyTheDove

0

, если вы хотите, чтобы отключить по умолчанию промежуточного программного Laravel апи для апи отредактировать файл приложения/Поставщики/файла 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'); 
    }); 
}