/** * 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); }