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
, и он будет работать;)