Example #1
0
 /**
  * Login using facebook
  * @param string $token
  * @param int $expires
  * @return array
  */
 public function facebook($token, $expires = 86400)
 {
     if (empty($this->fb_app_id) or empty($this->fb_app_secret) or empty($token)) {
         if ($this->logger) {
             $this->logger->addError("Facebook not properly configured");
         }
         return array(false, self::ERROR_FACEBOOK_ERROR);
     }
     // get user info from facebook
     $fb = new \Facebook\Facebook(array('app_id' => $this->fb_app_id, 'app_secret' => $this->fb_app_secret, 'default_graph_version' => 'v2.4', 'default_access_token' => $token));
     try {
         $response = $fb->get('/me?fields=name,email');
         $me = $response->getGraphUser();
         $name = $me->getName();
         $email = $me->getField('email');
     } catch (\Facebook\Exceptions\FacebookResponseException $e) {
         if ($this->logger) {
             $this->logger->addError('Facebook Graph returned an error: ' . $e->getMessage());
         }
         return array(false, self::ERROR_FACEBOOK_ERROR);
     } catch (\Facebook\Exceptions\FacebookSDKException $e) {
         if ($this->logger) {
             $this->logger->addError('Facebook SDK returned an error: ' . $e->getMessage());
         }
         return array(false, self::ERROR_FACEBOOK_ERROR);
     }
     if (empty($email) or empty($name)) {
         return array(false, self::ERROR_FACEBOOK_ERROR);
     }
     // check if a user with this email already exists
     $user = new User($this->db, $this->logger);
     if (!$user->getByEmail($email)) {
         // create local user
         $user->name = $name;
         $user->email = $email;
         $user->pswd = "FACEBOOK";
         $user->type = User::TYPE_REGULAR_USER;
         $user->source = User::SOURCE_FACEBOOK;
         $user->status = User::STATUS_ENABLED;
         if (!$user->save()) {
             return array(false, self::ERROR_INTERNAL_ERROR);
         }
     }
     // establish a session for this user
     $session = new Session($this->db, $this->logger);
     if (!$session->getByUserId($user->id)) {
         $session->userId = $user->id;
         $session->createdAt = time();
     }
     $session->token = bin2hex(openssl_random_pseudo_bytes(32));
     $session->expires = time() + $expires;
     if (!$session->save()) {
         return array(false, self::ERROR_INTERNAL_ERROR);
     }
     return array(true, $session);
 }