Facebook api('/ me')没有验证

时间:2011-08-21 06:41:34

标签: php facebook facebook-php-sdk

我最近一直试图让我的应用程序使用PHP SDK 3.0并且在看到我实际登录时遇到了一些麻烦。我有来自3.1.1下载的“example.php”不承认我已登录。文件“with_js_sdk.php”也不承认我在你第一次运行时已登录。运行之后,然后该文件和“example.php”都会看到我已登录。一旦我退出,“example.php”不起作用,并且“with_js_sdk.php”在第一次失败运行,但所有后续运行的两个文件(以及我正在测试的其他一些文件)都将正确进行身份验证。如果不工作,所有文件都会显示“OAuthException”,并显示以下消息:“必须使用活动访问令牌来查询有关当前用户的信息。”即使我已登录。所以我的问题是,“with_js_sdk.php”中是否有我可以在其他文件中设置的内容?我猜它与我读过的那个文件中的“oauth:true”有关,虽然我不是Facebook编码专家,所以我不确定。我有一个iframe应用程序,所以我的应用程序中没有“FB.init”部分(顺便提一下,直到sdk发生变化)。这是我正在测试的最小代码,它给出了错误:

<?php

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

$facebook = new Facebook(array(
  'appId'  => '11111111111111111',
  'secret' => 'abcdefghijk etc...',
  'cookie'=>true
));

// See if there is a user from a cookie
$user = $facebook->getUser();

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
    $user = null;
  }
}
?>

getuser总是正确回来,但$ facebook-&gt; api('/ me')调用总是失败,直到我运行一个带有fbml的文件。在你问之前,是的,我改变了文件中的appID和秘密。感谢。

的Darryl

8 个答案:

答案 0 :(得分:6)

而不是me传递$user。例如:

$user_profile = $facebook->api('/'.$user);

答案 1 :(得分:3)

我遇到了同样的问题,遭遇时间最长,只需从https://github.com/facebook/php-sdk获取新的PHP SDK文件即可解决问题。

参考:http://developers.facebook.com/docs/reference/php/

答案 2 :(得分:1)

您是否尝试print_r($user_profile)看看会发生什么?此外,cookie参数不会与最新的SDK一起使用。

答案 3 :(得分:1)

你必须知道变量的范围,$ user_profile将只在你if语句的范围内,所以如果你想从外部范围访问它将不可用记住你总是可以在外面声明你的变量然后初始化它,这样它将通过你的php文件提供。

?php

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

$facebook = new Facebook(array(
  'appId'  => '11111111111111111',
  'secret' => 'abcdefghijk etc...',
  'cookie'=>true
));

// See if there is a user from a cookie
$user = $facebook->getUser();
$user_profile; // variable being declare outer scope
if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>';
    $user = null;
  }
}
?>

答案 4 :(得分:1)

这适用于我

$ user_profile = $ facebook-&gt; api('/'。$ user);

这是我的完整php fb连接脚本示例:`

$fbconfig['appid' ] = " id ";
$fbconfig['secret'] = " secret ";
$fbconfig['appBaseUrl'] =   "https://apps.facebook.com/ example /";

$user            =   null; //facebook user uid
try{
    include_once "facebook.php";
}
catch(Exception $o){
    echo '<pre>';
    print_r($o);
    echo '</pre>';
}
// Create our Application instance.
$facebook = new Facebook(array(
  'appId'  => $fbconfig['appid'],
  'secret' => $fbconfig['secret'],
  'cookie' => true,
));

//Facebook Authentication part
$user       = $facebook->getUser();

// We may or may not have this data based
// on whether the user is logged in.
// If we have a $user id here, it means we know
// the user is logged into
// Facebook, but we don’t know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.

$loginUrl   = $facebook->getLoginUrl(
        array(
            'scope'         => 'email,publish_stream,user_birthday,user_location,user_work_history,user_about_me,user_hometown'
        )
);

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $me = $facebook->api('/'.$user);
  } catch (FacebookApiException $e) {
    //you should use error_log($e); instead of printing the info on browser
    d($e);  // d is a debug function defined at the end of this file
    $user = null;
  }
}

if (!$user) {
    echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
    exit;
}

//get user basic description
$me = $facebook->api("/$user");

function d($d){
    echo '<pre>';
    print_r($d);
    echo '</pre>';
}

if (isset($_GET['code'])){
        header("Location: " . $fbconfig['appBaseUrl']);
        exit;
    }`

祝你有愉快的一天! :)

答案 5 :(得分:0)

当令牌无效时,启动身份验证流程。

另外,为了让jssdk与php sdk v3.x一起使用,请确保已升级js sdk代码以使用OAuth 2.0。

答案 6 :(得分:0)

你缺少某些东西。要拥有一个活动的访问令牌,你必须将它呈现在一个会话变量中。你甚至没有在你的代码中创建一个会话。 你必须首先获得访问权限 试试这个 - &gt; $access_token =$facebook->getAccessToken(); if ($user) { if( session_id() ) {} else {session_start();}

现在您应该存储$_SESSION['access_token']=$access_token ;以供日后使用。

答案 7 :(得分:0)

这听起来很荒谬。但是我遇到了同样的问题并用一个简单的循环修复它。

$i = 0;
while($i < 2)
{
    if($facebookId)
    {
        //CODE
    }

     $i++;
}

它确实有效D: