2011-12-24 3 views
1

Я реализовал пример подключения Facebook с моим сайтом Codeigniter. Я пытаюсь довести код подключения Facebook до настоящего времени, но я не могу разобраться, как разбирать fbsr_cookie, который заменил fbs_cookie.Разбор fbsr_cookie

У меня есть следующий код -

function get_facebook_cookie() 
    { 
     // get the fb app id, and secret from CI config source 
     $CI =& get_instance(); 
     $app_id = $CI->config->item('facebook_app_id'); 
     $application_secret = $CI->config->item('facebook_app_secret'); 
     if(isset($_COOKIE['fbs_' . $app_id])){ 
      $args = array(); 
      parse_str(trim($_COOKIE['fbs_' . $app_id], '\\"'), $args); 
      ksort($args); 
      $payload = ''; 
      foreach ($args as $key => $value) { 
        if ($key != 'sig') { 
        $payload .= $key . '=' . $value; 
        } 
      } 
      if (md5($payload . $application_secret) != $args['sig']) { 
        return null; 
      } 
      return $args; 
     } 
     else{ 
      return null; 
     } 
    } 

, а затем, чтобы получить пользователя Facebook ID -

function getUser() 
    { 
     $cookie = $this->get_facebook_cookie(); 
     $user = @json_decode(file_get_contents('https://graph.facebook.com/me?access_token=' . $cookie['access_token']), true); 
     return $user; 
    } 

Кто-нибудь есть идея, как я могу изменить это, чтобы работать с fbsr_cookie?

Спасибо.

+0

Почему вы просто не используете FB PHP SDK? – zerkms

+0

Я использую Codeigniter и Tank_auth для обработки входа в систему. Это из-за расширения Tank_auth, которое обрабатывает сторонние сценарии входа. Я думал, используя этот метод, это облегчило бы жизнь. – Tom

+1

@tom - я использую Tank_auth и eric bae's XTA2, но этот комбо не работает больше, так как FB изменил некоторые вещи своим новым oAuth 2.0 - у меня недавно возникли проблемы с новым файлом cookie, но мне удалось получить эту работу с FB SDK - пусть я знаю, если вы решили это уже, и я могу попытаться помочь – pepe

ответ

3

Новый формат печенья с именем fbsr_APPID фактически signed_request, который довольно легко разобрать и документы, подтверждающие, как именно это сделать (см «Проверка и расшифровка» в signed_request Documentation

0

Эта функция выглядит так же, как и с CodeIgniter годов расширение XTA (теперь не поддерживается) не только вы должны изменить fbs_ к fbsr_, есть совершенно другой набор лексем разбора происходит:.

здесь обновленная функция:

function get_facebook_cookie() { 
    $CI =& get_instance(); 
    $app_id = $CI->config->item('facebook_app_id'); 
    $application_secret = $CI->config->item('facebook_app_secret'); 
     if(isset($_COOKIE['fbsr_' . $app_id])){ 
     list($encoded_sig, $payload) = explode('.', $_COOKIE['fbsr_' . $app_id], 2); 

     $sig = base64_decode(strtr($encoded_sig, '-_', '+/')); 
     $data = json_decode(base64_decode(strtr($payload, '-_', '+/')), true); 

     if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') { 
      return null; 
     } 
     $expected_sig = hash_hmac('sha256', $payload, 
     $application_secret, $raw = true); 
      if ($sig !== $expected_sig) { 
       return null; 
      } 
      $token_url = "https://graph.facebook.com/oauth/access_token?" 
     . "client_id=" . $app_id . "&client_secret=" . $application_secret. "&redirect_uri=" . "&code=" . $data['code']; 

      $response = @file_get_contents($token_url); 
      $params = null; 
      parse_str($response, $params); 
      $data['access_token'] = $params['access_token']; 
      return $data; 
     }else{ 
      return null; 
    } 
} 

Пришло из этого useful blog post с некоторыми другими лакомыми кусочками о проблеме.

Кроме того, убедитесь, что у вас есть allow_url_fopen для вызова @file_get_contents. «@» Скроет эти ошибки.