安全机制 > 上传凭证 |
客户端上传前需要先从服务端获取上传凭证,并在上传资源时将上传凭证作为请求内容的一部分。不带凭证或带非法凭证的请求将返回 HTTP 错误码 401,代表认证失败。 生成上传凭证时需要指定以下要素:
算法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.使用访问密钥(AK/SK)对上一步生成的待签名字符串计算HMAC-SHA1签名: sign = hmac_sha1(encodedPutPolicy, "<SecretKey>") #假设 SecretKey 为 MY_SECRET_KEY,实际签名为: sign = "c10e287f2b1e7f547b20a9ebce2aada26ab20ef2" 注意:签名结果是二进制数据,此处输出的是每个字节的十六进制表示,以便核对检查。 5.对签名进行URL安全的Base64编码: encodedSign = urlsafe_base64_encode(sign) #最终签名值为: encodedSign = "wQ4ofysef1R7IKnrziqtomqyDvI=" 6.将访问密钥(AK/SK)、encodedSign 和 encodedPutPolicy 用英文符号 : 连接起来: uploadToken = AccessKey + ':' + encodedSign + ':' + encodedPutPolicy #假设用户的 AccessKey 为 MY_ACCESS_KEY ,则最后得到的上传凭证应为: uploadToken="MY_ACCESS_KEY:wQ4ofysef1R7IKnrziqtomqyDvI=:eyJzY29wZSI6Im15LWJ1Y2tldDpzdW5mbG93ZXIuanBnIiwiZGVhZGxpbmUiOjE0NTE0OTEyMDAsInJldHVybkJvZHkiOiJ7XCJuYW1lXCI6JChmbmFtZSksXCJzaXplXCI6JChmc2l6ZSksXCJ3XCI6JChpbWFnZUluZm8ud2lkdGgpLFwiaFwiOiQoaW1hZ2VJbmZvLmhlaWdodCksXCJoYXNoXCI6JChldGFnKX0ifQ==" 注意:为确保客户端、业务服务器和互站云服务器对于授权截止时间的理解保持一致,需要同步校准各自的时钟。频繁返回 401 状态码时请先检查时钟同步性与生成 deadline 值的代码逻辑。 |