clientRegistry = $clientRegistry; $this->entityManager = $entityManager; $this->router = $router; $this->requestStack = $requestStack; } public function supports(Request $request): ?bool { // continue ONLY if the current ROUTE matches the check ROUTE return $request->attributes->get('_route') === 'connect_trackmania_check'; } public function authenticate(Request $request): Passport { $client = $this->clientRegistry->getClient('TrackMania'); $accessToken = $this->fetchAccessToken($client); $selfvalidating = new SelfValidatingPassport( new UserBadge($accessToken->getToken(), function() use ($accessToken, $client) { /** @var Beu\TrackMania\OAuth2\Client\Provider\TrackManiaProviderOwner $user */ $user = $client->fetchUserFromToken($accessToken); $existingUser = $this->entityManager->getRepository(User::class)->findOneBy(['AccountId' => $user->getId()]); if ($existingUser) { /** @var User $existingUser */ if ($existingUser->getDisplayName() !== $user->getDisplayName()) { $existingUser->setDisplayName($user->getDisplayName()); $this->entityManager->flush(); } return $existingUser; } $newuser = new User(); $newuser->setAccountId($user->getId()); $newuser->setDisplayName($user->getDisplayName()); $this->entityManager->persist($newuser); $this->entityManager->flush(); return $newuser; }) ); return $selfvalidating; } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response { $session = $this->requestStack->getSession(); if ($session->has("PostLoginRedirect")) { $targetUrl = $session->get("PostLoginRedirect"); } else { $targetUrl = $this->router->generate('homepage'); } return new RedirectResponse($targetUrl); } public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response { $message = strtr($exception->getMessageKey(), $exception->getMessageData()); return new Response($message, Response::HTTP_FORBIDDEN); } }