如何识别我使用的是 Facebook Canvas 还是 Facebook 应用程序的网站版本

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

我正在使用 Facebook 应用程序创建一种 "social sharing" 平台。
网站版使用FacebookAPI、Twitter OAuth和Instagram,canvas版只使用FacebookAPI.

我知道,当使用 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 版本。

我如何才能始终检查我是否在 canvas 中或在注销后不重新加载的网站中?我希望这个问题应该很容易解决,但我还没有想出如何解决。

如果您对更多代码有任何疑问,或者如果我没有像我期望的那样清楚(也很抱歉我的英语),请不要担心问:)

谢谢指教。

Similar/related 问题在这里解决了:Check if site is inside iframe

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