1.9 Presigned URL

优质
小牛编辑
126浏览
2023-12-01

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阶段

uploadIdpartNumber为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, "");