2010-09-18 28 views
0

刚刚接触Facebook开发人员,并试图完成这项小工作。我一直在使用PHP-SDK进行身份验证。Facebook OAuth根据存储的会话检索信息

我用下面的代码来访问

<?php 

require '../src/facebook.php'; 
Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false; 
Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2; 


// Create our Application instance (replace this with your appId and secret). 
$facebook = new Facebook(array(
    'appId' => 'xxx', 
    'secret' => 'xxx', 
    'cookie' => true, 
)); 





// We may or may not have this data based on a $_GET or $_COOKIE based session. 
// 
// If we get a session here, it means we found a correctly signed session using 
// the Application Secret only Facebook and the Application know. We dont know 
// if it is still valid until we make an API call using the session. A session 
// can become invalid if it has already expired (should not be getting the 
// session back in this case) or if the user logged out of Facebook. 
$session = $facebook->getSession(); 

$me = null; 
// Session based API call. 
if ($session) { 
    try { 
    $uid = $facebook->getUser(); 
    $me = $facebook->api('/me'); 
    } catch (FacebookApiException $e) { 
    error_log($e); 
    } 
} 

// login or logout url will be needed depending on current user state. 
if ($me) { 
    $logoutUrl = $facebook->getLogoutUrl(); 
} else { 
    //$loginUrl = $facebook->getLoginUrl(); 
    $loginUrl = $facebook->getLoginUrl(array('ext_perm' => 'offline_access'); 
} 

// This call will always work since we are fetching public data. 
$naitik = $facebook->api('/naitik'); 

?> 
<!doctype html> 
<html xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <head> 
    <title>php-sdk</title> 
    <style> 
     body { 
     font-family: 'Lucida Grande', Verdana, Arial, sans-serif; 
     } 
     h1 a { 
     text-decoration: none; 
     color: #3b5998; 
     } 
     h1 a:hover { 
     text-decoration: underline; 
     } 
    </style> 
    </head> 
    <body> 
    <!-- 
     We use the JS SDK to provide a richer user experience. For more info, 
     look here: http://github.com/facebook/connect-js 
    --> 
    <div id="fb-root"></div> 
    <script> 
     window.fbAsyncInit = function() { 
     FB.init({ 
      appId : '<?php echo $facebook->getAppId(); ?>', 
      session : <?php echo json_encode($session); ?>, // don't refetch the session when PHP already has it 
      status : true, // check login status 
      cookie : true, // enable cookies to allow the server to access the session 
      xfbml : true // parse XFBML 
     }); 

     // whenever the user logs in, we refresh the page 
     FB.Event.subscribe('auth.login', function() { 
      window.location.reload(); 
     }); 
     }; 

     (function() { 
     var e = document.createElement('script'); 
     e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; 
     e.async = true; 
     document.getElementById('fb-root').appendChild(e); 
     }()); 
    </script> 


    <h1><a href="example.php">php-sdk</a></h1> 

    <?php if ($me): ?> 
    <a href="<?php echo $logoutUrl; ?>"> 
     <img src="http://static.ak.fbcdn.net/rsrc.php/z2Y31/hash/cxrz4k7j.gif"> 
    </a> 
    <?php else: ?> 
    <div> 
     Using JavaScript &amp; XFBML: <fb:login-button></fb:login-button> 
    </div> 
    <div> 
     Without using JavaScript &amp; XFBML: 
     <a href="<?php echo $loginUrl; ?>"> 
     <img src="http://static.ak.fbcdn.net/rsrc.php/zB6N8/hash/4li2k73z.gif"> 
     </a> 
    </div> 
    <?php endif ?> 

    <h3>Session</h3> 
    <?php if ($me): ?> 
    <pre><?php print_r($session); ?></pre> 

    <h3>You</h3> 
    <img src="https://graph.facebook.com/<?php echo $uid; ?>/picture"> 
    <?php echo $me['name']; ?> 

    <h3>Your User Object</h3> 
    <pre><?php print_r($me); ?></pre> 
    <?php else: ?> 
    <strong><em>You are not Connected.</em></strong> 
    <?php endif ?> 

    <h3>Naitik</h3> 
    <img src="https://graph.facebook.com/naitik/picture"> 
    <?php echo $naitik['name']; ?> 
    </body> 
</html> 

上午存储会话的序列化的数据,所以我可以使用它以后访问壁进料。在下面的代码中,我检索会话并使用API​​中的set_session来设置现有会话。

<?php 

require '../src/facebook.php'; 
require 'DBFunctions.php'; 

Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYPEER] = false; 
Facebook::$CURL_OPTS[CURLOPT_SSL_VERIFYHOST] = 2; 


// Create our Application instance (replace this with your appId and secret). 
$facebook = new Facebook(array(
    'appId' => 'xxx', 
    'secret' => 'xxx', 
    'cookie' => true, 
)); 




// We may or may not have this data based on a $_GET or $_COOKIE based session. 
// 
// If we get a session here, it means we found a correctly signed session using 
// the Application Secret only Facebook and the Application know. We dont know 
// if it is still valid until we make an API call using the session. A session 
// can become invalid if it has already expired (should not be getting the 
// session back in this case) or if the user logged out of Facebook. 
//$session = $facebook->getSession(); 
$session = $facebook->setSession(unserialize(Retrieve_Session(2))); 






$me = null; 
// Session based API call. 
if ($session) { 
    try { 
    $uid = $facebook->getUser(); 
    $me = $facebook->api('/me'); 
    } catch (FacebookApiException $e) { 
    error_log($e); 
    } 
} 

// login or logout url will be needed depending on current user state. 
if ($me) { 
    $logoutUrl = $facebook->getLogoutUrl(); 
} else { 
    $loginUrl = $facebook->getLoginUrl(); 
} 


print_r(unserialize(Retrieve_Session(2))); 
?> 
<!doctype html> 
<html xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <head> 
    <title>php-sdk</title> 
    <style> 
     body { 
     font-family: 'Lucida Grande', Verdana, Arial, sans-serif; 
     } 
     h1 a { 
     text-decoration: none; 
     color: #3b5998; 
     } 
     h1 a:hover { 
     text-decoration: underline; 
     } 
    </style> 
    </head> 
    <body> 
    <h1><a href="example.php">php-sdk</a></h1> 

    <?php if ($me): ?> 
    <a href="<?php echo $logoutUrl; ?>"> 
     <img src="http://static.ak.fbcdn.net/rsrc.php/z2Y31/hash/cxrz4k7j.gif"> 
    </a> 
    <?php else: ?> 
    <div> 

    </div> 
    <div> 
     Without using JavaScript &amp; XFBML: 
     <a href="<?php echo $loginUrl; ?>"> 
     <img src="http://static.ak.fbcdn.net/rsrc.php/zB6N8/hash/4li2k73z.gif"> 
     </a> 
    </div> 
    <?php endif ?> 

    <h3>Session</h3> 
    <?php if ($me): ?> 
    <pre><?php print_r($session); ?></pre> 

    <h3>You</h3> 
    <img src="https://graph.facebook.com/<?php echo $uid; ?>/picture"> 
    <?php echo $me['name']; ?> 

    <h3>Your User Object</h3> 
    <pre><?php print_r($me); ?></pre> 
    <?php else: ?> 
    <strong><em>You are not Connected.</em></strong> 
    <?php endif ?> 

    </body> 
</html> 

上面的代码将无法正常工作,并会显示登录屏幕,虽然我已通过会话的非中心化数据。任何想法我怎么能解决这个问题?

P.S我将应用程序设置更改为“本机应用程序”,因为我在某处读取它将处理恢复会话而无需重新记录。

请指教?

回答

0

我不是专家,但所有我见过的使用offline_access的例子都要求使用“req_perms”字段。这是一个简单的逗号分隔的许可你想要的清单...

array('req_perms' => "publish_stream,offline_access,user_status,read_stream,email");