Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Facebook Signed Request Decoding Incorrect Padding

I'm trying to decode a facebook signed_request to serve a login form to non-authorized users. My code is as follows:

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

My problem is that, as is, this code works successfully for a user who is already logged in, but for a user who is not logged in I get an "Incorrect Padding" error for the b64decode. However, if I pad the payload with '=' signs, then all users pass the authorization as "logged in", whether or not they actually are.

Can anybody help me out here?

like image 427
nct25 Avatar asked Sep 08 '26 21:09

nct25


1 Answers

this is working for me

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
like image 142
Nour Wolf Avatar answered Sep 11 '26 11:09

Nour Wolf



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!