【问题标题】:Facebook cannot communicate with Symfony app due to sfGuardAuth authentication required由于需要 sfGuardAuth 身份验证,Facebook 无法与 Symfony 应用程序通信
【发布时间】:2012-07-18 20:03:46
【问题描述】:

我正在 Symfony 1.4 和 Doctrine 1.2 上构建一个音乐网站。我正在尝试在我的页面上集成 facebook 插件(例如,发送、发布消息按钮)。例如,我希望用户能够在我的歌曲模块中的歌曲页面上点赞一首歌曲。但问题是,我使用 sfDoctrineGuard 来保护我的应用程序上除登录页面之外的所有模块。因此,如果用户登录并使用 facebook 的点赞按钮在歌曲页面上点赞歌曲,因为该歌曲模块受 sfGuardAuth 保护,facebook API 无法与之对话并被转发到登录页面。这意味着我的应用上的所有喜欢都会发布到 Facebook 活动源上,就像用户喜欢我的着陆页一样。

有没有办法在 sfGuard 中构建一个异常,以便来自 facebook 域的任何流量都可以访问该页面?有解决方法吗?我希望能够在 facebook 墙上显示我的安全页面中的所有 facebook 元数据,无论喜欢哪一首歌。如果我禁用所有 sfGuard 安全性,它就可以正常工作。

任何帮助都会很棒,因为我很困惑,还没有找到其他人遇到这个问题。

【问题讨论】:

    标签: symfony1 doctrine facebook-like symfony-1.4 sfguard


    【解决方案1】:

    好吧,如果您想允许来自 Facebook 的请求能够绕过您的 sfGuard 安全性,这可能是一个巨大的安全漏洞。如果有人在 Facebook 上点击该链接,则无需登录即可访问您的网站。

    您可以通过调整抓取您页面的 Facebook 机器人来解决问题。爬虫的用户代理是:"facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"。因此,通过查看用户代理可以很容易地允许访问其请求。 但是,今天任何人都可以轻松欺骗用户代理。

    也许你必须找到其他方法。我想有一种简单的页面,每个人都可以访问,并且在其中显示最少的信息(比如只有艺术家和歌曲名称而无法播放。但只是为了确保,如果有人没有登录尝试查看页面,它不会重定向到登录页面,而是重定向到这个轻量级页面。你明白了吗?

    然后,您可以放置​​一个巨大的按钮,让新人注册以查看完整页面。

    无论如何,无论如何你都会发现,你应该使用过滤器(在filters.yml)来实现它。过滤器在任何操作之前执行。所以这是进行此类检查的理想场所。

    您将找到有关过滤器的信息:

    • official website 上(它们是 2 个链接)
    • here ssl 要求的实现(对不起,googlecache 页面)
    • here 一个基本实现

    编辑:

    我会那样做的。首先,创建一个名为“facebook bot”的用户,并将其id放入/apps/frontend/config/app.yml

    all:
       facebook_bot_id: 56 // sf_guard_user_id
    

    然后创建一个简单的过滤器lib/filter/facebookBotFilter.php

    <?php
    
    class facebookBotFilter extends sfFilter
    {
      public function execute ($filterChain)
      {
        $context    = $this->getContext();
        $controller = $context->getController();
        $request    = $context->getRequest();
        $user       = $context->getUser();
    
        // get the user agent
        $pathArray = $request->getPathInfoArray();
        $useragent = isset($pathArray['HTTP_USER_AGENT']) ? $pathArray['HTTP_USER_AGENT'] : '';
    
        if (preg_math('/facebookexternalhit', $useragent))
        {
          $member = Doctrine_Core::getTable('sfGuardUser')->find(sfConfig::get('app_facebook_bot_id'));
          // logged in the facebook bot
          $user->signIn($member);
        }
    
        // execute next filter
        $filterChain->execute();
      }
    }
    

    别忘了启用apps/frontend/config/filters.yml中的过滤器:

    rendering: ~
    
    facebookBotFilter:
      class: facebookBotFilter
    
    security:  ~
    

    【讨论】:

    • 非常感谢@j0k 的全面回复。欣赏它。你给了我一些很好的选择来考虑。如果有人获得阅读安全页面的访问权限,这对我的应用程序来说没什么大不了的。登录更多地用于自定义/特定于用户的操作。我想尝试允许访问 Facebook 机器人抓取工具。我将如何配置 sfDoctrineGuard 以允许机器人访问?我在哪里放类似:if ($_SERVER['HTTP_USER_AGENT'] == "facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"){ &lt;allow access&gt; } 谢谢!
    • 哇,我试过了,效果很好!非常感谢 play j0k 的演出。注意:修正了以下行的一些小错别字:(preg_match('/facebookexternalhit', $useragent))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多