4

「CSRF状態トークンが提供されたものと一致しない」という問題について、stackoverflowにたくさんの投稿があることを私は知っています。しかし、私は試してみましたが、問題を解決していないようです。以下の私のコードを見ていただけますか?あなたの考えと問題を解決する方法を教えてください。すでに最新の PHP SDK バージョンに更新しています。

<?
require_once ('src/facebook.php');
require_once ('src/fbconfig.php');

//Facebook Authentication part
$user_id = $facebook->getUser();
$loginUrl = $facebook->getLoginUrl(array(
    'scope' => 'publish_stream')
);

if ($user_id) {
    $_SESSION['user_id'] = $user_id;
    echo "<script>top.location.href = 'https://www.example.com/app-folder/welcome'</script>"; 
    exit;
} 
?>
    .
    .
<body>
<?php echo '<a href="'.$loginUrl.'" target="_top">Please login</a>'; ?>
    .
    .
</body>
4

4 に答える 4

11

getLoginUrl()新しいトークンを生成します。ユーザーがすでに(で)ログインしている場合は$user_id = $facebook->getUser()、2つのトークンになります。

ユーザーがすでに認証されている場合は、$loginUrlを要求しないでください。

$user_id = $facebook->getUser();

if ($user_id) {
    $_SESSION['user_id'] = $user_id;
    echo "<script>top.location.href = 'https://www.example.com/app-folder/welcome'</script>"; 
    exit;
} else {
    $loginUrl = $facebook->getLoginUrl(array(
        'scope' => 'publish_stream')
    );
}

?>

于 2012-08-14T18:21:50.337 に答える
0

私は次のことをしなければなりませんでした:

  1. PHP SDK の getLoginUrlを最初のページ (つまり、ログイン/インデックス) でのみ使用し、他のすべてのページから削除します。
  2. Javascript SDK の FB.getLoginStatus() を使用し、FB.login() にフォールバックするか、ログイン/インデックス ページにリダイレクトします。
  3. 有効な access_token を必要とする可能性のある操作を試みる前に、FB.getLoginStatus() を確認してください

主な問題は、すべてのページでgetLoginUrlを呼び出したことにあると確信しています。

これらの変更を行ったので、ロボットがページにアクセスしたときにのみログに「CSRF 状態トークン」エラーが表示されます。

于 2013-01-17T11:54:57.997 に答える
0

Facebook PHP API ドキュメントには記載されていませんが、ログイン プロセスを機能させるには、PHP セッション用に apache を構成する必要があります。これは、「CSRF 状態トークンが提供されたトークンと一致しません」というメッセージが表示されたときに発生した問題であることが判明しました。

サーバー プールを使用している場合は、セッション情報に memcache を使用するように設定されていることを確認してください。そうしないと、Apache はセッション情報をローカルに書き込み、次のリクエストが同じサーバーに送信されない場合は、「CSRF 状態」を取得します。トークンが提供されたものと一致しません。」

これは、開発環境 (サーバーが 1 つ) では魅力的に機能したが、本番環境では失敗したものの 1 つです。

また、PHP セッション Cookie を通過するように CDN 設定を再構成する必要がありました。

于 2013-05-24T17:46:49.360 に答える
-3

回避策:
に移動base_facebook.php

protected function getCode()これが問題です。
オフサイト ナビゲーション用に$this->state変数が保存されない (自然)

これを置き換えます:

if ($this->state !== null &&
isset($_REQUEST['state']) &&
$this->state === $_REQUEST['state']) {

これとともに:

if ($_REQUEST['state'] != '' && $_REQUEST['code'] != '') {

そして、それはうまくいくでしょう

G@bri3l

于 2013-03-11T13:09:44.273 に答える