/** * @param Request $request * @param string $providerName * * @return Response */ private function handleOAuthCallbackNotAuthenticated(Request $request, ProviderInterface $provider) { try { $data = $provider->handleOAuthCallback($request); $repository = $this->get('doctrine')->getRepository('Model:User'); $user = $repository->findOneBy(['loginProviderUserId' => $provider->getProviderUserId($data['access_token']), 'loginProviderName' => $provider->getName()]); if (!$user) { $user = $provider->createUser($data['access_token']); $user->setStatus(User::STATUS_WAITING_LIST); $user->setWaitingList($user->getWaitingList() + 1); $user->addRole('ROLE_USER'); $user->setPassword(md5(uniqid())); $user->setEnabled(true); } if ($user->getStatus() === User::STATUS_WAITING_LIST) { if ($this->isForceEnabled($user, $request->getSession())) { $user->setStatus(User::STATUS_ENABLED); } else { $user->setWaitingList($user->getWaitingList() + 1); $user->setBetaSignup($this->createBetaSignup($user)); } } if (null !== ($id = $this->get('session')->get('beta_signup'))) { $betaSignup = $this->get('doctrine')->getRepository('Model:BetaSignup')->find($id); $user->setBetaSignup($betaSignup); } $user->setLastLogin(new DateTime()); $user->setProviderAccessToken($provider->getName(), $data['access_token']); $provider->refreshScopes($user); $manager = $this->get('doctrine.orm.entity_manager'); $manager->persist($user); $manager->flush(); } catch (ProviderException $e) { $csrfToken = $this->container->has('form.csrf_provider') ? $this->container->get('form.csrf_provider')->generateCsrfToken('authenticate') : null; $session = $request->getSession(); $lastUsername = null === $session ? '' : $session->get(SecurityContextInterface::LAST_USERNAME); return $this->render('FOSUserBundle:Security:login.html.twig', ['error' => $e->getMessage(), 'csrf_token' => $csrfToken, 'last_username' => $lastUsername]); } $this->get('fos_user.security.login_manager')->loginUser('main', $user); if ($request->getSession()->has('_security.main.target_path')) { $redirectUrl = $request->getSession()->get('_security.main.target_path'); $request->getSession()->remove('_security.main.target_path'); } else { $redirectRoute = count($user->getProjects()) == 0 ? 'app_core_import' : 'app_core_homepage'; $redirectUrl = $this->generateUrl($redirectRoute); } return $this->redirect($redirectUrl); }