又拍云的签名到底怎么计算的?

相信不少使用又拍云 sdk 上传文件到存储的人都碰到过一个问题,那就是又拍云上传要传的认证签名头,好复杂呀!各种拼接然后加上加密,到底怎么算呢?今天,我给大家捋一捋。

首先,请你仔细阅读一遍文档

我们需要知道的是,在你上传文件的请求头里,需要加上这么一个头信息

Authorization: UPYUN <Operator>:<Signature>

其中的 Authorization 是请求头,UPYUN 直接照写,operator 是操作员;然后 signature 是签名,主要是这个签名计算稍微复杂点。

按照官网的内容,我们把对应的参数拼接起来

代码

#!/usr/bin/env python
#-*-coding:utf-8-*-
from hashlib import sha1
import hashlib
import hmac
import base64


operator="operator123"          
hash_md5 = hashlib.md5("password123")
password = hash_md5.hexdigest()#得到值是482c811da5d5b4bc6d497ffa98491e38

options = 'PUT&/upyun-temp/demo.jpg!awen)&Wed, 09 Nov 2016 14:26:58 GMT&7ac66c0f148de9519b8bd264312c4d64'
sign =  base64.b64encode(hmac.new(password,options,sha1).digest())
print(sign)

最后的运行结果就和官网的例子中的结果一样啦!你所需要做的,就是把里面的参数替换成你自己的就可以了。

注意:REST API 签名有效期为 30 分钟;FORM API 回调通知签名有效期由用户自行确定,建议设置为 30 分钟。

说完了签名 那表单上传除了要计算签名还有个Policy,其实是一样的。都是把一些参数加进来,然后进行计算,最后得出一个结果,需要注意的是,在我的印象中,99%的人都会在这个地方遇到各种问题,然后调试的时候报400 或401错误,比如:

  • 参数少传或错传,比如本地路径写错了或服务名没写进去进行拼接。
  • 拼接错误,各种参数之间要用&连接,有的参数写到一块去了。
  • 算法用错了,导致计算记过不一样。
  • 一些参数写死了,比如 Date,这个最好是动态获取,传个变量吧,不要写死了。
  • 环境不一样,有的是本地调试 ok,换个环境就不行了,注意检查2台设备的时间是不是一致。
  • 把登录控制台的账号密码写成了操作员和操作员密码。
  • 另外有的人对“HMAC-SHA1 输出的必须是原生的二进制数据”不理解,不理解就看上面的代码吧!
  • 需要转换为 json 的地方没转换,需要 base64编码的地方没编码。

大概就上面这些,然后报错也可以看下文档