我在我的应用中使用请求对话框,用户可以向他们的朋友发送请求。用户发送请求后,我会将应用程序重定向到用户页面上发布的页面。我使用下面的代码来获取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访问令牌签名。
答案 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
。