Standardowo niezależnie od tego czy użytkownik nie istnieje, wprowadziliśmy złe hasło lub jest zablokowany wiadomość zwrotna na stronie internetowej stworzonej w oparciu o FOSUserBundle (Symfony) zawsze wygląda tak samo:
{
"code": 401,
"message": "Bad credentials"
}
W łatwy sposób można uzyskać dokładną wiadomość jaki błąd wystąpił, wystarczy zarejestrować prosty subscriber który do odpowiedzi wprowadzi wiadomość z pierwszego wyjątku który wystąpił (Pierwszy wyjątek prawdopodobnie pochodzi FosUser’a i zawiera pierwszy błąd walidacji użytkownika który zawiera wiadomość o dokładnym błędzie)
<?php
namespace App\Event\Subscriber;
use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationFailureEvent;
use Lexik\Bundle\JWTAuthenticationBundle\Events;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
class AuthenticationFailureSubscriber implements EventSubscriberInterface {
public static function getSubscribedEvents()
{
return [
Events::AUTHENTICATION_FAILURE => 'onAuthenticationFailure'
];
}
public function onAuthenticationFailure(AuthenticationFailureEvent $event)
{
$firstEvent = $event->getException();
while($firstEvent->getPrevious()) {
$firstEvent = $firstEvent->getPrevious();
}
$response = $event->getResponse();
$response->setMessage($firstEvent->getMessage());
$event->setResponse($response);
}
}
Dzięki temu dostajemy zwrotki typu:
{
"code": 401,
"message": "The presented password is invalid."
}
{
"code": 401,
"message": "User account is disabled."
}
{
"code": 401,
"message": "Username \"admin\" does not exist."
}