由于需要sfGuardAuth身份验证,Facebook无法与Symfony应用程序通信

时间:2012-07-18 20:03:47

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

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

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

任何帮助都会很棒,因为我很难过,并没有找到任何其他人解决这个问题。

1 个答案:

答案 0 :(得分:4)

嗯,如果你想让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:  ~