2011-07-22 12 views
1

私は自分の友人にリクエストを送ることができるアプリでリクエストダイアログを使用します。ユーザーがリクエストを送信すると、ユーザーページに投稿するページにアプリをリダイレクトします。私はaccess_tokenは取得するには、以下のコードを使用します。Facebook access_token problem

$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アクセストークンの署名を。

答えて

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. 
    } 

} 

?> 
+0

どうもありがとう、それは –

+0

私の人生が容易になり問題ありませんメイト、それはあなたを助けて喜ん:) –

1

あなたは現在のユーザーではなく、アプリ全体のアクセストークンを提供する&grant_type=client_credentialsを使用しています。現在のユーザーのアクセストークンを取得するには、同じURLに同じURLをリダイレクトする必要がありますが、&grant_type=client_credentialsがないと、Facebookはredirect_uriにリダイレクトして、必要なaccess_tokenを送信します。また、Javascript SDKを使用して、リダイレクトせずにポップアップウィンドウからアクセストークンを取得することもできます。ここで

はJS SDKなしリダイレクトで認証する方法については、別の質問へのリンクです: Facebook Authentication Without Redirect?あなたがそこになってきてやっている

2

私はあなたが...それはそのようにリクエストをやってOKかもしれない認証しようとしている方法を正確にわからないんだけど、私が使用する方法は、ここで説明ですユーザーをFacebookページにリダイレクトして、許可を受け入れるようにします。彼は受け入れたら、彼は

例リダイレクト..あなたは、あなたが必要なaccess_tokenは本物を入手するために、サーバー側の要求を実行する必要がcode=### GET引数で、指定したURLにリダイレクトされますURL:

$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; 

を取得してみてください(あなたはまた、手でこれを確認することができます)

EDIT

倍増彼のストリームにpublishiするために、ユーザーからいくつかのより多くのアクセス許可。したがって、最初の(ユーザー認証)URLにscope=publish_streamを追加するアクセス許可を求めます。