上传凭证

上传凭证是七牛云存储用于验证上传请求合法性的机制。用户通过上传凭证授权客户端,使其具备访问指定资源的能力。

算法

  1. 构造上传策略

    用户根据业务需求,确定上传策略要素,构造出具体的上传策略。
    比如,有用户需要向空间my-bucket上传一个名为sunflower.jpg的图片,授权有效期截止到2015-12-31 00:00:00(该有效期指上传完成后在七牛生成文件的时间,而非上传的开始时间),并且希望得到图片的名称、大小、宽高和校验值。那么相应的上传策略各字段分别为:

    scope = 'my-bucket:sunflower.jpg'
    deadline = 1451491200
    returnBody = '{
      "name": $(fname),
      "size": $(fsize),
      "w": $(imageInfo.width),
      "h": $(imageInfo.height),
      "hash": $(etag)
    }'
    
  2. 将上传策略序列化成为JSON格式

    用户可以使用各种语言的JSON库,也可以手工地拼接字符串。
    序列化后,应得到如下形式的字符串(字符串值以外部分不含空格或换行)。

    putPolicy = '{"scope":"my-bucket:sunflower.jpg","deadline":1451491200,"returnBody":"{\"name\":$(fname),\"size\":$(fsize),\"w\":$(imageInfo.width),\"h\":$(imageInfo.height),\"hash\":$(etag)}"}'
    
  3. 对JSON编码的上传策略进行URL安全的Base64编码,得到待签名字符串:

    encodedPutPolicy = urlsafe_base64_encode(putPolicy)
    

    实际值为:

    encodedPutPolicy = "eyJzY29wZSI6Im15LWJ1Y2tldDpzdW5mbG93ZXIuanBnIiwiZGVhZGxpbmUiOjE0NTE0OTEyMDAsInJldHVybkJvZHkiOiJ7XCJuYW1lXCI6JChmbmFtZSksXCJzaXplXCI6JChmc2l6ZSksXCJ3XCI6JChpbWFnZUluZm8ud2lkdGgpLFwiaFwiOiQoaW1hZ2VJbmZvLmhlaWdodCksXCJoYXNoXCI6JChldGFnKX0ifQ=="
    
  4. 使用SecretKey对上一步生成的待签名字符串计算HMAC-SHA1签名:

    sign = hmac_sha1(encodedPutPolicy, "<SecretKey>")
    

    假设SecretKey为’MY_SECRET_KEY’,实际签名为:

    注意:签名结果是二进制数据,此处输出的是每个字节的十六进制表示,以便核对检查。
    sign = "c10e287f2b1e7f547b20a9ebce2aada26ab20ef2"
    
  5. 对签名进行URL安全的Base64编码

    encodedSign = urlsafe_base64_encode(sign)
    

    最终签名值为:

    encodedSign = "wQ4ofysef1R7IKnrziqtomqyDvI="
    
  6. AccessKeyencodedSignencodedPutPolicy:连接起来:

    uploadToken = AccessKey + ':' + encodedSign + ':' + encodedPutPolicy
    

    假设用户的AccessKey为’MY_ACCESS_KEY’,则最后得到的上传凭证应为

    uploadToken = "MY_ACCESS_KEY:wQ4ofysef1R7IKnrziqtomqyDvI=:eyJzY29wZSI6Im15LWJ1Y2tldDpzdW5mbG93ZXIuanBnIiwiZGVhZGxpbmUiOjE0NTE0OTEyMDAsInJldHVybkJvZHkiOiJ7XCJuYW1lXCI6JChmbmFtZSksXCJzaXplXCI6JChmc2l6ZSksXCJ3XCI6JChpbWFnZUluZm8ud2lkdGgpLFwiaFwiOiQoaW1hZ2VJbmZvLmhlaWdodCksXCJoYXNoXCI6JChldGFnKX0ifQ=="
    

附注

  • 为确保客户端、业务服务器和七牛服务器对于授权截止时间的理解保持一致,需要同步校准各自的时钟。频繁返回401状态码时请先检查时钟同步性与生成deadline值的代码逻辑。

代码示例

// TODO: 代码示例goes here.

上传凭证生成器

在线示例

内部参考资源

外部参考资源


如果有任何问题,请进入 七牛云存储问答社区 或者发送 工单 咨询