Thursday, November 18, 2010

[Facebook] C# SDK Authentication

之前介紹過Facebook C# SDK,這次來介紹C# SDK如何與Facebook進行認證。

Facebook是用OAuth 2.0 protocol去做認證,必須要申請應用程式,取得Application ID, API Key, Application Secret才能完成認證。

認證的過程簡單來說只有兩步。
1.取得使用者認證:送出App ID與導向位置,使用者會在這步選擇是否信任此應用程式,確認後會將網頁導至你所指定的位置,並帶上code這參數。
2.取得Access Token:送出App ID、Redirect Url、App Secret、Code,取回access_token。
之後就可以使用access_token呼叫facebook的一些功能了。



Step 1 : Redirect the user to authorization process
在這步驟要確認使用者是否信任此應用程式,方法是將網頁導向
https://graph.facebook.com/oauth/authorize

帶上兩個參數
client_id : 應用程式的App ID。
redirect_uri : 認證後要導回的Url。


範例

https://graph.facebook.com/oauth/authorize?client_id=1234567890&redirect_uri=http://www.died.tw/oauth_redirect

若使用者尚未信任該應用程式,則會出現下面這個確認視窗。

Facebook SDK 01

使用者同意後就會將頁面導向剛剛所指定的Url,並帶上參數code,這會在下一步的認證中用到。



Step 2 : Exchange for an OAuth access token


在這步驟要將剛剛取得的code丟回facebook換access_token,方法是向下面這網址送出request

https://graph.facebook.com/oauth/access_token

帶上四個參數
client_id : 應用程式的App ID。
redirect_uri : 認證後要導回的Url,需與第一步的Url相同。
client_secret : 應用程式的Application Secret。
code : 第一步中取得的code。

成功的話,會獲得像是下面的結果

access_token=15343104470093|2.m_nKLR3hlR1HBMcTSEI5zg__.3600.1290067200-1435870392|Kc5jFUOkQr7r8aSs6Vm6K52wmio&expires=5124

之後就可以拿這個access_token呼叫facebook的功能了,詳細的呼叫方法下回分曉。


參考資料 : Facebook Documentation Authentication

8 comments:

  1. 您好~請教一下
    如果是用網頁傳參數的方式做驗證,FB好像不會寫 Cookie值(access_token)
    如果是用JS SDK則會寫Cookie值(access_token)
    所以如果用JS的方式,就有辦法一開始就取得使用者是否已經登入的狀態
    但是如果用網頁傳參數的方式做驗證,有辦法一開始就判斷使用者是否登入嗎?

    ReplyDelete
  2. 一開始就判斷有無登入似乎不行,所以要自己作手腳,我想到兩個
    1)每次都認證一次,笨方法
    2)取得access_token後,將access_token與使用者id存進cookie,照expires去設cookie過期時間,之後就先檢查cookie就好。簡單來說就是自己寫cookie

    ReplyDelete
  3. 帥喔~這兩個方法我有想過
    我比較想用第二種方式
    我有去看JS寫的cookie
    主要要填寫以下這些值
    1)access_token(現有-可寫入)
    2)base_domain(現有-可寫入)
    3)expires(可自訂-FB好像說如果不填,Cookie會永久有效)
    4)secret(可寫入,但要加密過)
    5)session_key(現在用 OAoth2,我猜應該用不到,如果不寫或是亂寫不曉得會不會有關係)
    6)sig(不曉得是什麼值,好像也是加密過)
    7)uid(現有-可寫入)

    我來試試看,再來分享實驗結果

    ReplyDelete
  4. 其實只要寫1,3,7就好,然後判斷如果access_token失效(也許使用者砍了app重加)就重跑oauth認證,應該就可以了。

    ReplyDelete
  5. 你好,想請問一個問題

    請問redirect_uri,如果不是當初在app所設定的uri的話,要怎麼設定呢?
    因為我用了這個網址,但是他都說這個uri不被這個app所擁有
    就會出現錯誤

    謝謝^^

    ReplyDelete
  6. facebook為了避免有人亂用別人的app,所以會限制uri只能在你app setting設的網域內,去app setting裡面改一下就好了。

    ReplyDelete
  7. 你好~不好意思再請問另一個問題,
    我改成我的網域內,但是他倒向那個網頁後,卻沒有出現任何東西
    想請問知道為什麼嗎?

    謝謝^^

    ReplyDelete
  8. 他導給你的網址上會有傳querystring,你要接值去用啊XD

    ReplyDelete