七牛文档填坑过程回顾 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
工单节点使用指南
请用平和的语言准确描述你所遇到的问题
厂商的技术支持和你一样也是有喜怒哀乐的普通人类,尊重是相互的
如果是关于 V2EX 本身的问题反馈,请使用 反馈 节点
yokka
V2EX    全球工单系统

七牛文档填坑过程回顾

  •  
  •   yokka 2017-10-20 11:17:32 +08:00 2389 次点击
    这是一个创建于 2997 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    此问题为 2017 年 9 月 29 日出现,至今( 2017 年 10 月 19 日)七牛文档仍未进行修复,故发此文,希望引起七牛官方重视。

    前些日子项目需要,用上七牛对象存储,因之前都是用的传统架构:

    1. 客户端 -> 业务服务器 -> 七牛云

    这次打算换一下,尝试更节省业务服务资源的直传对象存储方式:

    1. 客户端 -> 业务服务器拿 Token
    2. 客户端 -> 直传七牛云
    3. 七牛云 -> 回调业务服务器 HTTP API 接口
    4. 业务服务器收到上传通知, 验证来自七牛服务器 -> done.

    Just like this:

    Refer to: Qiniu PHP SDK Document

    过程

    由此,过程中有必不可少的一环:验证回调请求是来自于七牛的服务器,而不是其他的伪装/恶意请求。

    故寻找七牛文档:

    1. 第一条链接压根没提到验证回调的问题。(难道七牛的 PHP 工程师压根忽略了这个安全问题么?)
    2. 第二条链接内同样不存在相关解答。
    3. 终于,在第三条链接的末尾找到了关于这个问题的解答:

    “值得庆幸的是”,有 PHP 的代码实现。

    但我们那时候还高兴的太早了。

    排查

    接下来我们使用此函数来验证权限,但经过多轮调试,无论如何都无法验证通过。最开始我以为是同事代码没有认真看,粗心大意引起的错误,但后来我亲自看代码,一步一步检查可能的编码问题、参数问题,甚至用 Fiddler 做代理看服务器发来的数据包是否正常、XDebug 下断一步一步调试,最终发现的确是没问题的。

    这就奇了怪了!为什么会出错呢?

    确定我们的算法没有问题后,我们决定继续研究文档,因为那个时候我们认为这样的大厂更新了这么久的文档,怎么可能会出问题呢,有坑的话我们肯定不是第一个踩下去的人。

    认真“研读”之后,我们发现:在安全机制 - 上传策略的文档内,对callbackBody的解释如下:

    上传成功后,七牛云向业务服务器发送 Content-Type: application/x-www-form-urlencoded 的 POST 请求。该字段 App-Server 可以通过直接读取请求的 query 来获得,支持魔法变量和自定义变量。callbackBody 要求是合法的 url query string。如:key=$(key)&hash=$(etag)&w=$(imageInfo.width)&h=$(imageInfo.height)。

    这句话有点迷,毕竟下一行的callbackBodyType是这样说的:

    上传成功后,七牛云向业务服务器发送回调通知 callbackBody 的 Content-Type。默认为 application/x-www-form-urlencoded,也可设置为 application/json。

    • callbackBody 要求是合法的 url query string
    • 也可设置为 application/json

    按照正常思维,这应该是不受影响的,默认是 url query stirng,可以改为 json 格式。但这两句相互有所冲突的描述引起了我们的重视,遂开始动工:原本我们使用统一的 json 格式作为 callbackBody 发送到业务服务器,现尝试改为 query string 测试看会不会有问题。

    经过测试,七牛的回调通过了验证……

    当时的心情……!@#^@)##^@!@

    我和同事调了一整天的问题,居然 TM 是因为七牛的锅。

    解决

    问题找到了,接下来就要解决。

    遂提交工单,因为当天晚上已经深夜,我们工单提交之后就各自回家了。

    第二天工单的回复,不出意外一波三折。

    • 经过两小时得到的答复:是否得到解决?
    • 再次回复后,得到的答复是文档显而易见的,答非所问。由此可见:七牛客服人员没有、或是没有认真阅读我工单最初提出的问题,直接匆忙给出了答复,再次拖慢了沟通效率。
    • 再次回复,直接附上官方文档链接,为了防止不认账我把代码也顺便贴了上去,同时把我们找到的问题关键点:callbackBodyType 参数也作了说明。
    • 终于得到一篇看起来像是有所眉目的答复:链接,发现一重要线索:居然用到了$contentType参数,这不就是 callbackBodyType 吗!虽然此文档内代码非常“简略”,就连$contentType都是写死的,但也至少给我们提供了解决思路。
    • 于是,github 下载七牛 PHP SDK 源码,果然 SDK 内有此函数实现。而以上列举的三篇文档内却从未看到一处提及。
    • 过了一会七牛官方发来 github 链接,虽然已经没什么卵用。

    题外话

    很巧的是,第二天有个商务人员联系我(企业账号刚注册没多久),简直求之不得啊!工单沟通成本太大,我马上提出安排几个技术人员拉了一个群一起来探讨这个问题。

    接下来,我们花了大概半个小时的时间和他们解释当前的情况是怎样的,但是貌似对方并不是“真正的”后端技术人员,也联系不到技术人员,所以也没起到什么作用。

    不过值得肯定的是,对方态度是非常不错的,积极配合解决。

    Finally

    em...

    问题圆满解决,值得肯定的是,解决问题的态度还算满意,无论是电话联系的商务,还是工单,均反复承诺尽快完善,工单上的答复甚至是已经在整理文档并且进行修改。于是我们也就得过且过,继续忙其他的东西。

    然而今天( 2017-10-19 )和同事偶然聊起来:

    • “话说最近要开新项目了,不知道七牛那边文档有没有更新?之前调了那么久的坑。”
    • “不知道啊,我看看”…… “ em... 貌似... 没有....”
    • 。。。

    不知道七牛官方口中的尽快是 20+天?还是技术人员整理文档整理了几个周还没写完。

    幕后的原因我们不得而知,大概是我们这种创业小公司遇到的问题,dalao 们也不会放在眼里吧。

    弃坑,下个项目换又拍云。

    硬广:CAREERSUs

    ryd994
        1
    ryd994  
       2017-10-20 11:59:06 +08:00 via Android
    吐槽一下
    Equal Opportunity Employer 这是美国法律强制,所以美国企业必须写
    国内虽然也说了要平等,但执行力度远不够
    学历是合法的职位描述
    强行 eeo 非常尴尬
    yokka
        2
    yokka  
    OP
       2017-10-20 12:27:15 +08:00
    @ryd994 额...但其实我们真的从来不看学历
    yokka
        3
    yokka  
    OP
       2017-10-20 12:36:33 +08:00
    @ryd994 不过还是感谢 dalao 提醒,等下次更新掉,说明除 eeo 之外还有学历。
    niuer
        4
    niuer  
       2017-10-21 14:02:35 +08:00
    尊敬的 @yokka 您好,重新回顾了您在工单中反馈的文档完善问题,文档中关于回调验证的使用引导上确实不够明确,没有有效的提高接入效率,非常抱歉给您使用过程中带来的困扰,针对反馈问题的后续优化是由于我们的疏忽没有得到及时的完善,再次非常抱歉!
    截至昨晚,php-sdk 文档已修改,添加了示例和注意事项。 我们会立即针对反馈流程进行反省,优化售后反馈处理机制,提供开发者的接入效率,非常感谢您的反馈。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2622 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 08:58 PVG 16:58 LAX 00:58 JFK 03:58
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86