Facebook接入方法


一,准備好開發者賬號

開發者賬號怎么設置我就不說了。和人人平台基本一樣。很多平台都這樣。

在得到 Application ID (App ID/ API Key) 和 Application secret(App Secret) 之后,記錄好這兩項,准備做接入。當然,還要牢記你自己的Canvas Page。

 

好,下一步。在開發者賬號創建了這個應用之后,你可以訪問一下Canves Page。

例如:http://apps.facebook.com/xxxapptest/

看一下效果。正常的話,可以看到連接到你的網站主頁上了。

二,認證與授權

     Facebook平台的身份驗證和授權是基於OAuth 2.0協議的( OAuth 2.0 protocol )。

     用戶在登錄之后可以有兩種方式做身份驗證和授權:服務器端(server-side)和客戶端(client-side)。無論用哪種,都需要遵守下面的三步:用戶身份驗證(user authentication),用戶授權 (app authorization) ,和 應用身份驗證(app authentication)。 用戶身份驗證是確認用戶身份;用戶授權是讓用戶確認將會提供給應用什么樣的個人數據和內容;應用身份驗證是確認用戶把他們的資料給的是你的應用,而不是別人。一旦這些步驟完成了,你的應用將會獲得到一個用戶訪問令牌( user access token ),這樣你的應用就能獲取到用戶的信息,並且可以獲取到用戶的活動和行為了。

----------------------------------------------------------------------------------------------

1. 用戶授權 (user authorization)

下邊我只說服務器端的認證授權流程。

獲取用戶基本信息的授權方式

用戶第一次登陸,facebook把用戶跳轉到我們的應用服務器,那么我們要調用這樣一個url:

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL

 

其實就是調用facebook的標准認證對話框(OAuth Dialog)。如果用戶點擊確認了,注意,這個授權,應用只能是獲取到用戶的基本信息的,也就是facebook上用戶的公共信息。例如ID,主頁,用戶的名字。

獲取用戶的其他信息的授權方式:

如果想獲取到用戶的其他信息,就必須明確的告訴用戶,你的應用需要哪些用戶的信息,像下面這樣:

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream

 

scope參數里面,指定了你的應用想要獲取的用戶信息。

 

用戶同意授權

假如用戶點擊了同意(Allow),那么你的應用就會被用戶授權了。授權對話框( OAuth Dialog)將會帶着認證碼(authorization code)參數跳轉(via HTTP 302)到你的服務器的url。我查看了整個授權后的request,發現,facebook把認證碼放在了GET里,其他的信息在POST里。GET里面會有一個code參數,好長一串,這個就是授權碼。有了這個code,我們就可以進行下一步應用身份驗證了。

----------------------------------------------------------------------------------------------

2. 應用身份驗證(app authentication)

為了驗證你的應用(app),你必須把上面得到的授權碼(authorization code)和你的應用密鑰(App Secret)傳給 Graph API的令牌終點( token endpoint):

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

格式是這樣的:

https://graph.facebook.com/oauth/access_token?
client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&
client_secret=YOUR_APP_SECRET&code=THE_CODE_FROM_ABOVE

 

如果你的應用成功的通過了認證,並且你的用戶的授權碼也是合法的,那么授權服務器將會返回訪問令牌(access token)。

 

 

----------------------------------------------------------------------------------------------

現在我們來看一下,網站接收到的facebook傳來的request的POST數據:

注意,此時是在沒有授權的情況下,從平台發過來的請求。

    u'fb_sig_time': [u'1310471486.9658'], 
    u'fb_sig_added': [u'0'], 
    u'fb_sig_locale': [u'zh_CN'], 
    u'fb_sig_in_iframe': [u'1'], 
    u'fb_sig_in_new_facebook': [u'1'], 
    u'fb_sig_country': [u'us'], 
    u'fb_sig': [u'6edf97802d706b84753a4a328d65b1cc'],   
    u'fb_sig_api_key': [u'6361833388ca80696ad667af7abcceee'], 
    u'fb_sig_app_id': [u'120306072668168']

好,按照facebook的規則,要想得到用戶的信息,你的這個應用必須得到用戶的授權(Authorization)。這個授權,就好比,用戶在facebook上,確認安裝你的游戲。

授權的格式,開發者文檔寫的很明白:

https://www.facebook.com/dialog/oauth?
     client_id=YOUR_APP_ID&redirect_uri=YOUR_CANVAS_PAGE

上面我們說的Application ID (app ID)和Canves Page在這里就能用得上了。

在瀏覽器中輸入這個授權url,就會看到你的應用的用戶授權頁。

當用戶點擊確定授權的時候,facebook將會給我們的網站發來這樣的request內容:

POST:

    u'fb_sig_time': [u'1310627493.7758'], 
    u'fb_sig_added': [u'1'], 
    u'fb_sig_locale': [u'zh_CN'], 
    u'fb_sig_in_iframe': [u'1'], 
    u'fb_sig_in_new_facebook': [u'1'], 
    u'fb_sig_profile_update_time': [u'1256108103'], 
    u'fb_sig_country': [u'us'], 
    u'fb_sig_ss': [u's2Ke_YrygH7T8aEd9Lmcrg__'], 
    u'fb_sig_user': [u'100000413372683'], 
    u'fb_sig_cookie_sig': [u'3bce4346fd8f2f62c347eae9e89ae2d8'], 
    u'fb_sig_session_key': [u'2.AQC9WncK12nGzWCn.3600.1310634000.0-100000413372683'], 
    u'fb_sig_expires': [u'1310634000'], 
    u'fb_sig': [u'af28d8df0e0ec5fbbf01ec430622278d'], 
    u'fb_sig_api_key': [u'6361833388ca80696ad667af7abcceee'], 
    u'fb_sig_app_id': [u'120306072668168']

可以看見,POST里面已經有了uid了。

 

授權(authorization)

     為了給用戶創造人性化(personalize)的體驗,Facebook將把用戶的信息,在用戶允許的情況下發送給你的應用。這些信息將通過HTTP POST里的 signed_request 參數傳給你的應用。 signed_request 其實就是一個經過base64url 編碼的JSON對象。所以,在你解碼之前,signed_request的內容看上去就是一個用點(.)分割的長串數據。

     用戶第一次訪問你的應用的時候,signed_request參數只包含下面這些數據(如果你看不到數據,只看到一長串字母數字,那請先看下邊的解碼簽名請求)。可以看到,幾乎沒有什么有用的用戶數據:

 

Name Description
user A JSON array containing the locale string, country string and the age object (containing the min and max numbers of the age range) for the current user.  里面只有local,county,和age 沒有uid 和token!
algorithm A JSON string containing the mechanism used to sign the request.
issued_at A JSON number containing the Unix timestamp when the request was signed.

 

 

     為了獲取有用的用戶信息,比如用戶在Facebook的ID,那么你需要得到用戶的授權。官方建議是使用認證對話框(OAuth Dialog) 進行用戶對應用的授權。怎么引用這個對話框,進行授權呢?其實就是在你的服務器端或者頁面端,跳轉到 Facebook指定的URL。這個URL規則如下:

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_CANVAS_PAGE

   當跳轉到這個URL的時候,就會出現facebook標准的認證對話框了。注意,上面這種規則的URL授權對話框,你的應用只能是獲取到用戶的基本信息的,也就是facebook上用戶的公共信息。例如ID,主頁,用戶的名字。如果你想獲取到用戶的其他信息,就必須明確的告訴用戶,你的應用需要獲取哪些用戶的信息,像下面這樣:

https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=email,read_stream

注意,scope參數里面,指定了你的應用想要獲取的用戶信息。

     假如用戶點擊了同意(allow),那么用戶就對應用授權了。授權后,signed_request參數將含下面這些數據。可以看到,可以得到重要的兩項:用戶的id,就是user_id;和oauth_token 。

 

Name Description
user A JSON array containing the locale string, country string and the age object (containing the min and max numbers of the age range) for the current user.
algorithm A JSON string containing the mechanism used to sign the request.
issued_at A JSON number containing the Unix timestamp when the request was signed.
user_id A JSON string containing the Facebook user identifier (UID) of the current user.
oauth_token A JSON string that you can pass to the Graph API or the Legacy REST API.
expires A JSON number containing the Unix timestamp when the oauth_token expires.

 

 

解碼簽名請求(Decode Signed Request)

     Facebook把請求做了簽名。形成了signed_request這個東西。signed_request 其實就是一個經過base64url 編碼的JSON對象。直接取過來,就是一個用"."分割的字符串。我們要做的,是把點前面的字符串解碼,就是驗證是否是facebook的合法sig;把點后面的字符串解碼,就是facebook傳給你應用的具體數據data。

   具體算法python版:

    # reques就是facebook發過來的請求
    params = request.POST.copy()        
    signed_request = params.get('signed_request')
    # signed_request傳到python這邊, 數據結構是一個字符串型的list
    if isinstance(signed_request, list):
        signed_request = signed_request[0]
    encoded_sig, payload = signed_request.split(".", 2)

    # 余數2, 那么需要補一個=
    payload = str(payload)
    if len(payload)%3 == 2:
        payload += '='
    # 余數1, 那么需要補兩個=  
    if len(payload)%3 == 1:
        payload += '=='    
    # urlsafe_b64decode() Decode string s using a URL-safe alphabet, 
    # which substitutes - instead of + and _ instead of / in the standard Base64 alphabet.
    # 得到data    
    data = simplejson.loads(base64.urlsafe_b64decode(payload))
    
    # 得到sig
    encoded_sig = str(encoded_sig)
    if len(encoded_sig)%3 == 2:
        encoded_sig += '='
    if len(encoded_sig)%3 == 1:
        encoded_sig += '==' 
    sig = base64.urlsafe_b64decode(encoded_sig)

  

獲取用戶信息

     經過上面的解碼簽名請求后,可以獲取到FB的數據了。就是上面代碼里的data。如果里面有'user_id' 那么就說明,uid和oauth_toke都有了。請注意,如果您用的是國內服務器,是不可以直接調用facebook API接口的。

    if 'user_id' in data:
        uid = data['user_id']
        params_dic = {}
        params_dic['uid'] = uid
        params_dic['oauth_token'] = data['oauth_token']

  

有了這uid和oauth_toke,我們就可以獲取其他的用戶信息了。下面是獲取幾個重要接入屬性的方法。如果不明白為什么這么寫,可以參考facebook開發文檔。

   用戶昵稱

graph_url = "https://graph.facebook.com/%s" % uid
facebook_usr_info = simplejson.loads( urllib2.urlopen(graph_url).read() )
name = facebook_usr_info['name']

   好友列表:

graph_url = "https://graph.facebook.com/me/friends?access_token=%s" % oauth_token
f_dic = simplejson.loads(urllib2.urlopen(graph_url).read())
friends_ids = f_dic['data']

 頭像:

        headurl = 'http://graph.facebook.com/' + uid + '/picture' 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM