按照七牛的官方文档,我写的shell脚本如下:
bash
scope="$namespace:uploadfile.7z" deadline=$(echo `date +%s` + 3600| bc ) # step2: 将上传策略序列化成为JSON格式 putPolicy="{\"scope\":\"$scope\",\"deadline\":$deadline}" echo "$putPolicy" # step3: 对JSON编码的上传策略进行URL安全的Base64编码,得到待签名字符串 encodedPutPolicy=`echo -n "$putPolicy" | base64 -w0 | sed 's/\+/-/g; s/\//_/g'` echo "$encodedPutPolicy" # step4: 使用SecertKey对上一步生成的待签名字符串计算HMAC-SHA1签名 # 参考stackoverflow的相关帖子,使用openssl生成HMAC-SHA1签名字符串 # http://stackoverflow.com/questions/7285059/hmac-sha1-in-bash sign=`echo -n "$encodedPutPolicy" | openssl sha1 -hmac "$secretkey" | awk '{print $2}'` echo $sign # step5: 对签名进行URL安全的Base64编码 encodedSign=`echo -n "$sign" | base64` echo $encodedSign # step6: 将AccessKey、encodedSign和encodedPutPolicy用:连接起来 uploadToken="$accesskey:$encodedSign:$encodedPutPolicy" echo $uploadToken curl -v -F token="$uploadToken" -F file='$(fname)' -F fileBinaryData=@uploadfile.7z http://upload.qiniu.com/
最后curl执行的时候,检测报文都是没有问题的,但是报错{"error":"bad token"}
,和官方提供的上传凭证生成器对比了一下,发现似乎在HMAC-SHA1这一步的时候结果不同,使用官方提供的生成器,最后第5步生成的base64编码反解是二进制字符串,不是ASCII.
我想问一下如果用bash脚本最后调用curl完成上传文件的操作,有没有提供相关的范例呢?或者请指出我的脚本中哪一步不对,导致生成的token不对呢?
问题解决了,是因为sign这一步没有转成十六进制。仔细读了一遍官方文档。改写为如下
问题解决