如何在画布中使用重定向授权Facebook应用程序?

如何在画布中使用重定向授权Facebook应用程序?,facebook,redirect,authorization,Facebook,Redirect,Authorization,我正在尝试制作Facebook应用程序,但我在画布内的重定向方案中无法获得授权 使用javascript api,我可以很容易地在弹出模式中工作: $("#loginButton").click(function(e) { FB.login(function(response) { if (response.perms) { perms(); } }, {perms : 'publish_stream'}); 但是弹出窗口应该是不

我正在尝试制作Facebook应用程序,但我在画布内的重定向方案中无法获得授权

使用javascript api,我可以很容易地在弹出模式中工作:

$("#loginButton").click(function(e) {
    FB.login(function(response) {
        if (response.perms) {
            perms();
        }
}, {perms : 'publish_stream'});
但是弹出窗口应该是不必要的额外点击,因为我看到的每个其他应用程序都会在显示登录页之前请求授权。像这样:

我想他们只是在使用重定向方案。所以我花了一整天的时间尝试我能找到的不同方法:

header("Location: https://graph.facebook.com/oauth/authorize?client_id=" . $gAppId . "&redirect_uri=" . urlencode($gUrl) . "&perms=publish_stream");

header("Location: http://www.facebook.com/login.php?v=1.0&api_key=" . $gApiKey . "&next=" . urlencode($gUrl) . "&canvas=");

header("Location: http://www.facebook.com/connect/uiserver.php?app_id=" . $gAppId . "&next=" . urlencode($gUrl) . "&return_session=0&fbconnect=0&canvas=1&legacy_return=1&method=permissions.request");
但它们都没有显示授权请求内容,而是显示如下链接:

有趣的是,如果我在一个新选项卡中打开iframe的地址,我会得到我想要的授权请求。但我希望它能像其他应用一样,不需要额外的点击就立即显示出来

以下是一个应用程序的示例,该应用程序以重定向形式一次性执行授权和请求权限,甚至在显示登录页之前:

www.facebook.com/send.fortune.cookies


他们是怎么做到的?

问题是服务器端重定向只是重定向你的内部应用程序框架,而不是重定向整个页面,Facebook不喜欢在框架内显示他们的系统对话框

您将需要一些客户端重定向,可能是这样的:

<script>
    <?php 
        if($doRedirect) {
            echo 'top.location="http://redirect_url";';
        }
    ?>
</script>

我知道这已经有几个月了。。。但这是向画布添加权限检查时应该执行的操作

if ($session) {
  try {
    $uid = $facebook->getUser();
    $me = $facebook->api('/me');
    $accesstoken=$session['access_token'];
  } catch (FacebookApiException $e) {
    error_log($e);
  }
} 

if($me)
{
   // do what you have to do
}else {
    $loginUrl = $facebook->getLoginUrl(
        array(
            'canvas' => 1,
            'fbconnect' => 0,
            'req_perms' => 'publish_stream'
        )
    );
    echo '<script>top.location="'.$loginUrl.'";</script>';
    //echo '<fb:redirect url="' . $loginUrl . '" />';
   //header('Location: '.$loginUrl);
}
if($session){
试一试{
$uid=$facebook->getUser();
$me=$facebook->api('/me');
$accesstoken=$session['access_token'];
}捕获(FacebookApiException$e){
错误日志($e);
}
} 
如果($我)
{
//做你必须做的事
}否则{
$loginUrl=$facebook->getLoginUrl(
排列(
“画布”=>1,
“fbconnect”=>0,
'req_perms'=>'publish_stream'
)
);
echo“top.location=“”.$loginUrl.”“;”;
//回声';
//标题('位置:'。$loginUrl);
}
也许这有助于:

    if(!$facebook->api_client->users_isAppUser())
{
    ?>
    <fb:redirect url="http://www.facebook.com/login.php?v=1.0&api_key=111111111111&next=http%3A%2F%2Fapps.facebook.com%2Fapp_name%2F&canvas=&req_perms=publish_stream"/>
    <?php
}
if(!$facebook->api\u client->users\u isAppUser())
{
?>

使用FB Javascript SDK,可以执行以下操作--


这是可行的,但现在用户在iframe中的页面位于我的画布URL而不是应用程序URL:s@Brandon是的,它不想将您转发到应用程序页面,而是直接转到画布url。当我遇到此问题时,我找不到比自己将用户重定向到应用程序url更好的解决方案(服务器端重定向现在可以工作了)。您可以通过检查请求参数来检测它是授权后重定向调用还是常规应用程序调用。如果是授权重定向,它应该包含一些常规调用中不存在的唯一参数,如
auth_token
。如果您检测到这些参数,请重定向到应用程序url。谢谢!关注FB lot liking in-frame auth dialog。这是针对特定应用程序的。常规内容将包含所需的req权限以及其他内容。
FB.getLoginStatus(function(response) {
      if (response.status === 'connected') {
         loggedIn(response);
      } else {
        top.location = encodeURI("https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_APP_URI&response_type=token");
      }