Facebook PHP-SDK не обрабатывает параметры кода / состояния, переданные через $ _GET? - PullRequest
2 голосов
/ 30 января 2012

Похоже, бит аутентификации, когда Facebook отправляет параметры code, state через $ _GET, не рассматривается в PHP-SDK.

if(!empty($_GET['code']) && !empty($_GET['state']))
{
    $response   = file_get_contents('https://graph.facebook.com/oauth/access_token?' . http_build_query(array('client_id' => AY_FACEBOOK_APP_ID, 'client_secret' => AY_FACEBOOK_APP_SECRET, 'redirect_uri' => AY_FACEBOOK_TAB_URL, 'code' => $_GET['code'])));

    // now check state and parse access token

    ay($response);
}

Я что-то упустил? Если нет, то с чем это связано?


Обратите внимание, что я не просил привести пример, как это делали DMCS и Люк Франкен.

Ответы [ 2 ]

2 голосов
/ 30 января 2012

Да, параметры состояния и кода обсуждаются на http://developers.facebook.com/docs/authentication/ в части о защите от CSRF.

 <?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 голосов
/ 30 января 2012
$response   = file_get_contents(
    'https://graph.facebook.com/oauth/access_token?' . http_build_query(
        array(
            'client_id' => AY_FACEBOOK_APP_ID, 
            'client_secret' => AY_FACEBOOK_APP_SECRET, 
            'redirect_uri' => AY_FACEBOOK_TAB_URL, 
            'code' => $_GET['code']
        )
    )
);

// now check state and parse access token

ay($response);

Это выглядит немного лучше.

Теперь ваш вопрос: это просто работает: https://graph.facebook.com/oauth/access_token?client_id=1&client_secret=2&redirect_uri=3&code=1234

С этим кодом тестирования:

echo 'https://graph.facebook.com/oauth/access_token?' . http_build_query(
        array(
            'client_id' => 1, 
            'client_secret' => 2, 
            'redirect_uri' => 3, 
            'code' => '1234'
        )

);

Попробуйте поместить URL-адрес в переменную, которая облегчит жизнь при отладке.

Если вы ничего не получите в code = part, у вас могут быть значения в переменной $ _GET ['code'], которые не будут приняты http_build_query, так как эта функция urlencodes кодирует данные массива.

...