Пример #1
0
 /**
  * @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);
 }