OAuth(Facebook App)的验证问题,会话不可用?

时间:2011-02-17 08:52:53

标签: php facebook facebook-graph-api

我想阅读当前用户的所有朋友的生日。我使用facebook的新Graph API。我根据Facebook insights examplephp-sdk example请求授权(read_friendslistfriends_birthday)。为了阅读好友列表和用户详细信息,我使用了带有PHP PHP SDK的Graph API。

即将发布的代码片段是我的方法的一个简短的自包含正确的示例。如果我尝试使用我的应用程序,它会请求登录,然后请求权限,然后由于没有会话可用而无法打印我的所有朋友。这有什么不对?

首先是以下birthday.php使用的index.php,我删除了一些样板代码或代码,我认为它不会导致此问题(由[...]标识)。您可以在此问题的最后找到完整的代码。

<?php
function get_birthday_of_friends() {

    $fbconfig['appid' ]  = "MY_APP_ID";
    $fbconfig['secret']  = "MY_APP_SECRET";

    try{
            include_once "facebook/src/facebook.php";
    }
    catch(Exception $o){
             // [...] log error
    }
    // Create our Application instance.
    $facebook = new Facebook(array(
      'appId'  => $fbconfig['appid'],
      'secret' => $fbconfig['secret'],
      'cookie' => true,
    ));

    $session = $facebook->getSession();

    $fbme = null;
    // Session based graph API call.
    if ($session) {
               // [...] return birthdays
    } else {
        echo "No session found";
    }
}
?>

所需的lib.php见解示例相同

<?php

    // [...] Include and define app-id etc.

function get_access_token($base_url) {
  if (isset($_REQUEST['access_token'])) {
    return $_REQUEST['access_token'];
  }
  $params = array();
  $params['client_id'] = APP_ID;
  $params['redirect_uri'] = $base_url;
  if (!isset($_REQUEST['code'])) {
    $params['scope'] = 'read_friendlists, friends_birthday';
    $url = FacebookMethods::getGraphApiUrl('oauth/authorize', $params);
    throw new RedirectionException($url);
  } else {
    $params['client_secret'] = APP_SECRET;
    $params['code'] = $_REQUEST['code'];
    $url = FacebookMethods::getGraphApiUrl('oauth/access_token');
    $response = FacebookMethods::fetchUrl($url, $params);
    $response = strstr($response, 'access_token=');
    $result = substr($response, 13);
    $pos = strpos($result, '&');
    if ($pos !== false) {
      $result = substr($result, 0, $pos);
    }
    return $result;
    }
}

    // [...] Call get_access_token() and get_birthday_of_friends()!
?>
你可以帮帮我吗?我在pastebin.com上添加了整个源代码,如果这有助于您识别我的问题。 pastebin.com上的源代码为“index.php”和“birthday.php”。

提前谢谢!

3 个答案:

答案 0 :(得分:1)

我不确定您使用的方法是否已弃用,但我知道这是旧方法,您应该尝试使用新方法以获取身份验证令牌。

看一下这个链接: http://developers.facebook.com/docs/authentication/signed_request/

一目了然,你必须:

  • 从$ _REQUEST获取signed_request参数。
  • 使用提供的示例功能 解码后的链接一旦解码 它,你将有一个数组 有一个叫做的参数 oauth_token
  • 使用此参数,您可以启动 通过调用图表 将其附加到URL,例如
    * HTTPS:?//graph.facebook.com/PROFILE_ID/pictures/ =的access_token *组oauth_token

确保您的应用的配置设置已启用Oauth 2.0 for Canvas(高级标签页)。

答案 1 :(得分:0)

我认为在某些浏览器中存在第三方Cookie的问题。你在Safari测试吗?此外,尝试向loginUrl添加权限 - 它比使用oauth添加和请求权限更简单。

答案 2 :(得分:0)

如果没有可用的会话,我必须重定向到登录页面并要求具有参数的扩展权限。这对我来说很有把握,感谢manuelpedrera帮助我。

$facebook->getLoginUrl(array('req_perms' => 'read_friendlists, [...]'));