1

我在使用 PHP SDK oauth 到 Facebook 时遇到了一些奇怪的行为。在 Firefox 中,我能够登录并允许该应用程序。我被重定向到我正在输出我的用户 ID、用户信息等的测试页面。漂亮!

接下来,我打开 Chrome 或者 IE 或者 Safari,登录 Facebook 后,我被重定向到同一个页面,但是这次,我没有显示为已登录。没有用户 ID,我可以验证我是否已登录Facebook。

事情变得更奇怪了。我在 Firefox 注销时回到 Facebook,回到我的测试脚本,它仍然显示我已登录.. 即使我通过 LogOutURL 完全注销。发出 $facebook->destroySession(); 后 最终显示我正确注销了..现在我无法使用任何浏览器登录。

我已经验证我有一个正确的访问令牌,并注意到登录 URL 中的“状态”变量会随着测试页面上的每次页面刷新而不断变化。

有任何想法吗?

这是我的测试代码.. 显然 appid 和 secret 已被删除。应用程序已经创建并且看起来可以通过 Facebook 运行......就像我说的,它运行过一次。

<?
require_once("facebook.php");

$config = array();
$config['appId'] = 'blahblahblah';
$config['secret'] = 'blahblahblah';
$config['canvas'] = false;
$config['fbconnect'] = true;

$facebook = new Facebook($config);

var_dump($facebook);
echo '<br /><br />';

echo 'Access Token<br />';
var_dump($facebook->getAccessToken());

echo '<br /><br />';


echo 'Login Status URL<br />';
var_dump($facebook->getLoginStatusUrl());

echo '<br /><br />';

$user = $facebook->getUser();

$loginUrl = $facebook->getLoginUrl();
echo 'login URL: '.$loginUrl;
echo '<br />';
$logoutUrl = $facebook->getLogoutUrl();
echo 'logout URL: '.$logoutUrl;


echo '<br />';

$user = $facebook->getUser();

echo var_dump($user);


echo '<br />';

$user = $facebook->api('/me');

var_dump($user);

//$facebook->destroySession();
?>
4

1 回答 1

0

我发现了问题。我在日志中看到了这些:

 CSRF state token does not match one provided.

该问题与多个“状态”有关。我的测试脚本正在响应对 $facebook->getLoginUrl() 的各种调用,这显然会导致问题。我将测试脚本调整为 $user 是否为“假”,如果是,则调用 getLoginUrl() 并重定向/验证...并返回。这全面解决了问题。

这是帮助识别此问题的链接: CSRF 状态令牌与提供的 FB PHP SDK 3.1.1 Oauth 2.0 不匹配

于 2013-07-14T00:38:10.217 回答