2011-12-31 23 views
4

私はOAuth 2.0のに私の古いFacebookアプリを移行する次の問題が生じています:Facebookアプリ:OAuthExceptionは:アクティブなアクセストークンを使用する必要があります

私は(PHPのコード内の)ユーザープロファイルを読み込むしようと私が取得エラー:「OAuthException:アクティブなアクセストークンは、現在のユーザーに関する情報を照会するために使用されている必要があり

アプリケーションはJavascriptを経由してログイン操作を行い、それはPHPから私は、ユーザーのプロファイルを取得するページにリダイレクト。

javascriptのコード:

<script type="text/javascript"> 
window.fbAsyncInit = function() { 
    FB.init({ 
     appId : '<?php echo $facebook->getAppId() ?>', 
     cookie : true, // enable cookies to allow the server to access the session 
     xfbml : true, // parse XFBML 
     oauth : true // enable oauth 
    }); 

    // whenever the user logs in, we refresh the page 
    FB.Event.subscribe('auth.login', function(response) { 
     window.location="index.php"; 
    }); 

}; 

(function() { 
    var e = document.createElement('script'); 
    e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; 
    e.async = true; 
    document.getElementById('fb-root').appendChild(e); 
}()); 


function login() { 
FB.login(function(response) { 
    if (response.authResponse) { 
    //console.log('Welcome! Fetching your information.... '); 
    FB.api('/me', function(response) { 
     //alert('Good to see you, ' + response.name + '.'); 
     var url="./code.php"; 
     window.location=url; 
    }); 
    } else { 
    alert("Debes de identificarte y aceptar las condiciones para obtener el descuento"); 
    } 
}, {scope: 'email'}); 

}; 


</script> 

(code.php中)PHPの一部:

require 'facebook-php-sdk/src/facebook.php'; 

// Create our Application instance (replace this with your appId and secret). 
$facebook = new Facebook(array(
    'appId' => 'xxxxxxxxxxxxxxxxx', 
    'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 
)); 
$user = $facebook->getUser(); 
if ($user) { 
    try { 
     // Proceed knowing you have a logged in user who's authenticated. 
     $me = $facebook->api('/me'); 
..... 

私は別の記事を読み、JavaScriptのログイン応答からaccess_tokenはを取得またはのようなものを試してみましたクッキーから、そしてapi( 'me /?access_token = ...)への呼び出しを行いますが、それはうまくいきませんでした。

編集:ありがとう、誰にでも感謝しています。 、PHPコードに&パースsigned_requestを取得し、ユーザーがあなたのアプリを認証し、与えalreadであれば(access_tokenを抽出します。

おかげ

+0

)私は(それはここで午前4:30です)何かが欠落している可能性がありますが、あなたは(ログインを呼び出しています関数?もしあなたがいたら、response.authResponseのデバッグ出力は何ですか? – brandwaffle

答えて

0

は@MehulHingu溶液はあなたがよりよく行うことができ、

しかし、あなたのケースに合った提案しましたキャンバスと呼ばれる

あなたはsigned_requestを取得します、あなたのFacebookのPHPのAPIを使用して、関連する権限):https://app.faceobook.com/yourapp

それ以外の場合、javascriptのログインを使用すると、簡単に登録を行い、許可を求めることができます。

登録ユーザーがこの方法になると、より効率的になります。

注:brandwaffleが述べたように、この提案は、あなたのアプリがキャンバスアプリ

+0

これはキャンバスアプリだとは思わない... – brandwaffle

0

ある場合は、JavaスクリプトFB.Login機能を使用している場合、あなたは

として対応してアクセストークンとユーザーIDを取得します有効です。
var uid = response.authResponse.userID; 
var accessToken = response.authResponse.accessToken; 

Uは、Ajax経由でphpコードにaccessTokenとuser idを渡し、phpのapi呼び出しで使用できます。

そして、あなたはJavaスクリプトFB.loginを使用してログインしている場合は覚えて、その後

$user = $facebook->getUser(); 

はPHPで動作しません。それはページをリロードする前に、右のあなたのJSコードがあなたをログアウトされます。したがって、ユーザーがログインし、コード

try { 
    $me_arr = array(
    'access_token'=>$access_token ,  
    ); 
     $user_profile = $fb->api('/me',$me_arr); 
     if($user_profile){ 
    // user is authanticated 

         } 
    else 
    { 
    // not 

    } 

     } catch (FacebookApiException $e) { 

     error_log($e); 

} 
+0

アクセストークンを渡す必要がありますか?私はいつも$ token = $ facebook-> getAccessToken()を使って成功しました。 – brandwaffle

+1

はい、あなたがJavaスクリプトを使ってユーザーログインを行っている場合、すべてのPHP APIコールでaccess_tokenを渡す必要があります。他に、「OAuthException:現在のユーザーに関する情報を照会するためにアクティブなアクセストークンを使用する必要があります。 –

+0

私はアクセストークンが必要だということに同意しますが、URLに渡さなくてもPHP側で入手できます。それはgetAccessTokenのためのものです:) – brandwaffle

0

UPDATE次利用をauthanticatedされているかどうかをチェックする

。それはPHP側で大げさなものになる!:)

ユーザーがログインしてJavaScript SDKを使用してアプリケーションを承認している限り、PHP側でアクセストークンを取得するだけで、すべて機能するようにする必要があります。次のように私はあなたの例を修正:

require 'facebook-php-sdk/src/facebook.php'; 

// Create our Application instance (replace this with your appId and secret). 
$facebook = new Facebook(array(
    'appId' => 'xxxxxxxxxxxxxxxxx', 
    'secret' => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' 
)); 
$user = $facebook->getUser(); 
$token = $facebook->getAccessToken(); 
if ($user) { 
    try { 
    // Proceed knowing you have a logged in user who's authenticated. 
    $me = $facebook->api('/me' . $token); 

は、私はあなたが前にこの例を試す言及知っているので、それはあなたがまだのFacebookにログインしている間、あなたのアクセストークンが無効であることを知って価値があります。これにより、if($ user)チェックを渡しても、無効なaccess_tokenでAPI呼び出しを試行します。これが起こっていないことを保証するために、$トークン値をvar_dumpします。もしあなたのapp_idと秘密が '|'で区切られていれば、あなたは有効なアクセストークンを持っていません。

テストアプリでJS側にログインし、コードをPHP側に読み込んで自分のユーザー名を表示させることができました。あなたはここで実際にそれを見ることができます:http://brandwaffle.info/facebook/

1

@moguzalp @brandwaffle @ yauros、非キャンバスアプリでsigned_requestを取得するには。私は次のコードを使用し、それは私のために働く。 Oauth 2.0を使用している場合、uはfbsr_app_idという名前のCookieを取得します。このcookieはsigned_request以外のものです。

あなたはこのクッキーを取得し、次のようにユーザIDとaccess_tokenはを取得するためにsigned_requestを解析することができます

$cookieName = 'fbsr_' . $app_id; 

function parse_signed_request($signed_request, $secret) { 
    list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

    // decode the data 
    $sig = base64_url_decode($encoded_sig); 
    $data = json_decode(base64_url_decode($payload), true); 

    if (strtoupper($data['algorithm']) !== 'HMAC-SHA256') { 
    error_log('Unknown algorithm. Expected HMAC-SHA256'); 
    return null; 
    } 

    // check sig 
    $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true); 
    if ($sig !== $expected_sig) { 
    error_log('Bad Signed JSON signature!'); 
    return null; 
    } 

    return $data; 
} 
function base64_url_decode($input) { 
    return base64_decode(strtr($input, '-_', '+/')); 
} 
$fbsr=parse_signed_request($_COOKIE[$cookieName],$application_secret); 

$user_id=$fbsr['user_id']; 
関連する問題

 関連する問題