【问题标题】:facebook connect api static urlfacebook 连接 api 静态网址
【发布时间】:2011-05-30 17:59:39
【问题描述】:

有没有办法以静态方式使用 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 是什么?

【问题讨论】:

    标签: php facebook facebook-php-sdk


    【解决方案1】:

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

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

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

    【讨论】:

    • 对不起,您不理解我的问题,我只想将 facebook php sdk 包含在 facebook-login.php 中,这是我制作的 redirect_uri。我将编辑我的问题以获取更多详细信息。
    • 不,我只是告诉您如何动态构建静态链接,以便您可以复制和粘贴它;)在您加载 sdk 并回显之后,只需复制链接 href 然后转不包括在内:)
    • 好的,看看我的编辑,告诉我这些值和通常那个 url 是否总是相同或改变? (主要是“状态”参数,因为其他参数是我预先定义的)
    • 是的,那里没有会改变的值,那就是你的静态登录网址
    • 我刚刚用 IE 浏览了这个页面,除了 "state" 参数值不同之外,一切都和 FF 一样
    【解决方案2】:

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

    在使用此访问令牌进行 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>';
        }
    }
    

    希望有帮助!

    【讨论】:

      【解决方案3】:

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

      如果您想将生成 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。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-26
        • 2013-11-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多