You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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库手动实现:如果需要定制化逻辑,用专业加密库手动实现也是个选择,核心代码示例如下:
    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_data
    
    这里要重点注意:必须根据payload里的kid字段动态去获取Facebook的对应公钥,不能硬编码公钥,不然Facebook轮换密钥后验证就会失败。

内容的提问来源于stack exchange,提问作者user2877564

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:08:58