简体   繁体   中英

Javascript Login Helper CodeIgniter - cant retrieve user server-side

I'm using CodeIgniter, I've installed Facebook SDK 4. I had to do this with inclusion of files, because autoload didn't work. I'm using Javascript to login user.

This is facebook.php (in library-root). I have facebook to autoload in config.

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

// Autoload the required files
require_once( APPPATH.'libraries/Facebook/FacebookSession.php' );
require_once( APPPATH.'libraries/Facebook/FacebookRequest.php' );
require_once( APPPATH.'libraries/Facebook/FacebookResponse.php' );
require_once( APPPATH.'libraries/Facebook/FacebookSDKException.php' );
require_once( APPPATH.'libraries/Facebook/FacebookRequestException.php' );
require_once( APPPATH.'libraries/Facebook/FacebookAuthorizationException.php' );
require_once( APPPATH.'libraries/Facebook/GraphObject.php' );
require_once( APPPATH.'libraries/Facebook/FacebookSignedRequestFromInputHelper.php' );
require_once( APPPATH.'libraries/Facebook/FacebookJavaScriptLoginHelper.php' );


use Facebook\FacebookJavaScriptLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookSession;

class Facebook {
    var $ci;
    var $permissions;


  public function __construct() {

    $this->ci =& get_instance();
    $this->permissions = $this->ci->config->item('permissions', 'facebook');

    // Initialize the SDK
    $this->ci->config->load('facebook');
    FacebookSession::setDefaultApplication( $this->ci->config->item('api_id', 'facebook'), $this->ci->config->item('app_secret', 'facebook') );

    $helper = new FacebookJavaScriptLoginHelper(); //This row gives me a blank "white page" and no errror is given, nothing in log or whatsoever.
    try {

        $session = $helper->getSession();
    } catch(FacebookRequestException $ex) {
        // When Facebook returns an error
    } catch(\Exception $ex) {
        // When validation fails or other local issues
    }
    if ($session !== null) {
        $request = new FacebookRequest( $session, 'GET', '/me' )->execute();
        $user = $request->getGraphObject()->asArray();
    }
    else {
        echo 'no user';
    }

 }




}

Why do I get no user all the time? $session always is null even if I'm logged in. I'm sure that appid and secret is correct.

UPDATE

I WAS sure that appid and secret was correct, but I was wrong... But now I get a another problem. When I try to create FacebookJavascriptLoginHelper () some kind of exception is made. I just get a blank page. What could this be? (When I'm not logged in it shows the website as normal.

I've tried to log errors but I don't get any errors at alla in my logfiles. (I've set that to log alla erorrs in config)

My susspicion is that a file isn't found that is needed. I've tried using the autoload routine as documented at: http://www.benmarshall.me/facebook-sdk-php-v4-codeigniter/ but I couldn't get that to work (none of these fb-files were included). Then no file were included.

UPDATE2 I've understand you really should use Composer for autoloading Facebook files correctly.

I gave it a try: Based on this. All I would have to is add an entry to composer.json https://developers.facebook.com/docs/php/gettingstarted/4.0.0

When I have this: (I've downloaded file from https://github.com/facebook/facebook-php-sdk-v4/archive/master.zip )

{
    "name": "facebook/php-sdk-v4",
    "description": "Facebook SDK for PHP",
    "keywords": ["facebook", "sdk"],
    "type": "library",
    "homepage": "https://github.com/facebook/facebook-php-sdk-v4",
    "license": "Facebook Platform",
    "authors": [
        {
            "name": "Facebook",
            "homepage": "https://github.com/facebook/facebook-php-sdk-v4/contributors"
        }
    ],
    "require": {
        "php": ">=5.4.0",
        "ext-mbstring": "*"
    },
    "require-dev": {
        "phpunit/phpunit": "~4.0",
        "mockery/mockery": "~0.8",
        "guzzlehttp/guzzle": "~4.0"
    },
    "suggest": {
        "guzzlehttp/guzzle": "Allows for implementation of the Guzzle HTTP client"
    },
    "autoload": {
        "psr-4": {
            "Facebook\\": "src/Facebook/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Facebook\\Tests\\": "tests/"
        }
    },
    "extra": {
        "branch-alias": {
            "dev-master": "4.1.x-dev"
        }
    }
}

It works to enter composer install in command window (Windows) and vendor folder inside my libraries folder is created and it looks correct.

BUt when I add "facebook/php-sdk-v4" : "4.0.*" to Require-section:

"require": {
        "php": ">=5.4.0",
        "ext-mbstring": "*",
        "facebook/php-sdk-v4" : "4.0.*"
    },

I get this error (from composer): The request package Facebook facebook/php-sdk-v4 could not be found in any verision.

UPDATE3 Now I've managed to download Facebook SDK from Composer, but still I can't manage to the autoload to work. I hade to able to this adjustment to download facebook sdk from composer.

{
  "minimum-stability": "dev",
  "require" : {
    "facebook/php-sdk-v4" : "4.0.*"
  }
}

I've given up the autoload, cause I'm not able to get it to work in that way. But I got it to work now!!!!

I've installed Composer (having WAMP you need to change openssl to be available in the PHP-ini in the php-folder (there are two php-ini files for wamp)

I created a file in the libraries folder of my CI application

composer.json
{
  "minimum-stability": "dev",
  "require" : {
    "facebook/php-sdk-v4" : "4.0.*"
  }
}

and then composer install in command prompt.

I moved the src/facebook-folder to libraries/facebook (with all Facebook classes from the SDK). ( https://www.webniraj.com/2014/06/07/facebook-api-setting-up-the-facebook-php-sdk-4-0-x/ )

And then creating a Facebook.php (in root libraries) like this:

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

// Autoload the required files
require_once( 'Facebook/HttpClients/FacebookHttpable.php' );
require_once( 'Facebook/HttpClients/FacebookCurl.php' );
require_once( 'Facebook/HttpClients/FacebookCurlHttpClient.php' );

require_once( 'Facebook/Entities/AccessToken.php' );
require_once( 'Facebook/Entities/SignedRequest.php' );

require_once( 'Facebook/FacebookSession.php' );
require_once( 'Facebook/FacebookRedirectLoginHelper.php' );
require_once( 'Facebook/FacebookSignedRequestFromInputHelper.php' );
require_once( 'Facebook/FacebookJavaScriptLoginHelper.php' );

require_once( 'Facebook/FacebookRequest.php' );
require_once( 'Facebook/FacebookResponse.php' );
require_once( 'Facebook/FacebookSDKException.php' );
require_once( 'Facebook/FacebookRequestException.php' );
require_once( 'Facebook/FacebookOtherException.php' );
require_once( 'Facebook/FacebookAuthorizationException.php' );
require_once( 'Facebook/GraphObject.php' );
require_once( 'Facebook/GraphSessionInfo.php' );

use Facebook\HttpClients\FacebookHttpable;
use Facebook\HttpClients\FacebookCurl;
use Facebook\HttpClients\FacebookCurlHttpClient;

use Facebook\Entities\AccessToken;
use Facebook\Entities\SignedRequest;

use Facebook\FacebookSession;
use Facebook\FacebookRedirectLoginHelper;
use Facebook\FacebookJavaScriptLoginHelper;
use Facebook\FacebookRequest;
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;
use Facebook\FacebookRequestException;
use Facebook\FacebookOtherException;
use Facebook\FacebookAuthorizationException;
use Facebook\GraphObject;
use Facebook\GraphSessionInfo;

class Facebook {
    var $ci;
    var $permissions;


  public function __construct() {

    $this->ci =& get_instance();
    $this->permissions = $this->ci->config->item('permissions', 'facebook');

    // Initialize the SDK
    $this->ci->config->load('facebook');
    FacebookSession::setDefaultApplication( $this->ci->config->item('api_id', 'facebook'), $this->ci->config->item('app_secret', 'facebook') );

    //Get info based on javascript popup session
    $helper = new FacebookJavaScriptLoginHelper(); 

    //If token not already set, then try to fetch session from current FB Login!
    //
    if ( !$this->ci->session->userdata('fb_token') ) {
        try {
            $session = $helper->getSession();
        } catch(FacebookRequestException $ex) {
            // When Facebook returns an error
            log_message('INFO', 'FB ERROR' . print_r($ex,true));
        } catch(\Exception $ex) {
            // When validation fails or other local issues
            log_message('INFO', 'FB VALIDATION FAILS' . print_r($ex,true));
        }    
    }
    else {
        //FB Token already set. Then fetch user information based on token!
         $fb_token = $this->ci->session->userdata('fb_token');         
         $session = new FacebookSession( $fb_token );        
    }    

    //Now session is set by current logged in session or by current token set
    //(Session is retrieved from FB)
    if (isset($session)) {            
            $this->ci->session->set_userdata( 'fb_token', $session->getToken() );             
            $request = new FacebookRequest( $session, 'GET', '/me' );
            $response = $request->execute();
            $user = $response->getGraphObject()->asArray();
    }

 }




}

I got it to work without having any errors. You can't just try to do a login-check everytime because then FB would return an (annoying ) error. Therefore I store the token recieved in session after first login. Second time (and beyond).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM