如何识别如果我';我使用的是Facebook Canvas或Facebook应用程序的网站版本


How to recognize if I'm using Facebook Canvas or Website version of Facebook App

我正在使用Facebook应用程序创建一种"社交共享"平台
网站版使用Facebook API、Twitter OAuth和Instagram,画布版仅使用Facebook API。

我知道,当使用Canvas时,Facebook会发送一个signed_request参数,它实际上识别出我使用的是Canvas版本,而不是网站版本。所以,这是我的登录代码:

login.php

$is_canvas=$SController->checkIsCanvas();
if(isset($_REQUEST['request_ids'])) {
    $_SESSION['auth_request']=strip_tags($_GET['request_ids']);
}

socialclass.php

function checkIsCanvas() {
        $helper = new FacebookCanvasLoginHelper();
        try {
            $session = $helper->getSession();
        } catch (FacebookRequestException $ex) {
            return $ex->getMessage();
        } catch ('Exception $ex) {
            return $ex->getMessage(); 
        }
        if ($session) {
            $_SESSION['is_canvas']='true';
            $accessToken=$session->getAccessToken();
            $_SESSION['auth_tk_facebook']=$accessToken->__toString();
            $request = new FacebookRequest(
                $session,
                'GET',
                '/me?fields=id,name,first_name,last_name,birthday,email,age_range,location,gender'
            );
            $response = $request->execute();
            $userProfile = $response->getGraphObject(GraphUser::className());
            if(isset($userProfile)) {
                $login=$this->checkFacebookLogin($userProfile);
                if($login===false) {
                    return $userProfile;
                } else {
                    header("Location:".getBASEURL());
                }
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

问题是,当我从canvas注销然后重新登录时,Facebook没有发送任何signed_request参数,所以我无法识别我实际上是在使用canvas版本还是网站的版本。为了暂时解决这个问题,我只是重新加载页面,这样Facebook就可以保存另一个signed_request,但这很烦人。

当我从Canvas版本转到网站版本而没有注销时,也会出现这个问题。显然,is_canvas会话变量没有取消设置,因此website版本看起来与Canvas版本相同。

如何在注销后不重新加载的情况下始终检查我是在画布中还是在网站中?我希望这个问题应该很容易解决,但我还没想好怎么解决。

如果你对更多的代码有任何问题,或者如果我没有像我预期的那样清楚(也为我的英语感到抱歉),不要担心问:)

谢谢你的建议。

类似/相关问题在此解决:检查站点是否在iframe 内

因为canvas总是在iframe中调用。请检查是否有帮助。