2011-02-14 20 views
11

由於Facebook不贊成使用新的FBML,我正在尋找一種新的方式來創建「揭示」選項卡(頁面選項卡向粉絲顯示一個版本,向非粉絲顯示另一個版本) 。 Facebook已經加入數據到signed_request:解密Facebook在Ruby/Sinatra中籤名的請求

當用戶選擇在 左側菜單的應用程序,該應用程序將接收 的signed_request參數與一個 附加參數,頁面,一個JSON 數組,它包含 Facebook頁面的'id'您的標籤頁被託管在 之內,布爾('喜歡')表示 用戶是否已經喜歡 頁面,布爾('admin') 指示是否用戶是 頁面的'管理員'以及 用戶信息陣列。

我能夠讀取signed_request的罰款,但然後我需要使用base64url解碼來處理它,以獲得正確的JSON。此外,我在我的研究中發現,JSON格式不正確,因此需要在解碼之前進行修改。下面是當前的代碼(我只是在印刷的index.erb現在簽名的請求):

helpers do 
    def base64_url_decode str 
    encoded_str = str.gsub('-','+').gsub('_','/') 
    encoded_str += '=' while !(encoded_str.size % 4).zero? 
    Base64.decode64(encoded_str) 
    end 

    def decode_data str 
    encoded_sig, payload = str.split('.') 
    data = ActiveSupport::JSON.decode base64_url_decode(payload) 
    end 
end 

get '/' do 
    signed_request = params[:signed_request] 
    @signed_request = decode_data(signed_request) 
    erb :index 
end 

我試圖保持應用程序儘可能的輕,避免使用完整的Facebook庫,因爲這億韓元不是一個完整的應用程序(只是一個選項卡),不需要用戶的額外權限。我也歡迎任何關於我的粉塵檢測方法的建議。

回答

7

我以前碰到過這個。你只需要墊有效載荷字符串=馬克結束,直到它的長度是整除4

這將工作:

payload += '=' * (4 - payload.length.modulo(4)) 

(我不知道在哪裏/如果這被證明Facebook,但IRC上的某人在2011年初向我介紹了這一點,果然,我已經在各種Facebook客戶端庫的源代碼中找到了這樣的填充)

+0

這似乎很近,但不正確的。您只想填充1或2個字符,而不是3或4。如果payload.module(4)爲零,則不要填充。 http://en.wikipedia.org/wiki/Base64 – 2014-12-06 02:09:57

+0

注意:如果您使用strict_decode64或urlsafe_decode64,但可以通過decode64容忍,則帶有四個'='的填充似乎會中斷。 – 2014-12-06 02:27:49

2

剛纔的回答是正確的。我只是遇到了同樣的問題,並用「=」填充它。

您可以通過使用驗證這一點:

Base64.strict_decode64(invalid_payload) 
=> ArgumentError: invalid base64