3

我正在尝试解码 facebook signed_request 以向非授权用户提供登录表单。我的代码如下:

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 的“不正确填充”错误。但是,如果我用“=”符号填充有效负载,那么所有用户都会通过“登录”的授权,无论他们是否真的登录。

有人可以帮我吗?

4

1 回答 1

7

这对我有用

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
于 2012-04-24T11:03:45.633 回答