<?php
namespace App\Security;
use App\Service\JwtService;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;
class TokenAuthenticator extends AbstractGuardAuthenticator
{
private $em;
/**
* @var JwtService
*/
private $jwtService;
private $logger;
public function __construct(
EntityManagerInterface $em,
JwtService $jwtService,
LoggerInterface $logger
) {
$this->em = $em;
$this->jwtService = $jwtService;
$this->logger = $logger;
}
/**
* Called on every request to decide if this authenticator should be
* used for the request. Returning `false` will cause this authenticator
* to be skipped.
*/
public function supports(Request $request): bool
{
return true;//$request->headers->has('Authorization');
}
/**
* Called on every request. Return whatever credentials you want to
* be passed to getUser() as $credentials.
*/
public function getCredentials(Request $request)
{
return isset($_COOKIE['jwt']) ? $_COOKIE['jwt'] : ($request->headers->get('Authorization') ?: false);
}
public function getUser($credentials, UserProviderInterface $userProvider): ?UserInterface
{
try {
$credentials = str_replace('Bearer ', '', $credentials);
return $userProvider->loadUserByUsername($this->jwtService->getUser($credentials));
} catch (\Exception $exception) {
throw new AuthenticationException($exception->getMessage());
}
}
public function checkCredentials($credentials, UserInterface $user): bool
{
// Check credentials - e.g. make sure the password is valid.
// In case of an API token, no credential check is needed.
// Return `true` to cause authentication success
return true;
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $providerKey): ?Response
{
$request->attributes->set('studentId', $token->getUser()->getId());
// on success, let the request continue
return null;
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
{
$data = [
'message' => strtr($exception->getMessageKey(), $exception->getMessageData())
];
$res = new JsonResponse($data, Response::HTTP_UNAUTHORIZED);
setcookie('jwt', null, time() - 1, '/', '', false, true);
setcookie('isLoggedIn', false, time() - 1, '/', '', false, false);
setcookie('role', false, time() - 1, '/', '', false, false);
//setcookie('isAdmin',false,time()-1,'/','',false,false);
// setcookie('isSuperAdmin',false,time()-1,'/','',false,false);
return $res;
}
/**
* Called when authentication is needed, but it's not sent
*/
public function start(Request $request, AuthenticationException $authException = null): Response
{
$data = [
'message' => 'Authentication Required'
];
return new JsonResponse($data, Response::HTTP_UNAUTHORIZED);
}
public function supportsRememberMe(): bool
{
return false;
}
}