* @author Robin Chalas * * @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; } }