2012-07-18 70 views
1

我正在Symfony 1.4和Doctrine 1.2上構建一個音樂網站。我正在嘗試在我的頁面上整合Facebook插件(如發送,發佈消息按鈕)。例如,我希望用戶能夠在歌曲模塊的歌曲頁面中欣賞歌曲。但問題是,我已經使用sfDoctrineGuard來保護除應用着陸頁之外的所有模塊。因此,如果用戶登錄並使用Facebook like按鈕來欣賞歌曲頁面上的歌曲,由於該歌曲模塊受sfGuardAuth保護,因此Facebook API無法與其通話並轉到目標頁面。這意味着我的應用中的所有喜歡都會發布在Facebook活動Feed上,就好像用戶喜歡我的着陸頁一樣。由於需要sfGuardAuth身份驗證,Facebook無法與Symfony應用程序通信

有沒有辦法在sfGuard中構建一個異常,以便來自facebook域的任何流量都可以訪問該頁面?有沒有解決這個問題的方法?我希望能夠在我的受保護頁面上顯示所有Facebook元數據,無論您喜歡哪首歌,都可以在臉書牆上顯示。如果我禁用所有sfGuard安全性,它會正常工作。

任何幫助將是偉大的,因爲我難倒,並沒有發現任何其他人與這個問題。

回答

4

那麼,如果你想讓Facebook的請求能夠通過你的sfGuard安全性,它可能是一個巨大的安全漏洞。如果有人在Facebook上點擊該鏈接,它也將訪問您的網站,而無需登錄。

您可能會發現一個通過調整Facebook bot來刮擦您的頁面的工作。刮刀的用戶代理是:"facebookexternalhit/1.1 (+http://www.facebook.com/externalhit_uatext.php)"。因此,通過查看用戶代理可以輕鬆地訪問其請求。 但是,今天任何人都可以輕易欺騙用戶代理。

也許你必須找到另一種方式。我雖然關於一種輕量級的頁面,每個人都可以訪問,並且在其中顯示最低限度的信息(比如只有藝術家和歌曲名稱,但不能播放它),但要確保如果某人未登錄嘗試查看頁面,它不會被重定向到登錄頁面,而是重定向到這個輕量頁面。您可以獲得該點嗎?

然後,您可以放一個巨大的按鈕,以允許新人註冊以查看整頁。

無論如何,在任何情況下,你會發現,你應該使用過濾器(在filters.yml)實現它。過濾器的任何行動之前被執行。因此,它是對這種檢查的理想場所。

你會˚F有關過濾器IND信息:

  • officialwebsite(他們是2個鏈接)
  • here的SSL要求的實施(遺憾一googlecache頁)
  • here基本實現

編輯:

我會繼續這樣下去。首先,創建一個名爲「Facebook的殭屍」用戶,並把它的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: ~ 
+0

非常感謝@ j0k的全面回覆。欣賞它。你給了我一些很好的選擇來考慮。如果有人獲得閱讀安全頁面的權限,那麼這對我的應用程序來說並不算什麼。該登錄更多用於定製/用戶特定操作。我想嘗試允許訪問Facebook bot刮板。我如何配置sfDoctrineGuard以允許訪問機器人?我在哪裏可以這樣寫: 'if($ _SERVER ['HTTP_USER_AGENT'] ==「facebookexternalhit/1.1(+ http://www.facebook.com/externalhit_uatext.php)」){<允許訪問> 謝謝! – frankp221 2012-07-19 17:42:58

+0

我已更新我的答案。 – j0k 2012-07-24 08:49:55

+0

哇,我試過了,它的作用就像一個魅力!非常感謝玩玩j0k。 注意:在下面一行修正了一些小的錯別字:'(preg_match('/ facebookexternalhit',$ useragent))' – frankp221 2012-07-26 06:19:19

相關問題