2
respostas

Falha na autenticação do Usuário

Executei a configuração da proteção de rota seguindo o passo a passo da aula. Mas sempre que tento fazer alguma modificação. Recebo a mensagem de falha na autenticação. A geração do token está acontecendo com sucesso.

{
    "usuario": "usuario",
    "senha": "123456"
}

Recebo

{
    "acess_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InVzdWFyaW8ifQ.Yytcv05WKMtD5T4-saEgpZxICv7Vhp6uCnfeP_N2Uew"
}

Não sei se pode ter relação, mas ao comparar o UserFixtures que eu fiz com o modelo da aula achei a seguinte diferença: Modelo da Aula A classe ObjectManager está definida como

interface ObjectManager extends ObjectManager \Doctrine\Common\Persistence\ObjectManager

No entanto para mim esta opção apresenta erro, O PhpStorm sinaliza a mensagem:

Declaration must be compatible with FixtureInterface->load(manager: \Doctrine\Persistence\ObjectManager) 

A opção que utilizei foi selecionar o ObjectManager do tipo:

interface ObjectManager \Doctrine\Persistence\ObjectManager

A mesma coisa ocorre para o AppFixture.

Vou postar abaixo como está o User e o App Fixture:

namespace App\DataFixtures;

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;



class UserFixtures extends Fixture
{
    public function load(ObjectManager $manager)
    {
        $user= new \App\Entity\User() ;
        $user ->setUsername ('usuario')
              ->setPassword('$argon2i$v=19$m=65536,t=4,p=1$RFkyZ1VoMDJOYmVMdzh1ZA$5VA+o/XveQIzZq3uxhHrhxhwK3oLxOkAQ2TNHrWPi5k');
        $manager->persist($user);

        $manager->flush();
    }
}

AppFixture:

namespace App\DataFixtures;

use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Persistence\ObjectManager;

class AppFixtures extends Fixture
{
    public function load(ObjectManager $manager)
    {
        // $product = new Product();
        // $manager->persist($product);

        $manager->flush();
    }
}

Agora o JwtAutenticador:

class JwtAutenticador extends AbstractGuardAuthenticator
{
    /**
     * @var UserRepository
     */
    private $repository;

    public function __construct(UserRepository $repository)
    {

        $this->repository = $repository;
    }


    public function start(Request $request, AuthenticationException $authException = null)
    {
        // TODO: Implement start() method.
    }

    public function supports(Request $request) #ctrl+p
    {
        return $request->getPathInfo() !== '/login';
    }

    public function getCredentials(Request $request)
    {
        $token= str_replace(
            'Bearer',
            '',
            $request->headers->get('Authorization')
        );
        try {
            return JWT::decode($token,'chave',['HS256']) ;
        } catch (\Exception $e){
            return false;
        }

    }

    public function getUser($credentials, UserProviderInterface $userProvider)
    {
        if(!is_object($credentials) || !property_exists($credentials,'username')){

            return null;
        }
        $username= $credentials->username;
        return $this->repository->findOneBy(['username'=>$username]);

    }

    public function checkCredentials($credentials, UserInterface $user)
    {
        return is_object($credentials) && property_exists($credentials,'username');
    }

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
    {
        return new JsonResponse([
            'erro'=> 'Falha na Autenticação'
        ],Response::HTTP_UNAUTHORIZED );
    }

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
    {
        return null;
    }

    public function supportsRememberMe()
    {
       return false;
    }
}
2 respostas

LoginController:

class LoginController extends AbstractController
{
    /**
     * @var UserRepository
     */
    private $repository;
    /**
     * @var UserPasswordEncoderInterface
     */
    private $encoder;

    public function __construct(
        UserRepository $repository,
        UserPasswordEncoderInterface  $encoder

    )
    {

        $this->repository = $repository;
        $this->encoder = $encoder;
    }

    /**
     * @Route("/login", name="login")
     */
    public function index(Request $request)
    {
        $dadosEmJson= json_decode($request->getContent());
        if(is_null($dadosEmJson->usuario)|| is_null($dadosEmJson->senha) ){
            return new Response(
                ['erro'=>'Favor Enviar usuario e senha'

                ], Response::HTTP_BAD_REQUEST );
        }

        $user= $this->repository->findOneBy([
            'username'=>$dadosEmJson->usuario]);

        if(!$this->encoder->isPasswordValid($user,$dadosEmJson->senha)) {

            return new JsonResponse(
                [
                    'erro'=>'Usuario ou senha invalidos'
                ],
                Response::HTTP_UNAUTHORIZED);
        }

        $token= JWT::encode(['username'=>$user->getUsername()],'chave','HS256' );
        return new JsonResponse([
            'acess_token'=> $token ]);

    }
}

Rodolfo, se você consegue criar o token é porque o usuário existe no banco, logo, não tem nada a ver com as fixtures. No seu caso, sugiro realizar a depuração da rotina para encontrar o problema. :-)