2

私はウェブサイト用の新しいFacebook APIに移行しようとしていますが、スムーズに動かすことはできません。 JavascriptとPHP SDKを一緒に使用したいのですが、問題があります。私は認証できますが、ページは自動的に更新されません。Facebook Oauth 2.0 PHP 3.1.1とJavascript SDKを使用したログイン

私はSOとFacebookのドキュメントを検索しましたが、これが正しく動作するようにはなっていません。私はhttp://developers.facebook.com/blog/post/534/を読んで、最新のPHP SDK(3.1.1)をdowloadし、基本的に上記のポストの例をfacebookからコピーしました。私は自分のアプリのマイグレーション設定で正しい設定だと思っているものを作ったが、これは問題のあるところにある可能性がある。私はので、ここで設定されている、画像を投稿することができません。

  • 削除非推奨APIの:有効
  • 軍ログイン秘密の使用:有効
  • 暗号化されたアクセストークン:
  • 強化された認証ダイアログ有効:有効
  • ここ

はコードである(それ以外は無効になります):

<?php 

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

$facebook = new Facebook(array(
    'appId' => 'YOUR_APP_ID', 
    'secret' => 'YOUR_APP_SECRET', 
)); 

// See if there is a user from a cookie 
$user = $facebook->getUser(); 

if ($user) { 
    try { 
    // Proceed knowing you have a logged in user who's authenticated. 
    $user_profile = $facebook->api('/me'); 
} catch (FacebookApiException $e) { 
    echo '<pre>'.htmlspecialchars(print_r($e, true)).'</pre>'; 
    $user = null; 
    } 
} 

?> 
<!DOCTYPE html> 
<html xmlns:fb="http://www.facebook.com/2008/fbml"> 
    <body> 
    <?php if ($user_profile) { ?> 
     Your user profile is 
     <pre>    
     <?php print htmlspecialchars(print_r($user_profile, true)) ?> 
     </pre> 
    <?php } else { ?> 
     <fb:login-button></fb:login-button> 
    <?php } ?> 
    <div id="fb-root"></div> 
    <script>    
     window.fbAsyncInit = function() { 
     FB.init({ 
      appId: '<?php echo $facebook->getAppID() ?>', 
      cookie: true, 
      xfbml: true, 
      oauth: true 
     }); 
     FB.Event.subscribe('auth.login', function(response) { 
      window.location.reload(); 
     }); 
     FB.Event.subscribe('auth.logout', function(response) { 
      window.location.reload(); 
     }); 
     }; 
     (function() { 
     var e = document.createElement('script'); e.async = true; 
     e.src = document.location.protocol + 
      '//connect.facebook.net/en_US/all.js'; 
      document.getElementById('fb-root').appendChild(e); 
     }()); 
    </script> 
    </body> 
</html> 
+1

※*バグですので、[こちら](http://developers.facebook.com/blog/post/534/?fb_comment_id=fbc_10150280812027726_18008036_10150281567792726)のコメントをお読みください。 – ifaour

答えて

4

...私はコメントとしてこれを書くつもりだったが、それは少し長くなった:)

PHP SDKを使用して、ポインタのカップル:

$facebook->getUser(); 

これは関係なく、動作します認証。 getUser()はアクセストークンを必要としない公開データを取得します。アクセストークンを持っていて、ユーザが例えばemail権限を与えている場合、このメソッドには電子メールアドレスも含まれます。認証されたユーザのための

より良いテスト:ユーザーがアプリケーションを承認した場合

$code = $_REQUEST['code'] ? true : false; 
if (!$code) { 
    echo ("<script>window.top.location=\"...\"</script>"); 
} 

をチェックします。

$access = $facebook->getAccessToken(); 

あなたは常にあなたが唯一のこれまでのアプリにFacebookの対話からリダイレクトされている署名要求を受け取るだろうアクセストークン(優先順位を!)を要求することを確認してください。 (すなわち)oAUTH対話。このSDKのメソッドは、アクセストークンをセッション変数に保存します。署名されたリクエストが発行されていない場合でも、PHPセッションがアクティブな次のアプリケーションページでgetAccessToken()メソッドを呼び出すことができます。単純まだ、

$user = $facebook->api('/me'); 

のか:今、あなたがログインしているユーザーのためにあなたの有効なアクセストークンを持っていることを

、あなたが進むことができ

$user = $facebook->getUser(); 

は、私は多くのためのAPI呼び出しを予約する傾向がありますユーザフィード/フレンドフィードへの投稿などの複雑なリクエスト。要約するので

- >チェックのための$code - > OAuthの対話後の最初のページに署名リクエストを取得します。 - >ブラウザのCookieが無効になっている場合(つまり、おそらく)、セッションをSID定数を持つ次のページに渡すことを忘れないでください。そうしないと、格納されているアクセストークンが失われます。

+0

ありがとう、David。これは間違いなく正しい方向に私を指摘しました。私はSDKがこれを世話していると考えていました。私は 'code'パラメータを要求する必要があるとは思っていませんでした! SDKと一緒に来るexample.phpは、このコンセプトについて言及していません。 – HipN

+0

'code'パラメータは実際にはSDKの一部ではなく、facebookからURLに渡されました。それが存在するかどうかを確認するだけで、ユーザーがあなたのアプリを認証したことが明らかになります。そして、私はFacebook上であなたと全く一緒に、特定の「概念」について言及していません。提供された情報の量にもかかわらず、非常に関連性の高い情報はほとんどありません。 –

関連する問題