PHP SDK:登录API无法正常工作

时间:2015-01-09 00:32:03

标签: php facebook facebook-graph-api

我正在使用Facebook的PHP SDK将Facebook登录集成到我的网站。系统正在提示进行Facebook登录。但是,FB会话变量不是一次FB登录成功。

特别是:$_SESSION['fb_token']未设置

$session = $helper->getSessionFromRedirect(); is NULL

任何想法,如果我遗失了什么?

以下是我正在使用的代码:

session_start();
require_once('includes/facebook/src/Facebook/HttpClients/FacebookHttpable.php');
require_once('includes/facebook/src/Facebook/HttpClients/FacebookCurl.php');
require_once('includes/facebook/src/Facebook/HttpClients/FacebookCurlHttpClient.php');

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

require_once('includes/facebook/src/Facebook/FacebookSession.php');
require_once('includes/facebook/src/Facebook/FacebookRedirectLoginHelper.php');
require_once('includes/facebook/src/Facebook/FacebookRequest.php');
require_once('includes/facebook/src/Facebook/FacebookResponse.php');
require_once('includes/facebook/src/Facebook/FacebookSDKException.php');
require_once('includes/facebook/src/Facebook/FacebookRequestException.php');
require_once('includes/facebook/src/Facebook/FacebookOtherException.php');
require_once('includes/facebook/src/Facebook/FacebookAuthorizationException.php');
require_once('includes/facebook/src/Facebook/GraphObject.php');
require_once('includes/facebook/src/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\FacebookRequest;
use Facebook\FacebookResponse;
use Facebook\FacebookSDKException;
use Facebook\FacebookRequestException;
use Facebook\FacebookOtherException;
use Facebook\FacebookAuthorizationException;
use Facebook\GraphObject;
use Facebook\GraphSessionInfo;


$app_id = get_config('facebook_app_id');
$app_secret = get_config('facebook_secret_key');

FacebookSession::setDefaultApplication($app_id, $app_secret);

$redirect_url = 'http://mywebsite.com/home.php?msg_ok=Thanks';

$helper = new FacebookRedirectLoginHelper($redirect_url);


// see if a existing session exists
if ( isset( $_SESSION ) && isset( $_SESSION['fb_token'] ) ) {
    // create new session from saved access_token
    $session = new FacebookSession( $_SESSION['fb_token'] );

    // validate the access_token to make sure it's still valid
    try {
        if ( !$session->validate() ) {
            $session = null;
        }
    } catch ( Exception $e ) {
        // catch any exceptions
        $session = null;
    }
}  

if ( !isset( $session ) || $session === null ) {
    // no session exists

    try 
    {
        $session = $helper->getSessionFromRedirect();
    } 
    catch( FacebookRequestException $ex ) 
    {
        // When Facebook returns an error
        // handle this better in production code
        print_r( $ex );
    } catch( Exception $ex ) {
        // When validation fails or other local issues
        // handle this better in production code
        print_r( $ex );
    }

}


// see if we have a session
if ( isset( $session ) ) {


    // save the session
    $_SESSION['fb_token'] = $session->getToken();
    // create a session using saved token or the new one we generated at login
    $session = new FacebookSession( $session->getToken() );

    // graph api request for user data
    $request = new FacebookRequest( $session, 'GET', '/me');
    $response = $request->execute();

    // get response
    $graphObject = $response->getGraphObject()->asArray();

    var_dump($graphObject);

    // print profile data
    echo '<pre>'. print_r( $graphObject, 1 ) . '</pre>';

    // print logout url using session and redirect_uri (logout.php page should destroy the session)
    echo '<a href="'. $helper->getLogoutUrl( $session, $redirect_url ) . '">Logout</a>';

} 
else 
{
    // show login url
    //$scope = array('email,publish_stream,user_birthday,user_photos,friends_photos','user_friends');
    $scope = array('email','user_friends');
    //echo '<a href="'. $helper->getLoginUrl( array( 'email', 'user_friends') ) . '">Login</a>';
    echo '<a href="'. $helper->getLoginUrl($scope) . '">Login</a>';
}

1 个答案:

答案 0 :(得分:1)

刚才写了简单的facebook api片段,它将帮助你理解Facebook API。

首先尝试以下代码,然后了解代码,内联注释将对您有所帮助。在运行代码之前,请确保使用composer下载SDK并添加Facebook Application详细信息。

以下是代码:

// Starting the session
session_start();

// Including composer autoload file..make sure to alter directory address according to you
include_once "vendor/autoload.php";

// Facebook App Configs
define("FB_APP_ID", "YOUR_FB_APP_ID_HERE");
define("FB_APP_SECRET", "YOUR_FB_APP_SECRET_HERE");
define("FB_APP_REDIRECT", "YOUR_FB_REDIRECT_URL_HERE");

// Setting details default app & redirect URL
Facebook\FacebookSession::setDefaultApplication(FB_APP_ID, FB_APP_SECRET);
$fb = new Facebook\FacebookRedirectLoginHelper(FB_APP_REDIRECT);


// Trying to get user token
try {
    if($session = $fb->getSessionFromRedirect()) {
        $_SESSION["fb_token"] = $session->getToken();
        header("Location: index.php");
        exit(0);
    }
} catch(Facebook\FacebookRequestException $e) {
    die($e->getMessage());
} catch(\Exception $e) {
    die($e->getMessage());
}

// Using token which is stored in local Session.
if(isset($_SESSION['fb_token'])) {
    // Getting user session with Token
    $uSession = new Facebook\FacebookSession($_SESSION['fb_token']);

// Making a graph API request
$user = (new Facebook\FacebookRequest(
    $uSession, 'GET', '/me'
))->execute()
  ->getGraphObject(Facebook\GraphUser::className())->asArray();

  // print_r($user);

echo <<<userProfile
    <table>
        <tbody>
userProfile;

foreach($user as $key => $value) {
    echo <<<userProfile
        <tr>
            <td>{$key}</td>
            <td>{$value}</td>
        </tr>
userProfile;
}

echo <<<userProfile
    </tbody>
</table>
<a href="?logout">Logout</a>
<hr />
userProfile;
}


// Settings scope/permissions
$login_url = $fb->getLoginUrl(array(
    'scope' => 'user_birthday,user_about_me,user_website,read_stream,publish_stream,publish_actions,manage_pages,email,user_checkins',
));

// Login link
if(!isset($_SESSION["fb_token"])) {
    echo '<a href="' . $login_url . '">Login with Facebook</a>';
}

// Logout code block
if(isset($_SESSION["fb_token"], $_GET['logout'])) {
    unset($_SESSION['fb_token']);
    header("Location: index.php");
    exit(0);
}

另外,为了参考,您可以查看文档:{​​{3}}
您还可以查看使用Facebook API的视频教程:here