2012-04-21 64 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