Session codeigniter localhost

Я использую эту Facebook lib для CodeIgniter, чтобы пользователи могли входить в систему с помощью Facebook. Прекрасно работает на производстве, но не на локальном хосте. Меня беспокоит то, что он работал нормально на локальном хосте, но внезапно прекратил работать.

Я искал какое-то время, и я ожидаю, что это имеет какое-то отношение к библиотеке сессий CI, но я не уверен на 100%.

Фоновая информация

  • Я запускаю MAMP с PHP 5.5.10 и Chrome 41.0.2272.118
  • Локально я настроил httpd.conf в MAMP, поэтому мой локальный URL-адрес является "настоящим" URL-адресом, например, www.example-local.net, а порт Apache - 80.
  • if($this->session) в представлении возвращает true. РЕДАКТИРОВАТЬ; Я фактически не использую это в представлении, но это просто для проверки того, что это работает.
  • Код разработки и разработки точно такой же, за исключением ключа и секретного ключа Facebook, поскольку я использую тестовое приложение локально. Как указано; он работал отлично, и я не изменил настройки тестового приложения.
  • EDIT: у меня есть мой TLD, настроенный как домен приложения и URL сайта в тестовом приложении FB. Опять же, это не похоже на проблему, поскольку

Проблема

  • if($this->session) в файле библиотеки (Facebook) возвращает false. РЕДАКТИРОВАТЬ; это, похоже, проблема. Так что это работает в представлении, а не в библиотеке. Странная вещь в том, что это работало до (без изменения кода)
  • Также кажется, что поэтому библиотека не устанавливает fb_boken в пользовательских данных сеанса и почему я подозреваю, что что-то не так с настройкой $this->session
  • Я переехал в другой часовой пояс (всего 1 час), и я где-то читал, что это может вызвать проблемы? РЕДАКТИРОВАТЬ; Я вернулся в часовой пояс, где он работал ранее, и он все еще не работает.

Что я уже пробовал и не работал

  • В config.php установите $config['sess_expiration'] на высокое значение (например, 999999) вместо 7200
  • В config.php сменив $config['cookie_domain'] на сайт localhost (http://www.example-local.net, попробовав с и без конечной косой черты) вместо пустой ("")
  • В config.php изменение $config['sess_match_useragent'] на FALSE вместо TRUE
  • Заменить приложение/систему/библиотеку/Session.php на родную сессию PHP, как описано здесь
  • Очистить все мои файлы cookie и данные о просмотре.

Дополнительная информация о config.php

$config['cookie_prefix']    = "";
$config['cookie_domain']    = "";
$config['cookie_path']      = "/";
$config['cookie_secure']    = FALSE;

Я надеялся, что использование родного сеанса PHP решит проблему, но это не так. Не уверен, что еще я могу попробовать.

Для справки полный код файла библиотеки Facebook.php

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

if ( session_status() == PHP_SESSION_NONE ) {
    session_start();
}

require_once( APPPATH . 'libraries/facebook/Facebook/GraphObject.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/GraphSessionInfo.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookSession.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookCurl.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookHttpable.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookCurlHttpClient.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookResponse.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookSDKException.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookRequestException.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookAuthorizationException.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookRequest.php' );
require_once( APPPATH . 'libraries/facebook/Facebook/FacebookRedirectLoginHelper.php' );

use Facebook\GraphSessionInfo;
use Facebook\FacebookSession;
use Facebook\FacebookCurl;
use Facebook\FacebookHttpable;
use Facebook\FacebookCurlHttpClient;
use Facebook\FacebookResponse;
use Facebook\FacebookAuthorizationException;
use Facebook\FacebookRequestException;
use Facebook\FacebookRequest;
use Facebook\FacebookSDKException;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\GraphObject;

class Facebook {
    var $ci;
    var $helper;
    var $session;

    public function __construct() {
        $this->ci =& get_instance();

        FacebookSession::setDefaultApplication( $this->ci->config->item('api_id', 'facebook'), $this->ci->config->item('app_secret', 'facebook') );
        $this->helper = new FacebookRedirectLoginHelper( $this->ci->config->item('redirect_url', 'facebook') );

        if ( $this->ci->session->userdata('fb_token') ) {
            $this->session = new FacebookSession( $this->ci->session->userdata('fb_token') );

            // Validate the access_token to make sure it still valid
            try {
                if ( ! $this->session->validate() ) {
                  $this->session = false;
                }
            } catch ( Exception $e ) {
                // Catch any exceptions
                $this->session = false;
            }
        } else {
            try {
                $this->session = $this->helper->getSessionFromRedirect();
            } catch(FacebookRequestException $ex) {
                // When Facebook returns an error
            } catch(\Exception $ex) {
                // When validation fails or other local issues
            }
        }

        if ( $this->session ) {
            $this->ci->session->set_userdata( 'fb_token', $this->session->getToken() );

            $this->session = new FacebookSession( $this->session->getToken() );
        }
    }


/*
|--------------------------------------------------------------------------
| Login URL
|--------------------------------------------------------------------------
*/

    public function get_login_url() {
        return $this->helper->getLoginUrl( $this->ci->config->item('permissions', 'facebook') );
    }


/*
|--------------------------------------------------------------------------
| Logout URL
|--------------------------------------------------------------------------
*/

    public function get_logout_url() {
        if ( $this->session ) {
            return $this->helper->getLogoutUrl( $this->session, site_url() );
        }
        return false;
    }


/*
|--------------------------------------------------------------------------
| Get user data
|--------------------------------------------------------------------------
*/

    public function get_user() {
        if ( $this->session ) {
            try {
                $user = (new FacebookRequest( $this->session, 'GET', '/me' ))->execute()->getGraphObject()->asArray();

                return $user;

            } catch(FacebookRequestException $e) {
                return false;

            }
        }
    }
}

Ответы

Ответ 1

Библиотека, которую вы используете, является внешней по отношению к основной кодовой базе CodeIgniter и поэтому не может нормально взаимодействовать с нативными функциями; вместо использования $this в качестве ссылки на экземпляр CodeIgniter, в вашей библиотеке вы должны использовать $this->ci, чтобы получить доступ к данным сеанса, ваш код будет выглядеть примерно так:

$this->ci->session->userdata();

Это более подробно описано в документации CodeIgniter здесь

Ответ 2

в представлении используйте $this->facebook->session вместо $this->session, и он будет работать;)