我正在使用CodeIgniter制作画布应用程序(这很重要),而不是Web应用程序。根据我的理解,这意味着我不必像传统的Facebook Connect应用程序那样将用户登录到登录URL。 Facebook应该处理这个问题。
但是,虽然我收到了完整的签名请求,但我无法获得会话。以下是我的代码:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;
use Facebook\FacebookCanvasLoginHelper;
class Welcome extends CI_Controller {
public function index()
{
FacebookSession::setDefaultApplication('303962883111629', '71b94393839fc34d2cfd43006791c5ca');
$helper = new FacebookCanvasLoginHelper();
try {
$session = $helper->getSession();
echo '<pre>';
print_r($helper);
echo '</pre>';
} catch(FacebookRequestException $e) {
// When Facebook returns an error
echo "Exception occured, code: " . $e->getCode();
echo " with message: " . $e->getMessage();
} catch(\Exception $e) {
// When validation fails or other local issues
echo "Exception occured, code: " . $e->getCode();
echo " with message: " . $e->getMessage();
}
if ($session) {
// Logged in
$me = (new FacebookRequest(
$session, 'GET', '/me'
))->execute()->getGraphObject(GraphUser::className());
echo '<pre>$me: '.print_r($me, true).'</pre>';
}
}
}
这会输出以下内容(出于显而易见的原因删除了一些值):
Facebook\FacebookCanvasLoginHelper Object
(
[signedRequest:protected] => Facebook\Entities\SignedRequest Object
(
[rawSignedRequest] => FmHcCuoY8lW9MXgqu5jQYrdzXQAhSC1GtCdPzeX**[partially-removed]**XNlciI6eyJjb3VudHJ5IjoiZ2IiLCJsb2NhbGUiOiJlbl9HQiIsImFnZSI6eyJtaW4iOjIxfX19
[payload] => Array
(
[algorithm] => HMAC-SHA256
[issued_at] => 1405023802
[user] => Array
(
[country] => gb
[locale] => en_GB
[age] => Array
(
[min] => 21
)
)
)
)
[appId:protected] => **[removed]**
[appSecret:protected] => **[removed]**
[state] =>
)
$session
已设置,但为NULL。
答案 0 :(得分:1)
在Canvas Facebook应用中,您需要让用户授权您的应用程序恢复其唯一标识符(以及其他一些内容)。
如果没有这个,用户就可以获得,如果他喜欢或不喜欢Canvas app所在的页面。就是这样。
是的,您需要它们登录您的应用程序,然后您才能访问其唯一标识符。否则你总会得到一个NULL答案。
我通常使用他们的Javascript SDK来启动画布应用程序中的登录弹出窗口,以便用户保持在相同的窗口中。
我希望这会对你有所帮助!