/** * @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; }
/** * {@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; }
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."); } }