85 lines
2.9 KiB
PHP
85 lines
2.9 KiB
PHP
<?php
|
|
|
|
namespace Lexik\Bundle\JWTAuthenticationBundle\Security\Http\Authentication;
|
|
|
|
use Lexik\Bundle\JWTAuthenticationBundle\Event\AuthenticationSuccessEvent;
|
|
use Lexik\Bundle\JWTAuthenticationBundle\Events;
|
|
use Lexik\Bundle\JWTAuthenticationBundle\Response\JWTAuthenticationSuccessResponse;
|
|
use Lexik\Bundle\JWTAuthenticationBundle\Security\Http\Cookie\JWTCookieProvider;
|
|
use Lexik\Bundle\JWTAuthenticationBundle\Services\JWTTokenManagerInterface;
|
|
use Symfony\Component\HttpFoundation\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
|
|
use Symfony\Component\Security\Core\User\UserInterface;
|
|
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
|
|
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
|
|
|
|
/**
|
|
* AuthenticationSuccessHandler.
|
|
*
|
|
* @author Dev Lexik <dev@lexik.fr>
|
|
* @author Robin Chalas <robin.chalas@gmail.com>
|
|
*
|
|
* @final
|
|
*/
|
|
class AuthenticationSuccessHandler implements AuthenticationSuccessHandlerInterface
|
|
{
|
|
private $cookieProviders;
|
|
|
|
protected $jwtManager;
|
|
protected $dispatcher;
|
|
protected $removeTokenFromBodyWhenCookiesUsed;
|
|
|
|
/**
|
|
* @param iterable|JWTCookieProvider[] $cookieProviders
|
|
*/
|
|
public function __construct(JWTTokenManagerInterface $jwtManager, EventDispatcherInterface $dispatcher, $cookieProviders = [], bool $removeTokenFromBodyWhenCookiesUsed = true)
|
|
{
|
|
$this->jwtManager = $jwtManager;
|
|
$this->dispatcher = $dispatcher;
|
|
$this->cookieProviders = $cookieProviders;
|
|
$this->removeTokenFromBodyWhenCookiesUsed = $removeTokenFromBodyWhenCookiesUsed;
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function onAuthenticationSuccess(Request $request, TokenInterface $token): Response
|
|
{
|
|
return $this->handleAuthenticationSuccess($token->getUser());
|
|
}
|
|
|
|
/**
|
|
* @return Response
|
|
*/
|
|
public function handleAuthenticationSuccess(UserInterface $user, $jwt = null)
|
|
{
|
|
if (null === $jwt) {
|
|
$jwt = $this->jwtManager->create($user);
|
|
}
|
|
|
|
$jwtCookies = [];
|
|
foreach ($this->cookieProviders as $cookieProvider) {
|
|
$jwtCookies[] = $cookieProvider->createCookie($jwt);
|
|
}
|
|
|
|
$response = new JWTAuthenticationSuccessResponse($jwt, [], $jwtCookies);
|
|
$event = new AuthenticationSuccessEvent(['token' => $jwt], $user, $response);
|
|
|
|
$this->dispatcher->dispatch($event, Events::AUTHENTICATION_SUCCESS);
|
|
$responseData = $event->getData();
|
|
|
|
if ($jwtCookies && $this->removeTokenFromBodyWhenCookiesUsed) {
|
|
unset($responseData['token']);
|
|
}
|
|
|
|
if ($responseData) {
|
|
$response->setData($responseData);
|
|
} else {
|
|
$response->setStatusCode(JWTAuthenticationSuccessResponse::HTTP_NO_CONTENT);
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
}
|