0

私は Facebook PHP SDK を単独で利用しています。JS SDK をまったく使用したくありません。

なぜなら getUser(); ユーザーがログインしていない場合でも SDK からユーザー ID を返すことができるため、try/catch ステートメントを使用してユーザーがログインしているかどうかを確認することにしました。

    try
{
    $me = $CI->facebook->api('/me');
    $CI->our_fb['is_fb']='YES';
    echo "hello";
}
    catch(FacebookApiException $e) 
{               
    echo "catch";
}

このステートメントは、すべてのファイルのグローバル インクルード ファイルに含まれています (簡単にするため)。

なので、場合によってはFacebookのログインURLを生成しています。期待される機能は、ユーザーが Facebook にログインし、アプリを承認し、ログイン URL に設定されたリダイレクト URI に返され、その時点で try ステートメントが実行され、$CI->our_fb['is_fb'] が設定されることです。

しかし、これは起こっていません。

  • ユーザーがすでに Facebook にログインしており、アプリが承認されている場合、アプリは完全に機能します。成功

  • ユーザーが Facebook にログインしていない場合、リダイレクトされた後、変数は設定されません。失敗

  • ユーザーがログインしているが、リダイレクト後にアプリが承認されていない場合、変数は設定されません。失敗。

後者の 2 つのケースでは、単にページを更新すると、変数が設定されます - SUCCESS。ただし、ページを更新することは不要/無意味な余分な労力です。

私の問題は、FB にログインする必要がある場合、または FB で初めてログインするときなどにアプリを承認する必要がある場合、不要な更新が追加されることです。その理由はわかりません。

Cookie/セッションと関係があると思いますか?SDKに自動的に返される/渡されると想定しているアクセストークンが同時に設定されずに保存されるのはどれですか?

誰でもアイデアはありますか?

4

3 に答える 3

0

私の見方では、ユーザーがログインしておらず、ページが最初に読み込まれた後にログインする前に、その更新を回避しようとしています。したがって、できることは、サイトの別のページ、たとえばid.phpにajaxリクエストを行うことです。これは、phpsdkをロードして$useridをエコーするだけです。その後、更新せずにログイン後にユーザーIDを取得できます。

于 2013-01-15T22:15:41.553 に答える
0

Facebook (タブまたはキャンバス) でアプリを使用している場合。signed_requestがアプリへのリクエストとともに送信されるため、PHP SDK はページの初期読み込み時にのみユーザー ID を取得します。

ただし、アプリが更新されると、signed_request は失われます (それを送信するのは facebook であるため)。

したがって、この場合、signed_requestアプリで使用するすべての URL に を追加できますが、signed_requestは再生成も更新もされないため、実際には最適ではありません。

唯一の実際のオプションは、JS SDK に依存して Cookie を正しく設定しgetUser、期待どおりに動作させることです。Facebook では (iframe 内にある) サードパーティ アプリと見なされ、ほとんどのブラウザーは Cookie の設定をブロックするため、これが必要です。そのため、JS SDK によって処理される回避策が必要です。回避策を検索しcross-domain cookiesたりthird-party cookie説明を求めたりすることはできますが、これらの回避策は JS スクリプトと iframe 管理を介してのみ機能します。

また、JS SDK を正しく設定してください: channel filecookie allowed、および send P3P headers (IE 用)。

この関連する質問を確認することもできます: FB 認証への適切なアプローチ

website については、ほとんど同じです(ただし、ありませんsigned_request)。この時点で、JS SDK の使用を真剣に検討してください。または、アプリ フローが次のガイドラインに従っていることを確認できます: https://developers.facebook.com/docs/concepts/login/login-architecture/

于 2013-01-10T15:28:49.983 に答える
0

基本的に、Cookie は署名付きリクエストを保存するために使用され、セッションは「状態」、「コード」、「access_token」、「user_id」を保存するために使用されます。上記が存在する場合、それらが有効であるかどうかに関係なく、PHP SDK はそれらを使用します。

問題は Facebook から送信された CODE にあると思います。具体的には、base_facebook.php の次の行:

if ($code && $code != $this->getPersistentData('code')) {
  $access_token = $this->getAccessTokenFromCode($code);

...

protected function getAccessTokenFromCode($code, $redirect_uri = null) {
if (empty($code)) {
  return false;
}

if ($redirect_uri === null) {
  $redirect_uri = $this->getCurrentUrl();
}
...

CODE は特定の URL に対して発行されるため、次のような状況が発生することがあります。彼は権限を付与し、example.com/login にリダイレクトされます。しかし、そこではコードが有効ではないため、getUserAccessToken は false を返します。ページを更新すると、同じ URL が取得され、すべて問題ありません。

上記で書いたように、利用可能な場合はセッションから取得されるため、 getUser() を使用しないという正しい軌道に乗っています。

于 2013-01-16T23:54:58.590 に答える