2012-02-29 11 views
3

私は、Graph APIを簡単に呼び出すために、PHP SDKバージョン3.1.1を使用しています。私はそれをローカルでhttp://local.fb-sandboxで実行しています。 Facebookのアプリケーション設定では、サイトURLがhttp://local.fb-sandbox/に設定されています。テストアプリケーションが無限のリダイレクトループになっているのはなぜですか?

私はhttp://local.fb-sandboxに行くが、アプリケーションは、その後のようなURLの間のリダイレクトループに入るとき、私は私の許可を要求してFacebookのログインページにリダイレクトし、ページにしています:

http://local.fb-sandbox/?state=e9c091bb61afe08139af4e3b153a1e9e&code=AQBDJ4yMWVOIrukx6nRkxhNbnPH9nX6OvuqOWhVJEAgLkq6Lz27iq_-B6AIAGQ_cOpBIZktCPLLs_G5Hpt8QO5PRhDUN8l-Yu3JuT0YTzwVQiAqBlgutgia60lRT-ZzE3IHguStHq4gtuPQYJh423TBer-mB8BsqERvNsoF1L4NNe90WAWU8--MFAU3Oc4eeXyI#_=_ 

https://www.facebook.com/dialog/oauth?client_id=375741229103324&redirect_uri=http%3A%2F%2Flocal.fb-sandbox%2F%3Fstate%3Dccd13778febb68d3eb1f4763a99b2ace%26code%3DAQBFegtkch4m34-2F9KMKgScrPhWzI0qeKJlvnM6uAD81BYm2xakv0S7DEbUrNwlECrgth5-YHdT8IR_vCBzW29QMh3ecOiiEk7P03wQG2V2gaxAUsMqOOZvTl_Oq3SefiLn9BvBAPQSGXQdRSZBVdsUqDT1aZ430Lcx8Ic6axaHSyHwlkkNK5EjRhYdkjYYz0YmENk64kRf4tvmX4WrH6f4&state=19a3862962dd0422628eb7c28a832380&scope=email%2Cread_stream%2Cpublish_stream%2Cuser_photos%2Cuser_videos&fbconnect=1#_=_ 

私はスクリプトの先頭にsession_start()を呼び出していますが、その両方を試してみました。 PHPのクッキーがうまくセットされています。

このリダイレクトループに関して、ここで多くの類似の質問がありましたが、提案された回答のどれもそれを解決しておらず、かなり古いものです。これはローカルホスト上で動作する必要がありますか? AM Facebookのアプリ設定でアプリケーション設定が欠けていますか? http://developers.facebook.com/docs/authentication/が、それは動作します:

UPDATEだから、あなたがここからのコードを使用している場合ようです。 githubのphp-sdkの例ではこれを完全に無視しています。「code」が設定されているかどうかをチェックし、独自のCSRFトークンを生成する必要があるという事実は含まれていません。次に、Graph APIを呼び出す前にアクセストークンを取得するための呼び出しを行う必要があります。

また、SDKのgetLoginURL()メソッドは、動作していないhttps:// URLを返します。自分のURLを作っていればうまくいきます。

WORKING CODE:私はそうのfile_get_contentsのコンテキストを設定する必要がプロキシを介しつもりです

if(empty($code)) { 
    $_SESSION['state'] = md5(uniqid(rand(), TRUE)); 
$login_url_params = array(
     'scope' => 'email,read_stream,publish_stream,user_photos,user_videos', 
     'fbconnect' => 1, 
     'redirect_uri' => 'http://local.fb-sandbox/', 
'state'=>$_SESSION['state'] 
    ); //using this array via the sdk does not work 

    $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
     . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" 
     . $_SESSION['state']; //this url works 

    //var_dump($dialog_url);echo "<br />"; 
    $login_url = $facebook->getLoginUrl(); 
    //var_dump($login_url); 
    header("Location:{$dialog_url}");//works 
    //header("Location:{$login_url}");//does not work 
    exit; 
} 



if($_REQUEST['state'] == $_SESSION['state']) { 
$token_url = "https://graph.facebook.com/oauth/access_token?" 
     . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) 
     . "&client_secret=" . $app_secret . "&code=" . $code; 
$aContext = array(
    'http' => array(
     'proxy' => 'tcp://xxxx0:80', 
     'request_fulluri' => true, 
    ), 
); 
$cxContext = stream_context_create($aContext); 
     $response = file_get_contents($token_url, FALSE, $cxContext); 

     $params = null; 
     parse_str($response, $params); 

     $graph_url = "https://graph.facebook.com/me?access_token=" . $params['access_token']; 

     $user = json_decode(file_get_contents($graph_url, FALSE, $cxContext)); 
     //var_dump($user);exit; 
} 

//var_dump($user);exit; 
    return $app->render('test.html',array('myvar', $user)); 
    exit(); 

注()を呼び出します。

誰かが適切なSDKメソッドを使用してコードを変換して機能させることができれば(私はそれがプロキシの背後で働くために必要であることに注意してください)、あなたは賞金を得るでしょう。

+0

同じ問題を持ちます。ユーザーがアプリを初めて認証したときにのみ発生します。私にあなたと同じエラーを与えるPHP。 – sgb

+0

** var_dump($ user); **出力は何ですか? –

+0

@GilBirman: '0 ' – codecowboy

答えて

5

さまざまなサーバーサイドのFacebook SDKの多くは、Facebookが過去3〜4ヶ月間に共有しているドキュメントや推奨されている方法に従って認証を処理しません。 PHP SDKがcodeパラメータをどのように使用するか(または使用しないか)、この良い例が見つかりました。 Facebookのクッキーを直接読んでいる他の例があります。Facebookのエンジニアは、クッキーが単なる実装の詳細なのでデベロッパーには言わず、Facebook外の開発者は依存関係を構築する必要がないと教えています。

、あなたの作業コード例でそのコードを得たところ、私はわからないが、私はそうSDKは、Facebookの勧告に従って認証を実装されていないことを考えると、このようなfbconnect=1

などのパラメータを含むためのあらゆるサポートを見つけることができませんでしたそしてFacebookはそのドキュメントの完全なPHPの実装を提供しているドキュメント、およびことを、私はあなただけ、Facebookが提供したバージョンを使用してコピーして、このページhttp://developers.facebook.com/docs/authentication/からご参考のためにここに貼り付けをお勧めします:

 <?php 

     $app_id = "YOUR_APP_ID"; 
     $app_secret = "YOUR_APP_SECRET"; 
     $my_url = "YOUR_URL"; 

     session_start(); 
     $code = $_REQUEST["code"]; 

     if(empty($code)) { 
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection 
     $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
      . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state=" 
      . $_SESSION['state']; 

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

     if($_REQUEST['state'] == $_SESSION['state']) { 
     $token_url = "https://graph.facebook.com/oauth/access_token?" 
      . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url) 
      . "&client_secret=" . $app_secret . "&code=" . $code; 

     $response = @file_get_contents($token_url); 
     $params = null; 
     parse_str($response, $params); 

     $graph_url = "https://graph.facebook.com/me?access_token=" 
      . $params['access_token']; 

     $user = json_decode(file_get_contents($graph_url)); 
     echo("Hello " . $user->name); 
     } 
     else { 
     echo("The state does not match. You may be a victim of CSRF."); 
     } 

    ?> 
+0

ありがとうございます。 PHP-SDKを完全に避けることをお勧めしますか? – codecowboy

+1

私は主に.NETで作業するので、PHP SDKを初めて体験する人はいません。 Facebookで推奨されているサーバーサイドのOAuth実装の直接的な適応である独自のコードを使用して認証が処理されると、API呼び出しを行うためにC#SDKを使用することを教えてください。それを読む時間。私はFacebookのクッキーを完全に無視します。 –

+0

は認証トークンとなり、file_get_contentsを使用してリクエストを送信している間に他のリクエストパラメータが暗号化されますか? –

1

これにはいくつかの問題があります。

  1. あなたのredirect_uriはhttp://local.fb-sandbox/のようになります。最後には、developers.facebook.comのコードとFacebookブックの設定の両方に末尾にスラッシュが必要です。

  2. あなたはredirect_uriでuurlencodeを使用する必要があります。

  3. redirect_uriに$ _SERVER ['REQUEST_URI']を使用しないでください。 app_dataを処理するか、ユーザーの旅に応じて追加することで、必要なパラメータを追加する方法を見つけてください。後でパラメータを追加することで

    'redirect_uri' => urlencode('http://local.fb-sandbox/'), 
    

    と実験:この行を置き換える開始したよう

+0

私はあなたが話しているパラメータを理解していません... –

+0

ログイン成功時にfacebookでコードが返されます。ログインURLになぜそれを追加しますか? –

+0

これらの提案は問題を解決しませんでした。誤解を招く可能性があるコメントを削除しました。私はその行を置き換えようとしましたが、まだ問題が発生しています。上記のコードを更新しました。他のアイデア? – codecowboy

関連する問題