1.9 Presigned URL
Presigned url
访问FDS上非public的Bucket/Object需要认证信息。将签名信息预期计算好放在URL的query parameter中,这样在访问Bucket/Object的时候就不需要提供额外的认证信息了。举个例子,如果开发者想把某个Object分享给别人,但不想把Object设置成Public的,则可以使用presigned url。
使用Presigned url和普通url访问FDS的区别在于签名信息的位置,其它地方没有任何区别。
Presigned url参数:
参数名称 | 描述 |
---|---|
GalaxyAccessKeyId | 用户产生签名的Access Key,server端会用这个key对签名信息进行验证 |
Expires | 过期时间,是一个unix timestamp,超过这个时间后这个presigned url会失效 |
Signature | 用FDS签名算法计算出来的签名,签名计算方法请参考签名认证 |
Note
- 下载用的presigned url需要使用用GET方法生成,上传用的presigned url需要使用PUT/POST方法生成。
- 可以使用SDK中的generatePresignedUrl生成presigned url。
Presigned url分片上传示例
使用presigned url分片上传与常规分片上传一样,都有三个阶段(Init, Upload, Complete)。下面对这三个阶段分别做简单的介绍。
Init阶段
以uploads为SubResource生成presigned url,然后通过生成的url获取uploadId(uploadId在response中)。下面为一个该阶段生成的presigned url例子:
http://files.fds.api.xiaomi.com/zjbtest/mp-test?uploads&GalaxyAccessKeyId=5631729037601&Expires=61407043200000&Signature=ucr9WLlD9NWedMGj7rK2eSVc+OM=
Upload阶段
以uploadId和partNumber为SubResource生成presigned url,然后通过生成的url上传分片,partNumber从1开始依次递增,数据放在http body中。下面为一个该阶段生成的presigned url例子:
http://files.fds.api.xiaomi.com/zjbtest/mp-test?uploadId=c5eaecc9-c8fc-48d9-85b4-6dc8706a1f16&partNumber=1&GalaxyAccessKeyId=5631729037601&Expires=61407043200000&Signature=CJiuC0aR8Lj2Y/itExFBHWjvmUE=
Complete阶段
以uploadId为SubResource生成presigned url,然后通过生成的url结束上传。Request body为json格式的Upload Part返回的UploadPartResult列表。具体信息请参考分片上传过程解释。下面为一个该阶段生成的presigned url例子:
http://files.fds.api.xiaomi.com/zjbtest/mp-test?uploadId=c5eaecc9-c8fc-48d9-85b4-6dc8706a1f16&GalaxyAccessKeyId=5631729037601&Expires=61407043200000&Signature=vS+vaEMBSMP4LFQwrsP+BCHMguw=
Note: 有些工具在发http请求时会加上content-type,如果生成presigned url的时候没有指定content-type,则需要在上传的时候显示将content-type设置为空。例如:curl -H "Content-Type:"。
生成预签名需要填写对应Method、SubResource、ContentType,SubResource用来控制这个url签出后所带的参数,当要用于分片上出传初始化时,填写uploads
,此外如果想通过预签名上传object,同时设置object为public,填写cannedAcl=PUBLIC_READ
。 以Java sdk为例:
generatePresignedUri(BUCKET_NAME, OBJECT_NAME, Arrays.asList("cannedAcl=" + CannedAcl.PUBLIC_READ.name()), new Date(System.currentTimeMillis() + 1000000), HttpMethod.PUT, "");