1

ユーザーがFacebookを使用して自分のサイトにログインできるようにするために、FacebookPHPSDKを使用しています。以下の私のテストでは(URLがhttp://mysite.com/test/fbtest.php
であると仮定します)、

<?php
    require_once("facebook.php");
    $fb = new Facebook(array('appId' => 'APP_ID', 'secret' => 'APP_SECRET'));
    $fbuser = false;
    $fbuserid = $fb->getUser();
    $fblogin = $fb->getLoginUrl(array(
        'redirect_uri' => "http://{$_SERVER['HTTP_HOST']}/test/fbtest.php"));

if($fbuserid)
{
    try
    {
        $fbuser = $fb->api("/me");
        print_r($fbuser);
        echo "<br/>\n";
    }
    catch (FacebookApiException $e)
    {
        $fbuser = false;
        $fbuserid = 0;
    }
}
if(!$fbuser)
    echo "<a href=\"$fblogin\">FB Login</a>\n";
?>

これは期待どおりに機能するようです。ただし、次の書き換えルールを追加すると、

RewriteRule ^/FBtest/(.*)$ http://%{HTTP_HOST}/test/fbtest.php$1

次に、ログインリダイレクトを次のように変更します。

$fblogin = $fb->getLoginUrl(array(
        'redirect_uri' => "http://{$_SERVER['HTTP_HOST']}/FBtest/"));

その後、$fb->getUser()常に0を返します。重要なものが欠けているように感じます。

4

3 に答える 3

1

サーバー側のフローでは、redirect_uri getは、クエリ文字列のGETパラメーターとして必要な値を使用して呼び出されます。

'redirect_uri' => "http://{$_SERVER['HTTP_HOST']}/FBtest/"

したがって、このredirect_uriを使用すると、次のようになります。

http://example.com/FBtest/?state=foo&code=bar

サーバーで呼び出されます。

RewriteRule ^/FBtest/(.*)$ http://%{HTTP_HOST}/test/fbtest.php$1

RewriteRulesはクエリ文字列を調べず、URLのパスコンポーネントのみを調べます。あなたの場合、それはその/FBtest/背後にあるものではありません。したがって、内部リダイレクトはに/test/fbtest.phpなり、クエリ文字列パラメータは、渡したいとは言わなかったために失われます。

[QSA]「クエリ文字列の追加」のフラグをRewriteRuleに追加します(そして不要な(.*)ものを削除します)。fbtest.phpが認証プロセスに必要なクエリ文字列パラメーターを取得するため、期待どおりに機能するはずです。

于 2012-07-06T08:42:06.250 に答える
1

最終的にこの問題を理解しました。これが私が必要とするRewriteRuleです:

RewriteRule ^/FBtest/$ http://%{HTTP_HOST}/test/fbtest.php [QSA,NE]

このルールにQSAフラグとNEフラグの両方を追加する必要があることがわかりました。

CBroeの回答と同様に、redirect_uriに追加された状態/コードパラメーターにはQSAフラグが必要でした((.*)代わりにRewriteRule内で使用しても、これらの追加パラメーターはキャッチされません)。

Facebook認証がredirect_uriに追加していた状態/コードがエスケープされていたため、NEフラグも追加する必要がありました。

于 2013-08-12T15:44:59.210 に答える
0

アプリケーション設定で設定したドメイン以外のドメインは使用できなくなります。

「URL設定としてsample.com/test/ではなく、ルートドメインを使用していることを確認してください。」

于 2012-07-05T22:57:45.047 に答える