2012年5月8日 星期二

IE下Facebook JS SDK getLoginStatus無法取得登入狀態



這又是一篇不走正途的解法…大概寫一下就好。

之前在執行專案時發現,在一部份的IE裡(有些ok,有些不ok),即使使用者已經授權且登入的狀態下,Facebook JS SDK的getLoginStatus仍然一直無法取得登入資訊,所以導致這些IE的使用者完全無法使用Facebook JS SDK。

搞了很久,一直沒辦法解決這個問題。
後來火了,想說反正所有的api都是透過access_token做認證的,只要我能取得access_token的話,就應該能夠繼續使用api。

要取得access_token的方式很簡單,用導向的方式處理就可以了,文件說明在這:https://developers.facebook.com/docs/authentication/client-side/
Client-side authentication without the JS SDK的部份,很簡單。
因此我在頁面上加入判斷,針對這些不ok的IE,我先將他們導向到
https://www.facebook.com/dialog/oauth?client_id="+YOUR_APP_ID+"&redirect_uri="+YOUR_REDIRECT_URI+"&scope="+COMMA_SEPARATED_LIST_OF_PERMISSION_NAMES+"&response_type=token
其中的參數:
YOUR_APP_ID = api id
YOUR_REDIRECT_URI = 使用者授權後要導回來的url,通常就是原本的網站本身
COMMA_SEPARATED_LIST_OF_PERMISSION_NAMES = 要取得的授權

導回來後,access_token就會跟在網址後面一起回來了,格式會是像這樣:
http://xxx/#access_token=USER_ACCESS_TOKEN&expires_in=NUMBER_OF_SECONDS_UNTIL_TOKEN_EXPIRES
於是access_token就取得了。

接下來要面臨的問題就是,access_token我們是取得了,但是Facebook JS SDK仍然無法work,因為它還是不知道access_token,所以我們要做的事情就是把access_token塞給Facebook JS SDK,強迫它使用這一組access_token。
Facebook JS SDK在使用者登入後會把一些資訊存在FB._authResponse這一個物件裡,包括access_token,如果使用者還沒登入的情況下FB._authResponse會是一個null值,但沒關係,我們可以自動幫它new出來,然後再把access_token塞進去。
if (!FB._authResponse) FB._authResponse = {};
FB._authResponse.accessToken = 我們自己取得的access_token;

這樣一來就可以直接使用原本的Facebook JS SDK了。
測試過後是沒問題的,甚至我把其它人的access_token塞進去也可以跑出正確的資料出來,因此可以很肯定Facebook JS SDK的確是依靠FB._authResponse這個物件來判斷當下的使用者身份。

希望這一篇會幫助到同樣受IE所苦的開發者們。