Facebook - 如何使用 iframe 应用直接进入请求权限对话框?

Posted

技术标签:

【中文标题】Facebook - 如何使用 iframe 应用直接进入请求权限对话框?【英文标题】:Facebook - how to go directly to the request permission dialog with an iframe app? 【发布时间】:2011-05-21 21:18:15 【问题描述】:

当用户通过http://apps.facebook.com/myappxxxxx 访问我的 Facebook 应用程序时,我希望它立即显示请求权限 fb 对话框 - 就像许多其他人一样。

我尝试了各种方法——包括使用 getLoginUrl 的 php 重定向,使用相同的 javascript 窗口位置重定向。

问题是它显示了一个大的 facebook 图标而不是请求权限。但是,如果您单击该图标,它实际上会转到正确的请求权限页面!

有人知道如何正确重定向到 facebook 权限页面吗?

我正在将 PHP api 和 JavaScript SDK 与 iFrame FB 应用程序一起使用。

【问题讨论】:

【参考方案1】:

不久前我遇到了完全相同的问题。这是一个小技巧:

if(!$me)   
    $url =   "https://graph.facebook.com/oauth/authorize?"
                ."client_id=YOUR_APP_ID&"
                ."redirect_uri=http://apps.facebook.com/APP_SLUG/&"
                ."scope=user_photos,publish_stream";
    echo "<script language=javascript>window.open('$url', '_parent', '')</script>";
 else 
    your code...

它在我的代码中的样子(有点脏,我有一个截止日期):

require_once 'facebook-php-sdk/src/facebook.php';

$appid = '';

$facebook = new Facebook(array(
  'appId'  => $appid,
  'secret' => '',
  'cookie' => true,
));

$session = $facebook->getSession();

$me = null;
if ($session) 
  try 
    $uid = $facebook->getUser();
    $me = $facebook->api('/me');
   catch (FacebookApiException $e) 
    error_log($e);
  

if(!$me) 
    // here we redirect for authentication:
    // This is the code you should be looking at:
    $url =   "https://graph.facebook.com/oauth/authorize?"
            ."client_id=$appid&"
            ."redirect_uri=http://apps.facebook.com/APP_SLUG/&"
            ."scope=user_photos,publish_stream";
    ?>
    <!doctype html>
    <html xmlns:fb="http://www.facebook.com/2008/fbml">
        <head>
            <title>Göngum til góðs</title>
            <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
            <script language=javascript>window.open('<?php echo $url ?>', '_parent', '')</script>
        </head>

        <body>
            Loading...
        </body>
    </html>

    <?php
    exit;
 else 
    your code ...

简单的标头重定向不起作用,因为它只会重定向您的 iframe。访问 _parent 窗口需要 Javascript。

编辑

请记住,有一种正确的方法可以做到这一点(见下面的答案),我不建议这样做。但是,嘿,你的船有什么...

【讨论】:

最后,是的,这行得通。我还使用 PHP api 来获取 loginurl : $loginUrl = $facebook->getLoginUrl();并将 $url 设置为那个。 问题 - 使用 window.top.location.href 与 window.open (_parent) 有区别/优势吗? 仅供参考 - 我必须手动构建 URL,而不是使用 getLoginUrl,因为它重定向到我的网站而不是 fb 应用程序 url。 我猜 window.top.location.href 应该是一样的。是的,我还发现$facebook-&gt;getLoginUrl(); 是无用的。 我后来发现你可以使用 getLoginUrl() 只要你指定“下一个”和其他 url 并放入你的 apps.facebook... url【参考方案2】:

为什么不试试Facebook authenticated referrals?这是解决此类问题的正确方法。因为它要求 Facebook 捕获未连接的用户并将他们直接重定向到连接页面。

这可确保所有用户默认连接到您的应用。

【讨论】:

这是真正的答案。投票最多的是黑客,因此可能会导致临时禁令。 Facebook 删除了 Facebook 认证推荐。太糟糕了!【参考方案3】:

这是另一个选择:

<script>
    (function () 
        var url = 'your_permission_url';
        window.top.location.href = url;
     ());
</script>

【讨论】:

【参考方案4】:

url 应该来自 getLoginUrl($PARAMS)。它对我有用。 在你的情况下,

$PARAMS = array('scope' => 'user_photos,publish_stream', redirect_uri => 'https://apps.facebook.com/myappxxxxx');

【讨论】:

【参考方案5】:

当我如下更改网址时,它起作用了!!!!!!

if(!$me)   
    $url =   "https://www.facebook.com/dialog/oauth?"
                ."client_id=YOUR_APP_ID&"
                ."redirect_uri=http://apps.facebook.com/APP_SLUG/&"
                ."scope=user_photos,publish_stream";
    echo "<script language=javascript>window.open('$url', '_parent', '')</script>";
 else 
    your code...

感谢你的帖子

【讨论】:

以上是关于Facebook - 如何使用 iframe 应用直接进入请求权限对话框?的主要内容,如果未能解决你的问题,请参考以下文章

Facebook 如何在画布页面上为 iFrame 设置跨域 cookie?

Facebook 如何发布 json 并在 iframe 中加载响应?

iframe 选项卡 Facebook 应用程序显示在新页面上,而不是在 iframe/facebook-canvas 内

如何从 iframe 重新加载最顶部的窗口?

在 Facebook 应用程序选项卡中将值传递给 iframe

iFrame 是好是坏? [复制]