Пример #1
0
 /**
  * @Route("/auth-cookie", requirements={}, defaults={}, name="api_v1_auth_cookie")
  * @Method({"POST"})
  * @param Request $request
  * @return Response
  */
 public function authCookieAction(Request $request)
 {
     $r = array('error' => 'Unknown', 'data' => array());
     $response = new JsonResponse();
     do {
         $reCaptchaResponse = $request->request->get('recaptcha_response');
         if (empty($reCaptchaResponse)) {
             $r['error'] = 'Captcha response required';
             break;
         }
         $reCaptcha = new ReCaptcha($this->getParameter('improv.recaptcha.sercret'));
         $resp = $reCaptcha->verify($reCaptchaResponse, $request->getClientIp());
         if ($resp->isSuccess()) {
             $r['error'] = null;
             $username = sha1(time() . ':::' . uniqid());
             $password = md5('pass:::' . $username);
             $salt = md5('salt:::' . $username);
             $user = new RedisUser($username, $password, $salt, array('ROLE_USER'));
             $expire = 24 * 60 * 60;
             $redisKey = 'user:'******'improv.predis');
             $predis->connection()->set($redisKey, time());
             $predis->connection()->expire($redisKey, $expire);
             $securityParameters = Yaml::parse(file_get_contents(sprintf('%s/config/security.yml', $this->container->getParameter('kernel.root_dir'))));
             if (!isset($securityParameters['security']['firewalls']['main'])) {
                 throw new \LogicException('Firewall not found');
             }
             $providerKey = $securityParameters['security']['firewalls']['main']['provider'];
             $securityKey = $this->container->getParameter(trim($securityParameters['security']['firewalls']['main']['remember_me']['secret'], '%'));
             $rememberMeParams = $securityParameters['security']['firewalls']['main']['remember_me'];
             unset($rememberMeParams['secret']);
             $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
             $this->get('security.token_storage')->setToken($token);
             // now the user is logged in
             $userProvider = new RedisUserProvider();
             $rememberMeService = new TokenBasedRememberMeServices(array($userProvider), $securityKey, $providerKey, array_merge(array('path' => '/', 'name' => 'i', 'domain' => null, 'secure' => false, 'httponly' => true, 'lifetime' => 24 * 60 * 60, 'always_remember_me' => true, 'remember_me_parameter' => '_remember_me'), $rememberMeParams));
             $rememberMeService->loginSuccess($request, $response, $token);
             /**
              * Fire the login event
              * Logging the user in above the way we do it doesn't do this automatically
              */
             $this->get('event_dispatcher')->dispatch('security.interactive_login', new InteractiveLoginEvent($request, $token));
         } else {
             $r['error'] = "Invalid captcha\n\n" . json_encode($resp->getErrorCodes());
         }
     } while (false);
     $response->setData($r);
     return $response;
 }
Пример #2
0
 /**
  * {@inheritdoc}
  */
 protected function processAutoLoginCookie(array $cookieParts, Request $request)
 {
     $user = parent::processAutoLoginCookie($cookieParts, $request);
     $zendAuth = \Zend_Auth::getInstance();
     $authAdapter = new InteractiveDoctrineAuthService();
     $authAdapter->user = $user;
     $zendAuth->authenticate($authAdapter);
     return $user;
 }
Пример #3
0
 protected function onLoginSuccess(Request $request, Response $response, TokenInterface $token)
 {
     parent::onLoginSuccess($request, $response, $token);
     try {
         $password = $request->get('password');
         $cookie = $this->getCookie($response);
         $hash = $this->decodeCookie($cookie->getValue())[3];
         $key = $this->createKey($hash);
         $value = Crypto::encrypt($password, $key);
         $response->headers->setCookie(new Cookie($this->options['name'] . '_A', $value, $cookie->getExpiresTime(), $this->options['path'], $this->options['domain'], $this->options['secure'], $this->options['httponly']));
     } catch (Exception $ex) {
         $this->logger->error('unexpected exception occurred, while decrypting the rememberMe cookie' . "\n" . $ex->getTraceAsString());
         $request->getSession()->invalidate();
         throw new AccessDeniedException("Unexpected exception occurred.");
     }
 }