clientRegistry = $clientRegistry; $this->entityManager = $entityManager; $this->router = $router; } public function supports(Request $request): ?bool { return $request->attributes->get('_route') === 'app_osm_callback'; } public function authenticate(Request $request): Passport { $client = $this->clientRegistry->getClient('openstreetmap'); $accessToken = $this->fetchAccessToken($client); return new SelfValidatingPassport( new UserBadge($accessToken->getToken(), function() use ($accessToken, $client) { $resourceOwner = $client->fetchUserFromToken($accessToken); $existingUser = $this->entityManager->getRepository(User::class)->findOneBy(['osmId' => $resourceOwner->getId()]); if ($existingUser) { return $existingUser; } $user = new User(); $user->setOsmId($resourceOwner->getId()); $user->setUsername($resourceOwner->getDisplayName()); $this->entityManager->persist($user); $this->entityManager->flush(); return $user; }) ); } public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response { return null; } public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response { return null; } public function start(Request $request, AuthenticationException $authException = null): Response { return new RedirectResponse( '/', Response::HTTP_TEMPORARY_REDIRECT ); } }