使用PHP或JavaScript Facebook SDK,如何让用户登录我的网站?

时间:2011-08-20 23:57:02

标签: php facebook

我正在使用Facebook's PHP SDK将用户登录到我的网站,如下所示:


<?php
$facebook = new Facebook(array(
    "appId"  => "myAppID",
    "secret" => "mySecret",
));

$user = $facebook->getUser();

if ($user) {
    try {
        // user is authenticated
        $user_profile = $facebook->api("/me");
    } catch (FacebookApiException $ex) {
        $user = null;
    }
}

if ($user) {
    $logoutURL = $facebook->getLogoutUrl();
    ?>
    <img src="https://graph.facebook.com/<?php echo $user; ?>/picture" />
    <a href="<?php echo($logoutURL); ?>">Logout</a>
    <pre><?php print_r($user_profile); ?></pre>
    <?php
} else {
    ?>
    <a href="<?php echo($loginURL); ?>">Login</a>
    <?php
}
?>

问题是当用户返回网站时,他们不再登录,并且必须重新登录。

返回用户是否可以保持登录状态?


更新

我的确切解决方案最终是JavaScript和PHP Facebook SDK的组合。

问题是cookie不用于存储Facebook登录信息 - PHP会话(PHP会话cookie在浏览器关闭时到期)。除此之外,除非您具有脱机访问权限,否则访问令牌将过期。换句话说,即使您将Facebook访问令牌存储在cookie中,它最终也会过期,并且用户将被注销。

我最终使用的JavaScript:

    FB.init({
        appId: "myAppID",
        cookie: true, // enable cookies to allow the server to access the session
        xfbml: true, // parse XFBML
        oauth: true // enable OAuth 2.0
    });

    FB.Event.subscribe("auth.login", function(response) {
        // a user logged in who was not previously logged in
        window.location.refresh(true); // ideally modify the page with JS rather than refreshing
    });

    FB.Event.subscribe("auth.logout", function(response) {
        // a user logged out who was previously logged in
        window.location.refresh(true); // ideally modify the page with JS rather than refreshing
    });

    // check if the user is logged in or not, using the Facebook JS SDK
    FB.getLoginStatus(null);

当页面加载时,Facebook JavaScript SDK会检查用户是否已登录。如果用户已登录,并且尚未设置cookie,则会设置。然后,您可以刷新页面(或者,理想情况下,使用JavaScript修改它),服务器将能够使用常规PHP SDK(以及此问题中的第一段代码)访问cookie。

这是我在浏览会话中发现持久登录的最佳方法。

1 个答案:

答案 0 :(得分:4)

这里有两种情况。一种是验证用户,另一种是识别用户。

当您使用任何Facebook API提供的登录方法时,通常会发生的情况是,他们会看到用户是否与Facebook进行了会话。如果不是,则会提示用户登录,以便您可以看到它是哪个用户。在您的情况下,您希望用户始终登录到Facebook。这不是真的可行,因为你需要找出它是哪个用户。您可以使用一些识别详细信息在用户计算机上存储cookie。您需要为用户提供脱机权限,否则用户必须使用API​​登录才能获得新的access_token。

如果您需要我的建议,您应该使用API​​的GetLoginStatus方法来检查用户是否与Facebook进行了会话。如果用户未登录Facebook,则要求他们登录您的网站并不是太多。大多数使用Facebook的用户都存储了他们的登录信息,因此只要他们的浏览器处于打开状态,他们就会一直进行会话。

这将是/它是最好的方式,因为它不要求您询问用户的离线权限,我想许多用户不想给。如果由于某种原因你不能使用这种方法,我建议获得离线许可,然后在他们的计算机上存储一个没有计时器的cookie,这样它就不会被自动删除。

对不起文字的墙,但我希望我有点帮助:)