7

こんにちは、Facebook サーバー側認証を使用してアクセス トークンを取得しようとしていますが、エラーが発生し続けます。

私はベローを使用しています:

$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 = "https://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.");
   }

App ID と APP Secret は削除されているので、その部分は気にしないでください。get_file_contents タイムアウトに関するエラーが発生します。

[function.file-get-contents]: ストリームを開けませんでした: 接続がタイムアウトしました

アクセストークンを取得する別の方法またはより良い方法はありますか?

以下は、cURLのアイデアを含めて試したバージョンです。

function get_data_cURL($url)
{
  $ch = curl_init();
  $timeout = 5;
  curl_setopt($ch,CURLOPT_URL,$url);
  curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
  curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,$timeout);
  $data = curl_exec($ch);
  curl_close($ch);
  return $data;
}

function getAccessToken(){
    $app_id = FB_APP_ID;
    $app_secret = FB_SECRET_ID;
    $canvas_URL = FB_CANVAS_URL;

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

    if(empty($code)) {
      $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
      $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
        . $app_id . "&redirect_uri=" . urlencode($canvas_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($canvas_URL)
        . "&client_secret=" . $app_secret . "&code=" . $code;

     $returned_content = get_data_cURL($token_url);
    echo'Well Done! - '.$returned_content;

    }
    else {
      echo("The state does not match. You may be a victim of CSRF.");
    }
}

詳細:

アプリ設定 - キャンバス URL: http://www.apps.elistone.co.uk/DrawMyFriend/

FB_APP_ID = The Facebook App ID
FB_SECRET_ID = The Facebook Secret ID
FB_CANVAS_URL = http://www.apps.elistone.co.uk/DrawMyFriend/

この更新を行っても、まだこのエラーが発生します。

古いエラー

素晴らしい!- {"error":{"message":"検証コードの検証中にエラーが発生しました。","type":"OAuthException","code":100}}

新しいエラー

これは、状態コードを削除するリダイレクトが原因のようです。

状態が一致しません。あなたは CSRF の被害者かもしれません。- 193c791ddd71c3fd84d411db5554c315 (州コード)

また、次のように変更して、CSRF 保護をバイパスしようとしました。

if($_REQUEST['state'] == $_SESSION['state'])

に:

 if(!empty($code))

しかし、これでも古いエラーの問題が発生します。リダイレクト リンクの何かが原因であると聞きましたが、修正方法がわかりません。

問題が解決しました

時間をかけて試した後、以下を使用してPHP SDKを使用してユーザーアクセストークンを取得しました。

$app_id = FB_APP_ID;
$app_secret = FB_SECRET_ID;
$canvas_URL = FB_PAGE_URL;
$code = $_REQUEST["code"];

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

  echo("<script> top.location.href='" . $dialog_url . "'</script>");
}
if($_REQUEST['state'] == $_SESSION['state']) {
$facebook->api('oauth/access_token', array(
    'client_id'     => FB_APP_ID,
    'client_secret' => FB_SECRET_ID,
    'type'          => 'client_cred',
    'code'          => $code,
));
$token = $facebook->getAccessToken();
echo$token;
}

これをある種の関数に変換します。みんなの時間と助けに感謝します。

これが将来困っている人々に役立つことを願っています(Facebookが突然すべてを変更しない限り)

4

2 に答える 2

7

Facebook API との通信には、PHP SDK ライブラリを使用することをお勧めします。getAccessToken()またはgetAccessTokenFromCode()メソッドを使用するだけです。

アップデート

ユーザー アクセス トークンを取得するには、アクセス トークンを取得する前に oauth リクエストを送信する必要があります。回答の更新の詳細:

    $facebook->api('oauth/access_token', array(
        'client_id'     => APP_ID,
        'client_secret' => APP_SECRET,
        'type'          => 'client_cred',
        'code'          => $code,
    ));
    $token = $facebook->getAccessToken();
于 2012-06-04T06:25:24.037 に答える
2

このステップで失敗する可能性が最も高い原因は、次の 2 つです。

  • redirect_uri末尾の「/」がありません
  • redirect_uriへの呼び出しで/oauth/access_token、oauth ダイアログに指定した redirect_uri と正確に一致しません

どちらの場合も、コードの検証に失敗し、トークンを取得できません。

「ストリームを開くことができませんでした: 接続がタイムアウトしました」というエラーは、おそらくそれとは関係ありませんが、通常、サーバーから graph.facebook.com にアクセスしようとしたときに DNS またはネットワーク エラーが発生したことを示しています。

于 2012-06-02T16:16:01.333 に答える