【发布时间】:2015-06-18 03:08:59
【问题描述】:
我将this Facebook lib 用于 CodeIgniter,以便用户可以使用 Facebook 登录。在生产环境中工作得很好,但在本地主机上却不行。困扰我的是它曾经在 localhost 上工作正常,但突然停止工作。
我一直在寻找一段时间,我希望这与 CI 的会话库有关,但我不是 100% 确定。
背景信息
- 我正在使用 PHP 5.5.10 和 Chrome 41.0.2272.118 运行 MAMP
- 在本地我已经在 MAMP 中配置了 httpd.conf,所以我的本地 url 是一个“真实”的 URL,比如 www.example-local.net,Apache 端口是 80
-
if($this->session)在视图中返回 true。编辑;我实际上并没有在视图中使用它,但这只是为了测试它是否有效 - 生产和开发代码完全一样,除了Facebook API key和secret,因为我在本地使用了一个测试应用程序。如..所示;它之前运行得非常好,我没有更改我的测试应用设置。
- 编辑:我在 FB 测试应用程序中将我的 TLD 配置为应用程序域和站点 URL。同样,这似乎不是问题,因为
问题
-
(Facebook) 库文件中的
if($this->session)返回 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 - 将 app/system/library/Session.php 替换为 PHP 的本机会话,如 here 所述
- 清除我所有的 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's 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;
}
}
}
}
【问题讨论】:
-
我使用一个带有 TLD 的虚拟主机,所以我的本地域是 www.example-local.net
-
刚刚检查过,我也在 80 端口上。所以这不是问题。
-
我发现 CIv2 会话类失败 - 特别是。使用 ajax - 您是否尝试使用 PHP 的 $_SESSION 变量来代替?
-
当你说它不起作用时,到底发生了什么(或没有)?
标签: php codeigniter session localhost