2011-12-24 3 views
1

私はCodeigniterのWebサイトでFacebook接続の例を実装しました。私はFacebook接続コードを最新のものにしようとしていますが、fbs_cookieを置き換えたfbsr_cookieを解析する仕組みはできません。fbsr_cookieの解析

I持って、次のコード -

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のXTA2を使用しますが、FBは新しいoAuth 2.0でいくつかの変更を加えたので、このコンボはもう機能しません - 最近新しいクッキーにいくつかの問題がありましたが、FB SDK私はあなたがこれをすでに解決していれば助けてくれることを知っています – pepe

答えて

3

名前fbsr_APPIDで新しいクッキーの形式は、実際に解析し、ドキュメントが、これは(この関数は、ちょうどCodeIgniterの年代からのように見えるsigned_request Documentation

0

に「検証および復号化」を参照してください行う方法を正確に示すことは非常に簡単ですsigned_requestですXTAの拡張子は(今維持されていない)だけでなく、あなたがfbsr_するfbs_変更しなければならないのは、起こってトークン解析の完全に異なるセットがあります:。

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からのもので、この問題に関するその他のちょっとした話があります。

また、@ file_get_contents呼び出しでallow_url_fopenを使用していることを確認してください。 '@'はこれらのエラーを非表示にします。