这几天Chambley上了三四个QQ小业务流程,机能上单厢加进文档上载机能(肖像上载、婚纱照上载等)。在APP上载文档到用户端的恰当坐姿中,他们如是说了他们指出安全可靠的上载业务流程:

QQ小流程文档上载六事插图

将要公钥留存在伺服器,应用领域程序每天向伺服器提出申请两个纸制的signature,接着采用该signature做为凭据来上载文档。通常情况下,向阿里云OSS上载文本,又拍云做为远程管理。

随著我们风险意识的进一步增强,此种上载业务流程基本上早已正式成为国际标准坐姿。但,把那个业务流程在应加进QQ小业务流程却有许多技术细节须要修正。这儿把踩过的坑历史记录呵呵,期望能让有须要的老师字用章。

QQ小业务流程难以间接加载文档文本展开上载

在他们版的上载业务流程计划中,他们的cds 亲笔签名派发服务项目只同时实现了阿里云PutObjectUSB的signature派发. PutObject 上载是间接将须要上载的文本以二进流的形式 PUT 到云存储。

但,QQ小业务流程提供更多的文档上载APIwx.uploadFile明确要求文档透过filePath提供更多:

QQ小流程文档上载六事插图1

再者,QQ小业务流程的 JS API 现阶段还较为半封闭,难以依照filePath加载到文档文本,因而也难以透过wx.request间接发动互联网允诺的形式来同时实现文档上载。

考虑到 wx.uploadFile 其本质上是两个multipart/form-data互联网允诺的PCB,因而他们只须要同时实现两个与之相关联的亲笔签名派发形式USB。阿里云OSS相关联的上载USB是PostObject, 又拍云相关联的是其FORM API. 以阿里云OSS为例,cds 服务项目聚合signature 标识符如下表所示:

func GetDefaultOSSPolicyBase64Str(bucket, key string) string { policy := map[string]interface{}{ “expiration”: time.Now().AddDate(3, 0, 0).Format(“2006-01-02T15:04:05.999Z”), “conditions”: []interface{}{ map[string]string{ “bucket”: bucket, }, []string{“starts-with”, “$key”, key}, }, } data, _ := json.Marshal(&policy) return base64.StdEncoding.EncodeToString(data) } func GetOSSPostSignature(secret string, policyBase64 string) string { h := hmac.New(sha1.New, []byte(secret)) io.WriteString(h, policyBase64) return base64.StdEncoding.EncodeToString(h.Sum(nil)) }

小业务流程端标识符如下表所示:

//采用说明 /** * 1、引入该文档:const uploadFile = require(../../common/uploadAliyun.js); * 2、调用如下表所示: * uploadImg: function () { const params = { _success: this._success } uploadFile.chooseImg(params); }, _success: function(imgUrl){ this.setData({ cover_url: imgUrl, }) }, */ const uploadFile = { _fail: function(desc) { wx.showToast({ icon: “none”, title: desc }) }, _success: function() {}, chooseImg: function(sendData) { //先存储传递过来的回调函数 this._success = sendData._success; var that = this; wx.chooseImage({ count: 1, sizeType: [original, compressed], sourceType: [“album”, “carmera”], success: function (res) { that.getSign(res.tempFilePaths[0]); }, fail: function (err) { wx.showToast({ icon: “none”, title: “选择图片失败” + err }) } }) }, //获取阿里上载图片亲笔签名 getSign: function (path) { var that = this; wx.request({ url: https://somewhere/v2/cds/apply_upload_signature, method: POST, data: { “content_type”: “image/jpeg”, “signature_type”: “oss_post”, “business”: “xiaochengxu”, “file_ext”: .jpeg, “count”: 1 }, success: function (res) { let getData = res.data.data[0]; that.startUpload(getData, path); }, fail: function (err) { that._fail(“获取亲笔签名失败” + JSON.stringify(err)) } }) }, //拿到亲笔签名后开始上载 startUpload: function (getData, path) { var that = this; this.uploadAliYun({ filePath: path, dir: wxImg/, access_key_id: getData.oss_ext_param.access_key_id, policy_base64: getData.oss_ext_param.policy_base64, signature: getData.signature, upload_url: getData.upload_url, object_key: getData.oss_ext_param.object_key, content_url: getData.content_url.origin }) }, uploadAliYun: function(params) { var that = this; // if (!params.filePath || params.filePath.length < 9) { if (!params.filePath) { wx.showModal({ title: 图片错误, content: 请重试, showCancel: false, }) return; } const aliyunFileKey = params.dir + params.filePath.replace(wxfile://, ); const aliyunServerURL = params.upload_url; const accessid = params.access_key_id; const policyBase64 = params.policy_base64; const signature = params.signature; wx.uploadFile({ url: aliyunServerURL, filePath: params.filePath, name: file, formData: { key: params.object_key, policy: policyBase64, OSSAccessKeyId: accessid, Signature: signature }, success: function (res) { if (res.statusCode != 204) { that._fail(“上载图片失败”); return; } that._success(params.content_url); }, fail: function (err) { that._fail(JSON.stringify(err)); }, }) } } module.exports = uploadFile;

采用阿里云OSS域名上载失败

解决亲笔签名问题后,发现采用阿里云OSS提供更多的上载域名难以上载成功,在QQ后台尝试添加合法域名的时候,惊奇的发现阿里云OSS的域名间接被QQ小业务流程封禁了:

QQ小流程文档上载六事插图2

显然是两个神仙在打架,做为草民只能见招拆招。解决办法是在阿里云OSS -> bucket -> 域名管理绑定用户域名:

QQ小流程文档上载六事插图3

此外,由于QQ小业务流程早已升级为uploadFile的链接必须是https, 因而还须要在绑定用户域名后设置证书托管。

他山之石,可以攻玉

既然QQ能够封禁用阿里云OSS的上载域名,那么QQ也可以封禁你自定义的域名。依照以往经验(对天发誓,他们不是有意为之,他们也是受害者……),QQ封禁域名通常都是一锅端,即发现两个子域名存在违规文本,那么整个域名单厢被封禁。因而,一方面要从技术角度对上载的文本及时检查是否合规(如黄图扫描),再者提前做好域名规划,将业务USB域名与自定义的文档上载域名分开,这样即使上载域名被一锅端了,不至于是业务完全不可用。

作者 nasiapp

在线客服
官方客服
我们将24小时内回复。
12:01
您好,有任何疑问请与我们联系!

选择聊天工具: