13

友達、

JS SDK を使用して、自分の Web サイトに Facebook ログインを設定しました。

  1. JS SDK を介してログインして使用する場合、クライアント側も簡単に作成できるため、サーバー側でもセッションが有効かどうかをクロス検証する必要があります。

  2. 私は JS SDK を使用しているため、サーバーは Facebook セッションにアクセスできません。サーバー側でセッションを確認する必要がある場合、https: //developers.facebook.com/docs/reference/php/ で指定されているように、php-sdk とセッションを外部で使用できますか? この場合、これを実行するには CURL PHP 拡張機能を有効にする必要があり、php SDK を使用するとパフォーマンスが低下するのではないかと心配しています。

上記の質問に対する答えを見つけるのを手伝ってくれませんか?

4

3 に答える 3

14

php sdk と javascript は、Julian H. Lam が言ったこととは正反対です。実際、これらは一緒に使用するために構築されています。

php sdkのドキュメントでは、これを見つけることができます:

Facebook SDK for JavaScript との統合

PHP SDK を Facebook SDK for JavaScript と組み合わせて使用​​すると、クライアントとサーバー間でユーザー セッションをシームレスに共有できます。ユーザーが Facebook でログインし、アプリを承認した場合、JavaScript SDK はユーザー セッションを取得して、これを Cookie に保存します。この Cookie は PHP SDK が開発者の介入なしに読み取ります。

この機能を有効にするには、JS SDK を埋め込んで初期化するときに、FB.init() に渡されるオブジェクトのステータス パラメータと Cookie パラメータの両方を true に設定してください。

そして、基本的なロジックを使用することで、これはすべて理にかなっています。クライアント側では、リスナーを作成してユーザーのステータスを取得できます(ログインしている場合、権限を付与している場合、ログアウトしている場合)、サーバー側でこの種のアクションを実行すると、まったく意味がありません。

したがって、私からのアドバイスは、Javascript SDK を使用して、前に述べたようなユーザー イベントを処理し、ユーザーがいいね! をしたり、フィード ダイアログを使用して投稿を共有した場合など、ユーザーのアクションからの応答を処理することです。など。php SDK では、有効なユーザーがいるかどうかを確認するだけです。これを行うと、javascript SDK でログイン プロセスを処理した後、クライアント側とサーバー側で同じ Cookie を共有しているためです$fb_id = $facebook->getUser()(もちろん、PHP SDK を初期化した後)、有効なユーザーを持っていることがわかったので、ユーザーの facebook ID を取得します。PHP SDK を使用して、ユーザーに関する情報をクエリしたり、ユーザーに代わって投稿したりできます。

Cookie をサポートする JavaScript SDK の適切な読み込みの例を次に示します。

<div id="fb-root"></div>
<script>
  window.fbAsyncInit = function() {
    // init the FB JS SDK
    FB.init({
      appId      : 'YOUR_APP_ID',                        // App ID from the app dashboard
      channelUrl : '//WWW.YOUR_DOMAIN.COM/channel.html', // Channel file for x-domain comms
      status     : true,                                 // Check Facebook Login status
      xfbml      : true,                                  // Look for social plugins on the page
      cookie     : true
    });

    // Additional initialization code such as adding Event Listeners goes here
  };

  // Load the SDK asynchronously
  (function(d, s, id){
     var js, fjs = d.getElementsByTagName(s)[0];
     if (d.getElementById(id)) {return;}
     js = d.createElement(s); js.id = id;
     js.src = "//connect.facebook.net/en_US/all.js";
     fjs.parentNode.insertBefore(js, fjs);
   }(document, 'script', 'facebook-jssdk'));
</script>

そして、これはあなたを啓発するためのサーバー側の簡単なコードです:

require_once("facebook.php");

$config = array();
$config[‘appId’] = 'YOUR_APP_ID';
$config[‘secret’] = 'YOUR_APP_SECRET';
$config[‘fileUpload’] = false; // optional

$facebook = new Facebook($config);
try {
    $user_profile = $facebook->api('/me','GET');
    $user_name = $user_profile['name'];
    $user_email = $user_profile['email'];

} catch(FacebookApiException $e) {
    // If the user is logged out, you can have a 
    // user ID even though the access token is invalid.
    // In this case, we'll get an exception, so we'll
    // just ask the user to login again here.
}

PS: このサーバー側のコードは、ユーザーがスコープ email の権限を既に付与している場合にのみ機能します

于 2013-04-09T14:43:28.147 に答える
1

この質問には 2 つの部分があります。まず、UI フローに違いがあります。参照: https://developers.facebook.com/docs/concepts/login/login-architecture/

1) JS SDK を使用したブラウザ側。まず、oauth 2.0 ダイアログでアクセス トークンを取得し、これを使用して Facebook API にアクセスします。

2) サーバー側は、サーバーに投稿された signed_request を使用します。これで、user_id を抽出できます。参照: https://developers.facebook.com/docs/howtos/login/signed-request/ -

  • ステップ 1 - signed_request を記述し、PHP または JS SDK から取得する方法を説明します
  • ステップ 2 - signed_request が偽造されていないことを確認する方法。

    他のプロバイダーの Oauth トークンを FB と統合できます。私の Dropbox の例を参照してください: apps.facebook.com/fileglu/ - 2011 年 9 月頃。CSRF、CORS、javascript 暗号化の回避など、実装の詳細については技術セクションもご覧ください。

  • 于 2013-04-10T06:27:14.633 に答える
    0

    Facebook の JavaScript ライブラリと php SDK は、本質的に相互に通信しない 2 つのエンティティと見なすことができます。1 つはクライアント側で、もう 1 つはサーバー側です。

    php SDK を使用すると、ユーザーのログイン セッションをきめ細かく制御できますが、javascript ライブラリを使用すると簡単に開始できます。

    通常、javascript ライブラリ経由でログインしたユーザーは、サーバー側で自動的にログインされませんが、場合によっては、クライアントからサーバー側にアクセス トークンを送信できる場合があります。ただし、このデータは傍受される可能性があるため、お勧めできません。

    この関連する質問は、(JS ライブラリから取得した) アクセス トークンをサーバー側に送信することについて説明しています。

    本質的に:

    FB.login(function(response) {
        var access_token = response.authResponse.accessToken;
    
        // Make an ajax call here to your server-side, and send access_token in.
    });
    
    于 2013-04-05T12:57:54.010 に答える