Facebook PHP SDK - 在新的浏览器会话期间必须重新进行身份验证吗?

时间:2011-09-27 02:07:29

标签: facebook

希望这应该快速而简单。

session_start();

include("facebook.php");

$facebook = new Facebook(array(
'appId'=>'xxxxx50274xxxxx',
'secret'=>'xxxxxb932d62fbc6287feb18e5exxxxx',
'cookie'=>true
));

$fbuser = $facebook->getUser();

if (empty($fbuser)){
    $fbloginurl=$facebook->getLoginURL();
    echo "<html><body><a href='$fbloginurl'>Click</a></body></html>
} else {
    die("Authenticated");
}

在此示例中,我第一次单击链接以授予应用程序访问我的FB帐户的权限,一切正常。我可以继续刷新页面,然后收到“Authenticated”确认。

但是,每次重新启动浏览器(开始新会话)时,它都不会自动验证应用程序,我必须再次单击该链接。当然,一旦我点击链接,我立即被重定向回源页面,并显示“已验证”确认。

在新的浏览器会话期间是否有任何方法无需单击身份验证链接并自动进行身份验证?我需要在没有PHP Header指令的情况下执行此操作,因为我希望用户第一次授予通过手动单击触发的应用程序的权限。

我的FB登录是持久的(选中“保持登录状态”选项)。

非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

如果我正确理解您的方案(这不是iframe应用程序,对吗?),这完全取决于浏览器关闭时丢失网站会话cookie。一旦该cookie消失,没有任何东西可以识别用户的服务器端代码,因此无法知道用户之前是否已经授权您的应用程序。

您需要找到一种方法来持久识别用户,或者至少确定他已经授予了权限。最简单的方法可能是在用户首次进行身份验证后设置自己的(永久)cookie。然后,每当会话cookie丢失时,检查永久cookie的存在,如果存在,则执行PHP重定向到Facebook(对用户不可见)。如果没有cookie,请像现在一样向用户显示HTML链接。

答案 1 :(得分:0)

将它与我的代码进行比较,我看到的唯一区别是我检查$ fbuser是否有效 - 如果它没有将我发送到登录屏幕。我也在使用top.location.href。

// Login or logout url will be needed depending on current user state.
if ($fbuser) {
        $logoutUrl = $facebook->getLogoutUrl();
       } 
else {
    $loginUrl = $facebook->getLoginUrl(array('scope' => 'publish_actions', 'canvas' => 1, 'fbconnect' => 0, 'redirect_uri'=>config_item('facebook_url').$pf));
    echo "<html><body><script> top.location.href='" . $loginUrl . "'</script></body></html>";
    exit(0);
     }

希望有所帮助。