从标签页检索签名的请求数据时,Facebook PHP SDK“缺少OAuth数据”异常

时间:2014-05-28 21:48:31

标签: facebook-graph-api facebook-php-sdk

我在自己的网络应用程序中使用Facebook应用程序与用户的帐户和页面进行交互。

现在,我正在为用户的页面添加标签,并且我正在使用单独的FB应用程序(因为我希望在同一页面上有多个标签,FB只允许每个应用程序一个) 。我可以添加一个标签,我在测试页面上看到它的链接,这样就可以了。

当我访问选项卡时,问题就开始了。标签页中的iframe向我的应用程序发出POST请求到正确的URL,但是当我尝试获取有关该页面的信息时,我得到一个例外:

exception 'Facebook\FacebookSDKException' with message 'Invalid signed request, missing OAuth data.' in /myprojectpath/vendor/facebook/php-sdk-v4/src/Facebook/FacebookSession.php:343

我在撰写本文时使用了最新版本的PHP PHP SDK(4.0.6),而且令人困惑的代码是:

FacebookSession::setDefaultApplication($my_app_id, $my_app_secret);
$session = FacebookSession::newSessionFromSignedRequest($_POST['signed_request']);

我知道这个问题:https://github.com/facebook/facebook-php-sdk-v4/issues/14 我已经在使用4.0.6版了,所以这不应该是问题所在。此外,我的观点正是我不想或不需要将用户重定向到登录页面,因为我不希望用户只需登录才能看到页面标签。

我错过了什么?

1 个答案:

答案 0 :(得分:0)

newSessionFromSignedRequest功能仅在用户已登录选项卡应用程序时才起作用。如果会话不存在,您将需要要求用户登录。

尝试这样的事情:

// redirect.php should redirect the user back to the Facebook Page
$helper = new FacebookRedirectLoginHelper( 'http://yourwebsite.com/redirect.php' );

try {
  // try to get the page session
  $session = FacebookSession::newSessionFromSignedRequest( $_POST['signed_request'] );
} catch( FacebookRequestException $ex ) {
  // When Facebook returns an error
} catch( Exception $ex ) {
  // When validation fails or other local issues
}

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

  // print logged-in user's ID
  print_r( $session->getSessionInfo()->asArray()['user_id'] );

  // print logout url using session
  echo '<a href="' . $helper->getLogoutUrl( $session, 'http://yourwebsite.com/logout.php' ) . '">Logout</a>';

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