2014年4月21日 星期一

yii framework - 為什麼Facebook登出會轉到home.php

問題:

為什麼在登出fb的時候沒有轉到自己所指定的頁面, 而是跑到Facebook的home.php?


可能的原因:

1. 你的登出後要轉到(next)的網址錯誤, 例如:

$params = array( 'next' => 'http://www.test.com/index.html' );
$logout_url = Yii::app()->facebook->getLogoutUrl($params);

如果你是index.php, 而不是index.html的話就會發生這個現象!

2. 你沒有拿到正確的access token

其實檢查方式很簡單, 你可以把上面的$logout_url echo出來, 就可以知道到底getLogoutUrl()這個函式到底都產生了什麼鬼.


基本上getLogoutUrl產生的網址的結構如下:
https://www.facebook.com/logout.php?next=你設定登出後要轉回來的網址&access_token=自己會抓到

正確的access token其實長的跟鬼一樣:
CAAIIwD9W1X4BAHZAQ7KPTdrghsrey2jnpqAunp6DljDGFRENZCHVDOYmuep7t1pUB3mAho9ZCRYg48l3xua0SBfcZA3yW1ZAS8MZBoHbYBaQ7GkeEPBaeTI9bFO0WVnhlhuGUBhumDAHdpZCnGxfW0CZBZAPqIDqnyafJX8yETGRPHBhbuhgoz

如果你的access token超乾淨、超短, 那肯定錯誤.

關於access token的概念可以參考這篇: 在Server-Side如何取得AccessToken?

Access token work-flow


自己的狀況:

我在實作上也是在這個 (如何使用Facebook登入(Facebook PHP SDK)) 基礎上
加入資料庫的驗證, 然後沒註冊過的就轉到註冊頁, 註冊過的就轉到指定的頁面

我的轉向一開始是用header Location的方式寫, 然後發生上面的問題, 後來看一下發現yii的redirect更好用, 關於Redirect可以參考這篇:YII路由跳转forward\redirect

不過改完後code是變很漂亮, 也不用擔心像上面那篇說的, 轉址後會繼續執行的問題 (因為yii 會自己使用exit, 不信?看看官方的說明), 不過問題還是沒解決...

後來一直在看是不是我的邏輯出問題了, 試了好幾天 (沒辦法我不是天才)才發現在登出的時候我的access token是user的Facebook ID, 根據上面官方的access token流程圖看來應該是我沒有把傳回來的access token保存起來就直接轉址了!

所以最後我的解決流程是:(沒有求知慾的就直接看這邊)

1. 將傳回來的access token存到session裡 
Yii::app()->session['gottenAccessToken'] = Yii::app()->facebook->getAccessToken();

2. 自己組登出的網址
$logout_url = 'https://www.facebook.com/logout.php?next=' . $baseUrl . '/&access_token='.Yii::app()->session['gottenAccessToken'];

3. 轉出去
$this->redirect($logout_url);



打完收工~ 睡覺去 晚安.

PS:正面迎接bug才是王道, 其實我大可以不要在註冊頁給user登出的按鈕, 然後在資料庫檢查是否註冊過的地方加入指定的session, 之後在每一頁判斷是否有這個自訂的session值就好了! 但是這樣迴避真實存在的問題, 我實在是無法接受...

2 則留言: