在PHP的选项卡页面上请求facebook权限

在PHP的选项卡页面上请求facebook权限,php,facebook,facebook-graph-api,Php,Facebook,Facebook Graph Api,我有一个facebook pagetab应用程序,我被困在以下情况 我需要检查用户是否登录 如果没有,则重定向到具有user\u likes、publish\u actions、email权限的登录url 用户是否喜欢这个页面 如果不喜欢,则显示“喜欢”门 现在在上面,我被困在FB pagetab(iFRAM)中的以下错误中 拒绝在框架中显示“…c8682d9a9fb5b&sdk=php-sdk-4.0.9&scope=email%2Cuser \%2Cpublish \%2Cpublish \

我有一个facebook pagetab应用程序,我被困在以下情况

我需要检查用户是否登录

如果没有,则重定向到具有
user\u likes、publish\u actions、email
权限的登录url

用户是否喜欢这个页面

如果不喜欢,则显示“喜欢”门

现在在上面,我被困在FB pagetab(
iFRAM
)中的以下错误中

拒绝在框架中显示“…c8682d9a9fb5b&sdk=php-sdk-4.0.9&scope=email%2Cuser \%2Cpublish \%2Cpublish \'actions”,因为它将“X-frame-Options”设置为“DENY”

现在我想用JSSDK实现这个流程,获取访问令牌,然后使用ajax调用将其传递给php代码

有没有更好的办法来解决这个问题

这是密码

try {
    $session = $helper->getSessionFromRedirect();
} catch(FacebookRequestException $ex) {
    error_log($ex->getCode());
    error_log($ex->getMessage());
} catch(\Exception $ex) {
    error_log($ex->getCode());
    error_log($ex->getMessage());
}
if($_GET['error']=="access_denied"){
    header("location:/login/");
    exit;
}else if (isset($session) || (isset($_SESSION['fb_user_session_access_token'])) && !empty($_SESSION['fb_user_session_access_token'])) {
    if(isset($session))
        $_SESSION['fb_user_session_access_token'] = $session->getToken();
    else{
        $access_token = $_SESSION['fb_user_session_access_token'];
        $session = new FacebookSession($access_token);
    }

    try {
        $user_profile = (new FacebookRequest(
        $session, 'GET', '/me'
        ))->execute()->getGraphObject(GraphUser::className());
        $email =  $user_profile->getProperty('email');
        $name =  $user_profile->getProperty('name');
        $fb_id =  $user_profile->getProperty('id');
        $query = mysql_query("select id, email from ntuc_users where email = '$email'");
        $user_found = mysql_num_rows($query);
        if(!$user_found){
        //code deleted
        exit;
    } catch(FacebookRequestException $e) {
        error_log($e->getCode());
        error_log($e->getMessage());
        //if token get expired
        $loginUrl = $helper->getLoginUrl(array('req_perms' => 'email'));
        header("location:".$loginUrl);
        exit;
    }
}
else
{
  $loginUrl = $helper->getLoginUrl(array('req_perms' => 'email'));
  header("location:".$loginUrl);
  exit;
}

感谢高级

经过两天的研究,我得到了这个。。下面是我为我的应用程序实现的流程

@比约恩凯泽提到Facebook的政策不再支持LIKEGATE。。这是真的

因此,我已通过FB政策,并获得以下ans 只鼓励某人登录你的应用程序,如你的应用程序页面,在你的应用程序页面上输入促销,或在某个地方登记。不要鼓励其他行动。自2014年11月5日起生效,您可能不再鼓励人们喜欢您的应用程序页面


然而,参考上述信息,我试图通过FB应用程序审查团队实施likegate flow,但FB运气不佳

但我又从评审组得到了一个裁判 请注意,使用“user_likes”检查是否有人喜欢你的Facebook用例是不可接受的。User_likes为一个人的所有喜好提供信息,所有这些数据都应用于增强应用程序体验。如果您需要确定谁已经喜欢您的页面,请使用已签名的页面选项卡应用请求

使用
签名请求
,至少对于pagetab来说,它就像一个符咒:)。。但对于手机网站,我已经删除了它

代码如下:

        if( isset($_REQUEST['signed_request']) )
        {
            $user_data = $this->parse_signed_request($_REQUEST['signed_request']);
            $access_token = $_SESSION['fb_user_session_access_token'];
        }
        if( (isset($user_data['page']["liked"]) && !empty($user_data['page']["liked"]) && $user_data['page']["liked"]) || $this->deviceType != "computer")//no like gate for mobile
        {
            //my code ...
        }


private function parse_signed_request($signed_request) {
    list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

    $secret = FB_APP_SECRET; // Use your app secret here

    // decode the data
    $sig = $this->base64_url_decode($encoded_sig);
    $data = json_decode($this->base64_url_decode($payload), true);

    // confirm the signature
    $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
    if ($sig !== $expected_sig) {
        $this->log->write('Bad Signed JSON signature!');
    return null;
    }

    return $data;
}

private function base64_url_decode($input) {
    return base64_decode(strtr($input, '-_', '+/'));
}

我希望它能帮助其他人…

关于类似的门,停止你现在正在做的事情。从11月5日起,这将违反平台政策,2014@BjörnKaiser你能解释一下什么是错的吗??首先,你正在构建的(比如门控应用程序)是违反Facebook平台政策的,其次:你需要提交用户的“喜欢”和“发布”权限以供批准,由于上述原因,您的应用程序至少不会批准用户的喜好。这更多的是供参考,而不是解决您的问题,但这正是评论的目的,我只想为您节省一些工作;-)