1

我正在使用 Facebook PHP SDK 以允许用户使用 Facebook 登录我的网站。
在我下面的测试中(假设 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 中使用不会捕获这些附加参数)。

我还需要添加 NE 标志,因为 Facebook 身份验证添加到 redirect_uri 的状态/代码正在被转义。

于 2013-08-12T15:44:59.210 回答
0

除了您在应用程序设置中设置的域之外,您将无法使用任何其他域。

“确保您使用的是根域,而不是 sample.com/test/ 作为您的 url 设置。”

于 2012-07-05T22:57:45.047 回答