【问题标题】:How to authorize Facebook app using redirect in canvas?如何在画布中使用重定向授权 Facebook 应用程序?
【发布时间】:2013-06-28 01:01:26
【问题描述】:

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

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

$("#loginButton").click(function(e) {
    FB.login(function(response) {
        if (response.perms) {
            perms();
        }
}, {perms : 'publish_stream'});

但是弹出窗口应该是不必要的额外点击,因为我看到的每个其他应用程序都在向您显示登录页面之前请求授权。像这样:

http://i.imgur.com/yBGzL.png

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

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");

但是所有这些都没有显示授权请求的内容,而是显示如下链接:

http://i.imgur.com/bLwPQ.png

有趣的是,如果我在新标签页中打开 iframe 的地址,我会得到我想要的授权请求。但我希望它立即显示,无需额外点击,就像其他所有应用一样。

这是一个应用程序示例,它以重定向形式一次性完成授权和请求权限,甚至在显示登录页面之前:

www.facebook.com/send.fortune.cookies

他们做得怎么样?

【问题讨论】:

    标签: facebook redirect authorization


    【解决方案1】:

    我知道这已经有几个月的历史了……但这是为画布添加权限检查应该做的事情。

    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);
    }
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这行得通,但现在用户最终到达了我的画布 URL,而不是应用程序 URL,而我的页面位于 iframe 中:s
      • @Brandon 是的,它不想将您转发到应用页面,而是直接转到画布 url。当我遇到这个问题时,我找不到比自己将用户重定向到应用程序 url 更好的解决方案(服务器端重定向现在可以工作)。您可以通过检查请求参数来检测是授权后重定向调用还是常规应用调用。如果是授权重定向,它应该包含一些独特的参数,如auth_token,这些参数在常规调用中不存在。如果您检测到这些 - 重定向到应用网址。
      • 谢谢!关注 FB 很多喜欢帧内身份验证对话框。
      【解决方案3】:

      使用 FB Javascript SDK,可以做到--

      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");
            }
      

      【讨论】:

        【解决方案4】:

        也许这有帮助:

            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
        }
        

        【讨论】:

        • 这是针对特定应用程序的。一般的东西将包含所需的请求权限以及其他东西。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多