Когда я делаю запрос нормальный к моему серверу Symfony, работающему на http://localhost:8000/api/admin/login_check, он возвращает нужный токен jwt.
Однако, когда я делаю это с функциональными тестами (с ./bin/phpunit), я получаю следующую ошибку:
Error: Unable to find the controller for path \"/api/admin/login_check\". The route is wrongly configured.
Я тоже прошел документы функционального тестирования.
Не стесняйтесь клонировать или разветвлять этот проект для тестирования. Существует README.md, объясняющий шаги установки.
Я также смог получить воспроизвести ошибку, клонировав рабочий пример, предоставленный одним из создателей пакета lexikjwtauthenticationbundle.
Возникает при запуске ./bin/phpunit
[2019-01-31 09:37:49] request.INFO: Matched route "api_admin_login_check". {"route":"api_admin_login_check","route_parameters":{"_route":"api_admin_login_check"},"request_uri":"http://localhost/api/admin/login_check","method":"POST"} []
[2019-01-31 09:37:49] security.INFO: Populated the TokenStorage with an anonymous Token. [] []
[2019-01-31 09:37:49] request.WARNING: Unable to look for the controller as the "_controller" parameter is missing. [] []
Происходит при выполнении запроса curl или postman
[2019-01-29 21:16:26] request.INFO: Matched route "api_admin_login_check". {"route":"api_admin_login_check","route_parameters":{"_route":"api_admin_login_check"},"request_uri":"https://localhost:8000/api/admin/login_check","method":"POST"} []
[2019-01-29 21:16:27] doctrine.DEBUG: SELECT t0.id AS id_1, t0.email AS email_2, t0.password AS password_3 FROM admin t0 WHERE t0.email = ? LIMIT 1 ["[email protected]"] []
[2019-01-29 21:16:27] security.INFO: User has been authenticated successfully. {"username":null} []
public function testLogin(){
$client = static::createClient();
$client->request('POST', '/api/admin/login_check', [], [],
[
'Content-Type' => 'application/json',
'Accept' => 'application/json'
],
json_encode([
'email' => '[email protected]',
'password' => 'qwerty123'
])
);
$this->assertEquals(200, $client->getResponse()->getStatusCode());
}
# Admin Routes
api_admin_login_check:
path: /api/admin/login_check
methods: [POST]
security:
# more configs here
firewalls:
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
login_admin:
pattern: ^/api/admin/login
stateless: true
anonymous: true
json_login:
username_path: email
provider: app_admin_provider
check_path: /api/admin/login_check
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
admin_api:
pattern: ^/api/admin
stateless: true
provider: app_admin_provider
guard:
authenticators:
- lexik_jwt_authentication.jwt_token_authenticator
access_control:
- { path: ^/api/admin/register, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api/admin, roles: ROLE_ADMIN }
- { path: ^/, roles: IS_AUTHENTICATED_ANONYMOUSLY }
Почему во время функционального тестирования есть маршрут 404 route not found для /api/admin/login_check, но он отлично работает с curl и postman?
var/logs/dev.logв app/logs/dev.log
Вы отправляете регистрационные данные на проверку входа? Это не имеет никакого смысла. Вы должны отправить данные на URL-адрес регистрации вместе с токеном авторизации. Если вы хотите сначала получить токен, отправьте _username и _password на указанную проверку входа.
@emix нет, я отправляю данные для входа в файл login_check. У меня уже есть пользователь, созданный в базе данных. Он отлично работает, когда я скручиваюсь и использую почтальона для получения токена.
Электронная почта и обычный_пароль не кажутся действительными полезными данными аутентификации для проверки входа: github.com/lexik/LexikJWTAuthenticationBundle/blob/master/…
@эмикс да ! Ты прав. Это была опечатка. Это то, что я уже изменил, но не решает проблему.
@ImanaliMamadiev Я добавил зарегистрированную информацию.
другой здесь "request_uri":"http://localhost/api/admin/login_check","method":"POST""request_uri":"https://localhost:8000/api/admin/login_check","method":"POST"
@imanaliMamadiev да, но это нормально. Все тестовые запросы делают одно и то же. И другие тесты у меня работают.
Вы проверили эту конфигурацию, включая _controller stackoverflow.com/questions/24424759/…
@спокойно, я только что проверил. Похоже, за исключением того, что это для производственного режима и использует symfony2 и без ответов :/. Кроме того, он не указывает, в чем может быть проблема.






Убедитесь, что /login_check защищен брандмауэром.
Путь /login_check должен соответствовать шаблону брандмауэра.
изменить это
контроль доступа:
к
контроль доступа:
я пробовал :Р
На самом деле это совсем не решает проблему. Он выдает отказ в доступе еще до того, как попытается получить доступ к контроллеру.
Вы добавили его как в шаблоны брандмауэра, так и в путь .. во-вторых, stackoverflow.com/questions/12409998/…. проверьте это для своего решения, я думаю, это подойдет ... просто пытаюсь помочь :)
Проблема не в том, что он не может найти правильный маршрут, а в том, что он не может найти «контроллер». Мой проект работает нормально, но не работает, когда он тестируется с помощью phpunit. Я бы предположил, что это проблема с тестовой средой и прослушивателем lexikjwtauthentication.
У вас неправильное имя для заголовка content-type в вашем тестовом запросе.
Он должен иметь имя CONTENT_TYPE.
$client->request(
'POST',
'/login_check',
['_username' => 'lexik', '_password' => 'dummy'],
[],
['CONTENT_TYPE' => 'application/json']
);
Проверка здесь: поставщик/symfony/безопасность/Http/брандмауэр/имя пользователяPasswordJsonAuthenticationListener.php::handle
if (false === strpos($request->getRequestFormat(), 'json')
&& false === strpos($request->getContentType(), 'json')
) {
return;
}
По крайней мере, это помогает в вашем коде с «воспроизведением ошибки».
Спасибо, не верится, что это было.
После нескольких бессонных ночей у меня сработал следующий сценарий.
Сначала у меня были проблемы с подключением к Postman, щелкнуть заголовок и изменить его на Application/JSON было недостаточно, так как я продолжаю получать ошибки ORM/Doctrine. что сработало для меня, так это то, что я использовал устаревшие функции в одном из моих классов PHP.
Я просто зашел в свой лог-файл Var/log/dev.log и нашел эту ошибку:
php.CRITICAL: Uncaught Error: невозможно назначить Doctrine\ORM\PersistentCollection свойству Guess\Domain\Player\Player::$guesses типа Doctrine\Common\Collections\ArrayCollection
Дальнейшие исследования показывают, что я использовал объект ArrayCollecton, который устарел как Collection, поэтому измените ArrayCollection на просто Collection, включая методы получения и установки, и повторите попытку.
Это сработало для меня сейчас, и я так счастлив.
Ссылка: Ошибка назначения доктрины: невозможно назначить Doctrine\ORM\PersistentCollection свойству
Это может иметь большое значение, чтобы помочь кому-то в ближайшем будущем.
Вы смотрели журнал?