Вот как вы можете реализовать это, чтобы она действительно работала.
Прежде всего, вы должны правильно реализовать db: seed и Паспорт установки .
Второй, вам не нужно, чтобы создать свой собственный маршрут, чтобы проверить, работает ли он (базовые Паспорт ответы достаточно хороши для этого).
Итак, вот описание того, как это работало в моей установке (Laravel 5.5) ...
В моем случае мне нужен только один Паспорт клиент, поэтому я создал другой маршрут для API-авторизации (api/v1/login
), чтобы указать только имя пользователя и пароль. Подробнее об этом можно прочитать здесь .
К счастью, этот пример охватывает базовую авторизацию паспорта тест также.
Итак, чтобы успешно запустить ваши тесты, основная идея:
- Создание ключей паспорта при настройке теста.
- Seed db с пользователями, ролями и другими ресурсами, которые могут понадобиться.
- Создать
.env
запись с PASSPORT_CLIENT_ID
(необязательно - Паспорт всегда создавать password grant token
с id = 2 на пустом дБ).
- Используйте этот идентификатор для получения правильного client_secret из базы данных.
- А затем запустите свои тесты ...
Примеры кода ...
ApiLoginTest.php
/**
* @group apilogintests
*/
public function testApiLogin() {
$body = [
'username' => 'admin@admin.com',
'password' => 'admin'
];
$this->json('POST','/api/v1/login',$body,['Accept' => 'application/json'])
->assertStatus(200)
->assertJsonStructure(['token_type','expires_in','access_token','refresh_token']);
}
/**
* @group apilogintests
*/
public function testOauthLogin() {
$oauth_client_id = env('PASSPORT_CLIENT_ID');
$oauth_client = OauthClients::findOrFail($oauth_client_id);
$body = [
'username' => 'admin@admin.com',
'password' => 'admin',
'client_id' => $oauth_client_id,
'client_secret' => $oauth_client->secret,
'grant_type' => 'password',
'scope' => '*'
];
$this->json('POST','/oauth/token',$body,['Accept' => 'application/json'])
->assertStatus(200)
->assertJsonStructure(['token_type','expires_in','access_token','refresh_token']);
}
Примечания:
Учетные данные должны быть изменены, конечно.
PASSPORT_CLIENT_ID должен быть равен 2, как описано выше.
Проверка JsonStructure является избыточной, поскольку мы получаем 200 ответов, только если авторизация прошла успешно. Однако, если вы хотели дополнительную проверку, это также проходит ...
TestCase.php
public function setUp() {
parent::setUp();
\Artisan::call('migrate',['-vvv' => true]);
\Artisan::call('passport:install',['-vvv' => true]);
\Artisan::call('db:seed',['-vvv' => true]);
}
Примечания:
Здесь мы создаем соответствующие записи в БД, которые необходимы в наших тестах.
Так что помните, чтобы пользователи с ролями и т. Д. Были засеяны здесь.
Заключительные замечания ...
Этого должно быть достаточно, чтобы ваш код работал. В моей системе все это становится зеленым, а также работает на моем Gitlab CI Runner.
Наконец, проверьте также ваше промежуточное ПО на маршрутах. Особенно, если вы экспериментировали с пакетом dingo (или jwt by thymon ).
Единственное промежуточное программное обеспечение, которое вы можете рассмотреть, применяя Паспорт маршрут авторизации, - throttle
, чтобы иметь некоторую защиту от атаки грубой силы .
Примечание ...
Паспорт и dingo имеют совершенно разные реализации jwt .
В моих тестах только Паспорт ведет себя правильно, и я предполагаю, что это причина, почему dingo больше не поддерживается.
Надеюсь, это решит вашу проблему ...