【问题标题】:session codeigniter localhost会话代码点火器本地主机
【发布时间】: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


【解决方案1】:

在视图中使用$this-&gt;facebook-&gt;session 而不是$this-&gt;session,它会起作用;)

【讨论】:

  • 谢谢。这不是问题,在视图中$this-&gt;session 正在工作(我更新了问题以表明我实际上并没有在视图中使用它,但它只是为了测试它是否会返回 true )。问题是 $this-&gt;session 在库中不起作用。
【解决方案2】:

您使用的库在核心 CodeIgniter 代码库之外,因此无法以正常方式与本机函数通信;而不是使用 $this 作为您对 CodeIgniter 实例的引用,在您的库中您应该使用 $this-&gt;ci 以便访问会话数据,您的代码如下所示:

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

这在 CodeIgniter 文档here中有更详细的解释

【讨论】:

  • 如果我在 Facebook.php 库中用$this-&gt;ci-&gt;session 替换所有$this-&gt;session 实例,它仍然不起作用。如果我这样做,也会发生if($this-&gt;session) 在视图中返回 false,而如果我保持 Facebook.php 库代码就像现在一样(如在我的帖子中),这在视图中返回 true。
猜你喜欢
  • 2012-11-01
  • 2016-12-26
  • 2016-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-24
  • 1970-01-01
  • 2015-07-12
相关资源
最近更新 更多