/** * @param \User\Entity\User $user * @param $password * @return \User\Entity\Auth */ public function generateEquals(\User\Entity\User $user, $password) { //delete row $auth = $this->getObjectManager()->getRepository('User\\Entity\\Auth')->findOneBy(['userId' => $user->getId(), 'provider' => Auth::PROVIDER_EQUALS]); // ->findOneByUserId($user->getId()); if ($auth) { $this->getObjectManager()->remove($auth); $this->getObjectManager()->flush(); } // new auth row $row = new \User\Entity\Auth(); $row->setUserId($user->getId()); $row->setForeignKey($user->getEmail()); $row->setProvider(self::PROVIDER_EQUALS); $row->setTokenType(self::TYPE_ACCESS); // generate secret $alpha = range('a', 'z'); shuffle($alpha); $secret = array_slice($alpha, 0, rand(5, 15)); $secret = md5($user->getId() . join('', $secret)); $row->setTokenSecret($secret); // encrypt password and save as token $row->setToken(self::encrypt($row, $password)); $user->getAuths()->add($row); $row->setUser($user); $this->getObjectManager()->persist($row); $this->getObjectManager()->flush(); return $row; }
/** * @return \Zend\Http\Response * @throws \Facebook\FacebookRequestException */ public function facebookCallbackAction() { $config = $this->getServiceLocator()->get('config')['facebook']; $config['callbackUrl'] = $this->url()->fromRoute('user/default', ['controller' => 'auth', 'action' => 'facebook-callback'], ['force_canonical' => true]); FacebookSession::setDefaultApplication($config['appId'], $config['appSecret']); $helper = new FacebookRedirectLoginHelper($config['callbackUrl']); try { $session = $helper->getSessionFromRedirect(); } catch (\Exception $ex) { $this->flashMessenger()->addErrorMessage("Invalid callback request. Oops. Sorry."); return $this->redirect()->toRoute('home'); } if ($session) { // Logged in $request = new FacebookRequest($session, 'GET', '/me'); $response = $request->execute(); $graphObject = $response->getGraphObject(); /** * @var \Doctrine\ORM\EntityManager $objectManager */ $objectManager = $this->getServiceLocator()->get('Doctrine\\ORM\\EntityManager'); /** * @var \User\Entity\Auth $auth */ $auth = $objectManager->getRepository('User\\Entity\\Auth')->getAuthRow(Auth::PROVIDER_FACEBOOK, $graphObject->getProperty('id')); if ($auth) { $user = $auth->getUser(); if (!$user->isActive()) { $this->flashMessenger()->addSuccessMessage("'User is not active'"); return $this->redirect()->toRoute('home'); } $auth->setToken($session->getAccessToken()); $auth->setTokenSecret(0); $auth->setTokenType(Auth::TYPE_ACCESS); $message = "You've successfully logged in via facebook"; } else { if (!$this->identity()) { //create new user $user = new \User\Entity\User(); $displayName = $graphObject->getProperty('first_name') . ' ' . $graphObject->getProperty('last_name'); $user->setDisplayName($displayName); $user->setRole($user::ROLE_USER); $user->activate(); $objectManager->persist($user); $objectManager->flush(); } else { //get current authorized user $user = $this->identity()->getUser(); } $auth = new \User\Entity\Auth(); $auth->setToken($session->getAccessToken()); $auth->setTokenSecret(0); $auth->setForeignKey($graphObject->getProperty('id')); $auth->setProvider(Auth::PROVIDER_FACEBOOK); $auth->setTokenType(Auth::TYPE_ACCESS); $auth->setUserId($user->getId()); $user->getAuths()->add($auth); $auth->setUser($user); $message = "You've successfully registered via facebook"; } $objectManager->persist($user); $objectManager->persist($auth); $objectManager->flush(); $auth->login($this->getServiceLocator()); $this->flashMessenger()->addSuccessMessage($message); $session = new Container('location'); $location = $session->location; if ($location) { $session->getManager()->getStorage()->clear('location'); return $this->redirect()->toUrl($location); } return $this->redirect()->toRoute('home'); } }