Facebook access_token问题

时间:2011-07-22 08:00:01

标签: php facebook access-token

我在我的应用中使用请求对话框,用户可以向他们的朋友发送请求。用户发送请求后,我会将应用程序重定向到用户页面上发布的页面。我使用下面的代码来获取access_token:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://graph.facebook.com/oauth/access_token?client_id='.APP_ID.'&client_secret='.APP_SECRET.'&redirect_uri=http://www.facebook.com/pages/Cosmetics/167231286678063?sk=app_233227910028874&grant_type=client_credentials');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST,0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER,0);

$token = curl_exec($ch);

$me = $facebook->api('/me?'.$token);

但是当我尝试在墙上发布时,它会显示以下错误:

致命错误:未捕获OAuthException:无效的OAuth访问令牌签名。

4 个答案:

答案 0 :(得分:2)

我不确定您是如何尝试进行身份验证的。可能会以某种方式执行请求,但我使用的方法是此处记录的方法:http://developers.facebook.com/docs/authentication/

也就是说,您首先将用户重定向到Facebook页面以使其接受权限。一旦他接受,他就会被重定向到你提供的URL,你需要一个code=### get参数来执行服务器端请求,以获得你需要的真正access_token ..

示例重定向网址:

$my_url = 'http://www.example.com';
"http://www.facebook.com/dialog/oauth?client_id=". $app_id ."&redirect_uri=". urlencode($my_url);

然后,当用户点击“接受”时,他会被重定向到,例如

http://www.example.com?code=ABCDEF

然后,在服务器端,你需要让access_token进行这样的调用:

"https://graph.facebook.com/oauth/access_token?"
   . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
   . "&client_secret=" . $app_secret . "&code=" . $code;

然后仔细检查该调用中返回的文本,并尝试获取

"https://graph.facebook.com/me?access_token=". $access_token;

(您也可以手动检查)

修改

此外,您可能需要用户的一些更多权限才能在他的流上发布。因此,请求将scope=publish_stream获取权限添加到第一个(用户授权)URL。

答案 1 :(得分:1)

您正在使用&grant_type=client_credentials,它为您的应用提供了一个访问令牌,而不是您当前的用户。要获取当前用户的访问令牌,您需要将其重定向到相同的网址,但没有&grant_type=client_credentials,然后Facebook会将它们重定向回您的redirect_uri并发送您需要的access_token。或者,您可以使用Javascript SDK通过弹出窗口获取访问令牌,而无需重定向。

以下是有关如何使用JS SDK进行身份验证且无重定向的另一个问题的链接:Facebook Authentication Without Redirect?

答案 2 :(得分:1)

为什么不使用PHP SDK 3.0.1?

如果您使用facebook提供的sdk,这很容易,这是使用php sdk 3.0.1进行身份验证的示例:

<?php

// Requires Facebook PHP SDK 3.0.1: https://github.com/facebook/php-sdk/
require ('facebook.php');

define('FACEBOOK_APP_ID',"YOUR-APP-ID-HERE");
define('FACEBOOK_SECRET',"YOUR-APP-API-SECRET-HERE");
define('REDIRECT_URI',"YOUR-REDIRECT-URL-HERE");
define('PERMISSIONS_REQUIRED', "publish_stream,user_photos");
$user = null;

$facebook = new Facebook(array(
    'appId' => FACEBOOK_APP_ID,
    'secret' => FACEBOOK_SECRET,
    'cookie' => true
));

$user = $facebook->getUser(); // Get the UID of the connected user, or 0 if the Facebook user is not connected.

if($user == 0) {
    // If the user is not connected to your application, redirect the user to authentication page
    /**
     * Get a Login URL for use with redirects. By default, full page redirect is
     * assumed. If you are using the generated URL with a window.open() call in
     * JavaScript, you can pass in display=popup as part of the $params.
     * 
     * The parameters:
     * - redirect_uri: the url to go to after a successful login
     * - scope: comma separated list of requested extended perms
     */

    $login_url = $facebook->getLoginUrl($params = array('redirect_uri' => REDIRECT_URI,'scope' => PERMISSIONS_REQUIRED));

    echo ("<script> top.location.href='".$login_url."'</script>");

} else {
    // if the user is already connected, then fetch access_token and user's information or show some content to logged in user.
    try
    {
        $access_token = $facebook->getAccessToken(); // Gives you current user's access_token

        $user = $facebook->api('/me'); // Gets User's information based on permissions the user has granted to your application.

    } catch(FacebookApiException $e){
        $results = $e->getResult();
        // Print results if you want to debug.
    }

}

?>

答案 3 :(得分:0)

你正在做的是获得application access token

  

App Login允许您为自己采取各种管理操作   应用,例如检索数据洞察数据或批准请求。图API   需要app访问令牌的调用在API中清楚地表示   参考

您需要的是user access token,其中permissions为{{3}},在您的情况下为publish_stream