2012-06-07 83 views
0

我有一個問題,PHP Facebook的SDK。 我已經閱讀了許多文章談論同樣的問題(訪問令牌無效,重定向循環等),但沒有人可以幫助。Facebook的OpenGraph與Yii框架 - 身份驗證問題

簡單地說,我的項目是如何設計:

它是指僅與登錄Facebook的用戶運行一個Facebook應用程序。 使用Yii Framework,我創建了一個過濾器,每次加載頁面時都會調用該過濾器,以確保只有通過Facebook登錄的用戶才能看到內容。 它應該與Facebook上的應用程序BranchOut完全相同。

我的問題,以及如何重現它:

  • 我登錄到使用來自Facebook(OAuth的,訪問令牌)典型的登錄過程
  • 我手動註銷Facebook頁面上我的應用程序,然後嘗試在我的應用程序上執行新操作
  • 過濾器檢查我是否在Facebook上登錄,並且因爲我沒有登錄,它會將我重定向到Facebook登錄頁面。
  • 我再次登錄到Facebook後,我得到了Facebook和我的應用程序過濾器之間的典型無限循環。

這裏是我的過濾器的代碼:

$fb_logged = false; 
try 
{ 
    $user = Yii::app()->facebook->getUser(); 
    $me = Yii::app()->facebook->api('/me'); 
    $fb_id = $me['id']; 
    $fb_logged = true; 
} 
catch (Exception $e) 
{ 
    $fb_logged = false; 
} 

if($fb_logged) 
{ 
    print_r($fb_id. ' has logged'); 
    /* Check if user exists on MyApp 
    ... */ 
} 
// If user NOT logged on FB, send him to the FB login page 
else 
{ 
    $loginUrl = Yii::app()->facebook->getLoginUrl(array(
       'redirect_uri' => Yii::app()->getRequest()->getUrl() // I have tried many things here. 
     )); 
    echo("<script> top.location.href='" . $loginUrl . "'</script>"); 
    Yii::app()->end(); 
} 

究竟是什麼發生的事情是,在FB登錄後,過濾器再次被調用,因爲同樣的URL請求。此時,api('/ me')調用會產生一個異常,因爲它找不到任何有效的訪問令牌,並開始循環。

我可以補充一點,我的配置是好的(或似乎是),我已根據Facebook的應用程序設置檢查了我所有的網址,域名。 我也嘗試了很多東西,像重定向到一個新的特定的URL,但無論如何,我需要使用過濾器,因爲我想確保這仍然是相同的用戶(或因此如果用戶已更改)。

唯一可行的是將用戶重定向到沒有Filter的頁面(沒有調用API(「/ me」))。然後,用手點擊應用程序中的新鏈接,然後找到訪問令牌。這不是我想要的行爲。

我真的很希望有人能幫助我!

在此先感謝。

+0

你到目前爲止發現了什麼問題。我遇到了同樣的問題 –

回答

1

新的登錄嘗試後,您應該在重定向到的URL中獲得新代碼。因此,請查找該代碼參數,如果它存在,則將其交換爲新的訪問令牌。

+0

您是否知道使用SDK來實現這一點的方法?通常,getUser()方法應該完成所有這些工作,但沒辦法,使用getUser(),即使我已註銷,我也可以獲得FB ID ...我也嘗試清理會話/ cookie,以執行調用getUser(),以確保新的access_token將被請求,但現在!對api('/ me')的調用仍然告訴我沒有活動的令牌。 – aramaki

0

看看yiiauth擴展。它僅在今天發佈,並且可以與29個不同的提供商一起登錄:Facebook,OpenID,Google,Twitter,Yahoo等。

它使用HybridAuth庫和AFAICT,它使認證變得非常簡單。

+0

謝謝Ors。我想要做的是一個隱含的身份驗證。我不希望人們點擊登錄按鈕或其他東西。我只想讓他們在FB中自動登錄我的應用程序。 yiiauth我認爲這是不可能的。 – aramaki