首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在python中解码base64 url?

如何在python中解码base64 url?
EN

Stack Overflow用户
提问于 2010-07-22 03:18:35
回答 9查看 46.3K关注 0票数 25

对于Facebook的fbml应用程序,Facebook正在发送一个signed_request参数,如下所示:

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

他们给出了解码这个签名请求的php版本:

http://pastie.org/1054154

如何在python中做同样的事情呢?

我尝试了base64模块,但是我得到了错误的填充错误:

代码语言:javascript
复制
>>> base64.urlsafe_b64decode("eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImV4cGlyZXMiOjEyNzk3NDYwMDAsIm9hdXRoX3Rva2VuIjoiMjk1NjY2Njk1MDY0fDIuRXpwem5IRVhZWkJVZmhGQ2l4ZzYzUV9fLjM2MDAuMTI3OTc0NjAwMC0xMDAwMDA0ODMyNzI5MjN8LXJ6U1pnRVBJTktaYnJnX1VNUUNhRzlNdEY4LiIsInVzZXJfaWQiOiIxMDAwMDA0ODMyNzI5MjMifQ")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  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
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2010-07-22 04:07:29

显然,在复制原始的base64编码的字符串时,您遗漏了最后两个字符。在输入字符串后加上两个is-equal (=)符号,它将被正确解码。

票数 23
EN

Stack Overflow用户

发布于 2012-03-31 21:16:19

试一试

代码语言:javascript
复制
s = 'iEPX-SQWIR3p67lj_0zigSWTKHg'
base64.urlsafe_b64decode(s + '=' * (4 - len(s) % 4))

因为它被写成here

票数 35
EN

Stack Overflow用户

发布于 2010-07-29 00:48:37

我在http://sunilarora.org/parsing-signedrequest-parameter-in-python-bas上分享了一个代码片段,用于解析基于python的facebook canvas应用程序中的signed_request参数

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3302946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档