如何在Python 3.6中验证Facebook signed_request的签名?
用Python 3.6验证Facebook signed_request签名的尝试方案
最近我在折腾用Python 3.6验证Facebook的signed_request签名,前后试了好几种方法,跟大家唠唠:
- 使用Facebook Python SDK的
parse_signed_request()方法:这是最直接的路子,官方SDK封装好了现成的方法,调用它就能同时完成签名验证和请求内容解析,省得自己从头写逻辑。 - 参考“facebook signed request email”相关社区方案:搜了不少相关的讨论帖,找到了针对包含email字段的signed_request的处理思路,照着调整了自己的代码逻辑适配场景。
- 适配Python 2.7/3.2的传统方法改造:翻到一篇旧教程里的实现,把里面Python 2.x的语法(比如
str与bytes的处理)改成Python 3.6兼容的写法,也跑通了基础的验证流程。 - 使用cryptography库手动实现:如果需要定制化逻辑,用专业加密库手动实现也是个选择,核心代码示例如下:
这里要重点注意:必须根据payload里的from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.backends import default_backend import base64 import json def verify_signed_request(signed_request, app_secret): # 分割签名和payload部分 encoded_sig, payload = signed_request.split('.', 1) # 修复base64url编码的补位问题 sig = base64.urlsafe_b64decode(encoded_sig + '=' * (4 - len(encoded_sig) % 4)) data = base64.urlsafe_b64decode(payload + '=' * (4 - len(payload) % 4)) payload_data = json.loads(data) # 注意:需要根据payload中的kid字段动态获取对应的Facebook公钥 # 此处省略公钥获取逻辑,假设已获取到public_key对象 public_key.verify( sig, data, padding.PKCS1v15(), hashes.SHA256() ) return payload_datakid字段动态去获取Facebook的对应公钥,不能硬编码公钥,不然Facebook轮换密钥后验证就会失败。
内容的提问来源于stack exchange,提问作者user2877564
相关产品推荐
相关产品推荐

