使用Facebook JS SDK,我如何轻松验证和使用PHP SDK?

时间:2015-09-23 21:29:54

标签: javascript php facebook facebook-graph-api facebook-php-sdk

我已经使用PHP和JS SDK构建了一个Facebook应用程序,但感觉好像我构建它的方式完全错误,但我很难找到任何明确的答案(并且在阅读之后)关于这一点的一些帖子和评论,我并不孤单。)

这是使用CodeIgniter和SDK 5.0.0的Canvas应用程序。

我对此应用程序的FB有一些要求:

  • 将用户登录,并让他们在会话期间保持登录状态
  • 检查登录状态,如果他们因任何原因退出(会议结束或许?),JS SDK应该重新提示登录,不允许进一步的进展(这可以在页面重新加载时发生)
  • 访问PHP中的/me以获取各种位和bob

我目前在每个页面都有以下JS:

window.fbAsyncInit = function() {
    FB.init({
        appId      : '#####',
        xfbml      : true,
        cookie     : true,
        version    : 'v2.4'
    });

    loaded();

    FB.Canvas.startTimer();

    FB.getLoginStatus(function(response) {
        // Check login status on load, and if the user is
        // already logged in, go directly to the welcome message.
        if (response.status == 'connected') {
            // Logged in already
        } else {
            // Otherwise, ask them to log in
            window.top.location = '/login.php';
        }
    });
};

工作正常。 Login.php有一些处理登录的JS,它也很有用。

问题出现在PHP上。我有一个控制器,它扩展到应用程序的每个页面。对于这么简单的事情来说,这似乎非常复杂和过于复杂。这里的PHP产生了很多问题,尽管它最初工作,这使得调试非常困难。所有返回的错误都围绕着被访问的错误 - 有时"不存在',其他时间'无效'以及许多类似的错误。

我真的很难继续前进,所以我们将不胜感激任何帮助,使以下更简单。除主页和登录页面外,每个页面都会调用它:

function handle_facebook()
{
    $this->fb = new Facebook\Facebook([
        'app_id' => $this->data['app']->fb_app_id,
        'app_secret' => $this->data['app']->fb_app_secret,
        'default_graph_version' => 'v2.2',
    ]);

    $helper = $this->fb->getCanvasHelper();
    $jsHelper = $this->fb->getJavaScriptHelper();

    if(!empty($_SESSION['accessToken'])){
        $accessToken = $_SESSION['accessToken'];
    } else {
        try {
            $accessToken = $jsHelper->getAccessToken();
        } catch(Facebook\Exceptions\FacebookResponseException $e) {
            // When Graph returns an error
            echo 'Graph returned an error: ' . $e->getMessage();
        } catch(Facebook\Exceptions\FacebookSDKException $e) {
            // When validation fails or other local issues
            echo 'Facebook SDK returned an error: ' . $e->getMessage();
        }

        if (! isset($accessToken)) {
            echo 'No OAuth data could be obtained from the signed request. User has not authorized your app yet.';
        } else {
            $_SESSION['accessToken'] = $accessToken;
        }
    }

    try {
        // Returns a `Facebook\FacebookResponse` object
        $response = $this->fb->get('/me?fields=id,name', $accessToken);
        $this->user = $response->getGraphUser();
    } catch(Facebook\Exceptions\FacebookResponseException $e) {
        echo 'Graph returned an error: ' . $e->getMessage();
    } catch(Facebook\Exceptions\FacebookSDKException $e) {
        echo 'Facebook SDK returned an error: ' . $e->getMessage();
    }

    return true;
}

对我而言,感觉好像我真正需要的是一个独立的JS文件,可以放在需要登录的每个页面上,检查用户仍然登录的日志,如果不是,则提示登录。此外,我觉得从PHP访问SDK应该同样简单,通过从JS Canvas帮助程序获取accessToken并将其存储在会话中,假设一个已经存在。

我哪里错了?我觉得我错过了一个步骤,或者对那些更熟悉Canvas app auth的人显而易见。

0 个答案:

没有答案