2015-01-09 82 views
0

我使用Facebook的PHP SDK将Facebook登录集成到我的网站。系统正在提示Facebook登录。但是,一旦FB登录成功,FB会话变量就不会成功。PHP SDK:登录API不起作用

特别是:$_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

刚才写了简单的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); 
} 

也可对照你可以检查出的文档:here
你也可以检查与Facebook API的视频教程:here

+0

感谢阿什温尽管如此,我并没有使用你的确切代码,它的确帮助我理解了API集成。 – Kiran

+0

欢迎您!快乐编码;) –