2015-04-12 19 views
14

Tôi đang sử dụng this Facebook lib cho CodeIgniter để người dùng có thể đăng nhập bằng Facebook. Hoạt động hoàn toàn tốt trên sản xuất, nhưng không phải trên localhost. Điều làm tôi lo lắng là nó được sử dụng để làm việc tốt trên localhost, nhưng đột nhiên ngừng hoạt động.session codeigniter localhost

Tôi đã tìm kiếm một thời gian và tôi hy vọng rằng điều này có liên quan đến thư viện phiên của CI, nhưng tôi không chắc chắn 100%.

thông tin nền

  • Tôi đang chạy MAMP với PHP 5.5.10 và Chrome 41.0.2272.118
  • tại địa phương tôi đã cấu hình httpd.conf trong MAMP để url địa phương của tôi là một ' URL thực như 'www.example-local.net và cổng Apache là 80
  • if($this->session) trong chế độ xem trả về true. CHỈNH SỬA; Tôi không thực sự sử dụng điều này trong một cái nhìn nhưng nó chỉ để kiểm tra rằng điều này đang làm việc
  • Mã sản xuất và phát triển hoàn toàn giống nhau, ngoại trừ khóa API Facebook và bí mật vì tôi sử dụng ứng dụng thử nghiệm cục bộ. Như được chỉ ra; nó hoạt động hoàn hảo trước và tôi chưa thay đổi cài đặt ứng dụng thử nghiệm của mình.
  • EDIT: Tôi có TLD được định cấu hình làm miền ứng dụng và URL trang web trong ứng dụng thử nghiệm FB. Một lần nữa, điều này dường như không có vấn đề kể từ

Vấn đề

  • if($this->session) trong (Facebook) tập tin thư viện trả về false. CHỈNH SỬA; điều này có vẻ là vấn đề. Vì vậy, điều này là làm việc trong quan điểm, không phải trong thư viện. Điều kỳ lạ về nó là điều này đã làm việc trước (không thay đổi code)
  • Nó cũng có vẻ như do đó thư viện không đặt fb_boken trong userdata phiên và đó là lý do tại sao tôi nghi ngờ có điều gì đó sai với thiết $this->session
  • tôi đã chuyển sang múi giờ khác (chỉ 1 giờ) và tôi đọc ở đâu đó rằng điều này có thể gây ra sự cố? CHỈNH SỬA; Tôi đã trở lại trong múi giờ nơi nó làm việc trước đây và nó vẫn không làm việc

Những gì tôi đã cố gắng và đã không làm việc

  • Trong config.php thiết $config['sess_expiration'] đến một giá trị cao (ví dụ 999999) thay vì 7200
  • Trong config.php thay đổi $config['cookie_domain'] thành trang web localhost (http://www.example-local.net, đã thử và không có dấu gạch chéo) thay vì trống ("")
  • Trong config.php thay đổi $config['sess_match_useragent']-FALSE thay vì TRUE
  • Thay thế ứng dụng/hệ thống/thư viện/Session.php với phiên bản của PHP như mô tả here
  • Xóa tất cả các tập tin cookie và dữ liệu duyệt

thông tin khác liên quan đến config.php

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

Tôi hy vọng rằng việc sử dụng phiên gốc của PHP sẽ giải quyết được vấn đề, nhưng không. Không chắc tôi có thể thử những gì khác.

Để tham khảo đầy đủ Facebook.php tập tin thư viện mã

<?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; 

      } 
     } 
    } 
} 
+0

http://stackoverflow.com/questions/9957218/use-facebook-login-in-localhost – Vickel

+0

tôi sử dụng một máy chủ ảo với một TLD, vì vậy tên miền cục bộ của tôi là www.example-local.net – eskimo

+0

Chỉ cần kiểm tra Tôi cũng ở cổng 80. Vì vậy, đó không phải là vấn đề. – eskimo

Trả lời

0

trong giao diện sử dụng $this->facebook->session thay vì $this->session và nó sẽ làm việc;)

+0

Cảm ơn. Đây không phải là vấn đề, trong chế độ xem '$ this-> session' đang hoạt động (tôi đã cập nhật câu hỏi để cho biết tôi không thực sự sử dụng nó trong khung nhìn nhưng nó chỉ là để kiểm tra nếu nó trả về true) . Vấn đề là '$ this-> session' không hoạt động trong thư viện. – eskimo

3

Thư viện bạn đang sử dụng là bên ngoài đến core CodeIgniter codebase và do đó không thể giao tiếp với các hàm gốc theo cách thông thường; thay vì sử dụng $this như bạn tham chiếu đến dụ CodeIgniter, trong thư viện của bạn, bạn nên sử dụng $this->ci như vậy để truy cập dữ liệu phiên, mã của bạn sẽ giống như thế:

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

này được giải thích chi tiết hơn trong các tài liệu CodeIgniter here

+1

Nó vẫn không hoạt động nếu tôi thay thế tất cả các phiên bản '$ this-> session' bằng' $ this-> ci-> session' trong thư viện Facebook.php. Nếu tôi làm điều này cũng xảy ra là 'if ($ this-> session)' trong khung nhìn trả về false, trong khi nếu tôi giữ mã thư viện Facebook.php như bây giờ (như trong bài viết của tôi), nó trả về true trong lượt xem. – eskimo