3

有没有办法以静态方式使用 facebook connect api?

当我们使用 facebook php sdk 时,登录 facebook 的链接或按钮类似于https://www.facebook.com/dialog/oauth ......

我想要的是消除每个页面上 php sdk 的包含,因为它会在高峰时间导致一些额外的处理和服务器负载。

我想进行会话检查以了解用户是否已登录,例如检查他的 facebook 用户 ID 和姓名是否存储在会话中,如果没有,则显示静态登录按钮。然后在使用 facebook 登录后,他会进入 facebook-login.php,其中将包含 facebook php sdk 并处理他的数据并将它们存储在会话中,这样他就可以保持登录状态,而不会在每个页面中包含 php sdk。

我用 $facebook->getLoginUrl() 得到的 url 结构是:

https://www.facebook.com/dialog/oauth?client_id= {MY_APP_KEY}&scope={PERMISSIONS}&redirect_uri={MY_SITE/facebook-login.php}&state={A_32_CHAR_CODE_LIKE_MD5_MAYBE}

最后一个问题是:登录按钮中的 URL 是什么?

4

3 回答 3

0

只需加载 sdk 并执行以下操作:

echo '<a href="' . $facebook->getLoginUrl( array('next'=>'http://mysite.com', 'req_perms' => 'email,read_stream,publish_stream')) . '">Connect to Facebook</a>';

该网址对于已注销的用户将始终有效

于 2011-05-30T18:08:47.540 回答
0

这是一个很好的问题。首先,用户登录到您的应用意味着您拥有该用户的有效访问令牌

在使用此访问令牌进行 API 调用之前,无法确定访问令牌是否有效。因此,如果您想确保用户仍然在每个页面上登录,您必须在每个页面上对 Facebook 进行 API 调用。有点重,但没有其他解决方案。

您可以做的是假设您拥有的访问令牌是有效的,并且只检查一次(当您确实需要确保用户已登录时)。

你可以有不同的场景:

  • 没有关于用户的 Facebook 数据:用户肯定没有登录你的应用程序。

  • 您可以读取用户 ID,但您可能没有该用户的访问令牌:该用户可能未登录。

  • 您可以读取访问令牌,但它可能无效(已过期或被用户撤销):用户可能未登录。

  • 您有一个有效的访问令牌:用户肯定已登录。

您可以在会话中读取用户 ID 和访问令牌。会话数组如下所示:

[fb_148195765253871_access_token] => 14819576525...
[fb_148195765253871_user_id] => 1536397056

数组键中的数字(此处148195765253871)是您的应用 ID。

因此,您可以在每个页面上执行的操作是检查这些密钥是否已设置,如果未设置,请加载 SDK 并仔细检查(因为访问权限可以存储在 SDK 正在读取的其他一些地方):

if (isset($_SESSION['fb' . YOUR_APP_ID . 'access_token'])) {
    // assume to user is logged in
    // and keep going
} else {
    require "facebook.php";
    $facebook = new Facebook(array(
        'appId'  => YOUR_APP_ID,
        'secret' => YOUR_APP_SECRET,
    ));

    // Make an API call to be sure the user is logged in
    // ie : that you have a valid access token
    $user = $facebook->getUser(); // User ID
    if ($user) {
        try {
            $user_profile = $facebook->api('/me');
        } catch (FacebookApiException $e) {
            $user = null;
        }
    }

    if ($user) {
        // The user is logged in for sure
    } else {
        // The user is not logged in for sure
        // Make him log in
        echo '<a href="' . $facebook->getLoginUrl() . '">Login with Facebook</a>';
    }
}

希望有帮助!

于 2011-05-31T00:47:40.147 回答
0

所选答案并未真正回答问题。

如果您想将生成 getLoginUrl 函数调用所需的所有 Facebook 代码隔离到一个单独的文件中,您可以使用元刷新轻松完成此操作。

因此,在您的标题中将链接“使用 Facebook 登录”指向“facebook_login.php”。在此页面上包括来自 SDK 的必要调用 getLoginUrl,然后添加以下 HTML 行。

<meta http-equiv="refresh" content="0;URL=<?=$helper->getLoginUrl(array('email', 'user_friends'));?>">

我对此进行了多次测试,并且可以正常工作。

仅供参考,使用 Facebook SDK 4.0。

于 2014-10-14T03:16:03.147 回答