예제 #1
0
 /**
  * Called by the `Auth` class to run an authentication check against the Facebook API
  * and returns an array of user information on success, or `false` on failure.
  * 
  * @todo move the FacebookConfig::checkConfiguration part into the __init?
  * 
  * @throws lithium\core\ConfigException if the facebook App credentials arent set
  *
  * @param object $credentials A data container which wraps the authentication credentials used
  *               to query the model (usually a `Request` object). See the documentation for this
  *               class for further details.
  * @param array $options Options which include the options for session key names and also FB API method options.
  * @return array Returns an array containing user information on success, or `false` on failure.
  */
 public function check($credentials, array $options = array())
 {
     FacebookProxy::checkConfiguration();
     //get Url
     $base = $credentials->env('HTTPS') ? 'https://' : 'http://';
     $base .= $credentials->env('HTTP_HOST');
     $base .= $credentials->env('base');
     $facebook_config = Libraries::get('li3_facebook');
     // get the options from the li3_facebook library configuration if set there
     $options += $facebook_config;
     // otherwise, set some defaults
     $defaults = array('logout_url_options' => array('next' => $base), 'login_url_options' => array(), 'logout_url_session_key' => 'fb_logout_url', 'login_url_session_key' => 'fb_login_url', 'local_fb_session_name' => 'fb_session');
     /**
      * If the adapter config() has those keys set, then use those as the default values.
      * This allows various adapters to be created all which can change the options for logging in and out
      * for Facebook, so when Auth::check() is called, each check can be used for different reasons.
      * If the options are set with the Facebook library ($facebook_config) then there can only be one
      * "configuration" for these login and logout parameters.
      *
      * So for example, Auth::check('popup', $this->request); or Auth::check('page', $this->request);
      * The difference maybe between the two Auth configurations is the "login_url_options" array values
      * of "display" being "page" or "popup" which tells the FB API how to display the login.
      *
      * We could also pass these options in the configuration under Libraries::add('li3_facebook'), but then
      * it wouldn't be quite as easy to switch behaviors while using Auth::check();
      */
     $defaults['logout_url_options'] = isset($this->_config['logout_url_options']) ? $this->_config['logout_url_options'] : $defaults['logout_url_options'];
     $defaults['login_url_options'] = isset($this->_config['login_url_options']) ? $this->_config['login_url_options'] : $defaults['login_url_options'];
     $defaults['logout_url_session_key'] = isset($this->_config['logout_url_session_key']) ? $this->_config['logout_url_session_key'] : $defaults['logout_url_session_key'];
     $defaults['login_url_session_key'] = isset($this->_config['login_url_session_key']) ? $this->_config['login_url_session_key'] : $defaults['login_url_session_key'];
     $defaults['local_fb_session_name'] = isset($this->_config['local_fb_session_name']) ? $this->_config['local_fb_session_name'] : $defaults['local_fb_session_name'];
     // combine the defults with the options passed, giving those passed options the priority
     $options += $defaults;
     $user_data = false;
     $session = FacebookProxy::getSession();
     $uid = null;
     // Session based API call.
     if ($session) {
         // Set the session locally
         Session::write($options['local_fb_session_name'], $session);
         try {
             $uid = FacebookProxy::getUser();
         } catch (Exception $e) {
             //error_log($e);
         }
     }
     // If $uid is set, then write the fb_logout_url session key
     if (!empty($uid)) {
         if ($options['logout_url_session_key']) {
             Session::write($options['logout_url_session_key'], FacebookProxy::getLogoutUrl($options['logout_url_options']));
         }
         // Get the user data to return
         $user_data = array();
         try {
             $user_data = FacebookProxy::api('/me');
         } catch (Exception $e) {
             //error_log($e);
         }
     } else {
         // Else, the user hasn't logged in yet, write the fb_login_url session key
         if ($options['login_url_session_key']) {
             Session::write($options['login_url_session_key'], FacebookProxy::getLoginUrl($options['login_url_options']));
         }
     }
     return $user_data;
 }