1
resposta

Autenticação com paginas twig

Bom dia, estou tentando utilizar esse projeto mas adaptando para usar também paginas web feitas com twig. Funciona tudo bem sem problemas, mas não estou conseguindo add no cabeçalho do response da pagina twig a Authorization com o tokem.No LoginController já tentei redirecionar com os comandos: "return $this->redirectToRoute('dashboard', array('access_token' => $token));" e "$response = new RedirectResponse('/dashboard', 302, array('Bearer ' => $token)); $response->send();" mas nenhuma das duas esta adicionado o Authorization no header, logo no JwtAutenticador na function getCredentials não enconta o token. Pode me dar alguma dica de como fazer essa autenticação utilizando essa mesma estrutura?

Vou colocar como ficou meu LoginController

<?php

namespace App\Controller;

use App\Repository\UserRepository;
use Firebase\JWT\JWT;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;

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)
    {

        if (0 === strpos($request->headers->get('Content-Type'), 'application/json')){
            $json = $request->getContent();
        }else{
            $entidade = array(
                'usuario' => $request->request->get('usuario'),
                'senha'=> $request->request->get('senha'),
            );

            $json =  json_encode($entidade);

        };

        $dadosEmJson = json_decode($json);
        if (is_null($dadosEmJson->usuario) || is_null($dadosEmJson->senha)) {
            return new JsonResponse([
                'erro' => 'Favor enviar usuário e senha'
            ], Response::HTTP_BAD_REQUEST);
        }

        $user = $this->repository->findOneBy([
            'username' => $dadosEmJson->usuario
        ]);
        if (!$this->encoder->isPasswordValid($user, $dadosEmJson->senha)) {
            return  new JsonResponse([
                'erro' => 'Usuário ou senha inválidos'
            ], Response::HTTP_UNAUTHORIZED);
        }

        $token = JWT::encode(['username' => $user->getUsername()], 'B@r12bo16', 'HS256');

        //testa se é uma requisição web ou json
        if (0 === strpos($request->headers->get('Content-Type'), 'application/json')){
            return new JsonResponse(['access_token' => $token]);            
        }else{    
            $response = new RedirectResponse('/dashboard', 302,  array('Bearer ' => $token));
            $response->send(); 
            //return $this->redirectToRoute('dashboard', array('access_token' => $token));             
        }

    }
}
1 resposta

Fala, Ledilson!

Muito legal você evoluir o projeto.

Então, cara... Utilizar tokens é a maneira ideal de fazer login em APIs. Já pra aplicações fullstack, você vai querer manter o usuário em sessão.

Você pode ver como configurar aqui: https://symfony.com/doc/current/security.html

Pra utilizar token em aplicações completas, em toda requisição você vai precisar enviar o token, o que te obrigaria a fazer as requisições através de JavaScript. Não é uma abordagem muito interessante não.

;-)