Как декодировать base64 url в Python?

Для Facebook fbml Приложения Facebook отправляет в signed_request параметре, объясненном сюда:

http://developers.facebook.com/docs/authentication/canvas

Они дали php версию декодирования этого запроса со знаком:

http://pastie.org/1054154

Как сделать то же в Python?

Я попробовал base64 модуль, но я получаю Неправильную дополнительную ошибку:

>>> base64.urlsafe_b64decode("eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjEyNzk3NDYwMDAsIm9hdXRoX3Rva2VuIjoiMjk1NjY2Njk1MDY0fDIuRXpwem5IRVhZWkJVZmhGQ2l4ZzYzUV9fLjM2MDAuMTI3OTc0NjAwMC0xMDAwMDA0ODMyNzI5MjN8LXJ6U1pnRVBJTktaYnJnX1VNUUNhRzlNdEY4LiIsInVzZXJfaWQiOiIxMDAwMDA0ODMyNzI5MjMifQ")
Traceback (most recent call last):
  File "", line 1, in 
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/base64.py", line 112, in urlsafe_b64decode
    return b64decode(s, '-_')
  File "/System/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/base64.py", line 76, in b64decode
    raise TypeError(msg)
TypeError: Incorrect padding

21
задан Pratiksha 5 July 2017 в 11:17
поделиться

2 ответа

По-видимому, вы пропустили последние два символа при копировании исходной строки в кодировке base64. Добавьте к строке ввода два знака равенства (=), и она будет правильно декодирована.

19
ответ дан 29 November 2019 в 06:19
поделиться

Я поделился фрагментом кода для разбора параметра signed_request в приложении facebook canvas на основе python на http://sunilarora.org/parsing-signedrequest-parameter-in-python-bas:

import base64
import hashlib
import hmac
import simplejson as json

def base64_url_decode(inp):
    padding_factor = (4 - len(inp) % 4) % 4
    inp += "="*padding_factor 
    return base64.b64decode(unicode(inp).translate(dict(zip(map(ord, u'-_'), u'+/'))))

def parse_signed_request(signed_request, 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':
        log.error('Unknown algorithm')
        return None
    else:
        expected_sig = hmac.new(secret, msg=payload, digestmod=hashlib.sha256).digest()

    if sig != expected_sig:
        return None
    else:
        log.debug('valid signed request received..')
return data
25
ответ дан 29 November 2019 в 06:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: