2012-04-21 63 views
3

我試圖解碼Facebook signed_request以向非授權用戶提供登錄表單。我的代碼如下:Facebook簽名的請求解碼不正確的填充

def parse_signed_request(sr): 

    encoded_sig, payload = sr.split('.', 2) 
    data = json.loads(base64.b64decode(payload.replace('-_', '+/'))) 

    if not data['algorithm'].upper() == 'HMAC-SHA256': 
     raise ValueError('unknown algorithm {0}'.format(data['algorithm'])) 
     return None 

    h = hmac.new(FB_APP_SECRET, digestmod=hashlib.sha256) 
    h.update(payload) 
    expected_sig = urlsafe_b64encode(h.digest()).replace('=', '') 

    if encoded_sig != expected_sig: 
    raise ValueError('bad signature') 
    return None 

return data 

我的問題是,由於是,此代碼成功地爲誰已經登錄的用戶,但誰沒有登錄我得到一個「不正確的填充」用戶b64decode錯誤。但是,如果我使用'='標記填充有效內容,則所有用戶都將「授權」作爲「登錄」傳遞,而不管它們是否實際上都是。

有人可以幫我嗎?

回答

6

,這是爲我工作

def base64_url_decode(inp): 
    inp = inp.replace('-','+').replace('_','/') 
    padding_factor = (4 - len(inp) % 4) % 4 
    inp += "="*padding_factor 
    return base64.decodestring(inp) 


def parse_signed_request(signed_request='a.a', secret=FACEBOOK_APP_SECRET): 
    l = signed_request.split('.', 2) 
    encoded_sig = l[0] 
    payload = l[1] 

    sig = base64_url_decode(encoded_sig) 
    data = json.loads(base64_url_decode(payload)) 

    if data.get('algorithm').upper() != 'HMAC-SHA256': 
     print('Unknown algorithm') 
     return None 
    else: 
     expected_sig = hmac.new(secret, msg=payload, digestmod=hashlib.sha256).digest() 

    if sig != expected_sig: 
     return None 
    else: 
     print('valid signed request received..') 
     return data 
+0

'(4 - LEN(INP)%4)'已經是0和3之間你不必把它模4.此外還有'的base64 .urlsafe_b64decode'已經爲你做了'inp.replace(' - ','+')。replace('_','/')'。 – Marii 2013-04-18 14:08:51