我正在使用Facebook PHP SDK,以允许用户使用Facebook登录我的网站 在我的测试中(假设网址为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.我觉得我错过了一些重要的东西。
答案 0 :(得分: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将获得查询身份验证过程所需的字符串参数。
答案 1 :(得分:1)
最后想出了这个问题。这是我需要的RewriteRule:
RewriteRule ^/FBtest/$ http://%{HTTP_HOST}/test/fbtest.php [QSA,NE]
事实证明我需要在此规则中添加QSA和NE标志。
就像在CBroe的回答中一样,添加到redirect_uri的状态/代码参数需要QSA标志(在RewriteRule中使用(.*)
而不是捕获这些附加参数)。
我还需要添加NE标记,因为Facebook身份验证添加到redirect_uri的状态/代码正在被转义。
答案 2 :(得分:0)
您将无法使用您在应用程序设置中设置的域以外的任何其他域。
“请确保您使用的是根域,而不是使用sample.com/test/作为您的网址设置。”