基于临时授权方式的OSS上传

基于临时授权方式的OSS上传

OSS支持临时授权URL,可以实现临时性的上传和下载,此处介绍一下如何在项目中使用。
对应场景:客户端需要上传文件,但不想或不方便将accessKeyId和accessKeySecret下发到客户端,或者无法继承OSS-SDK的情况。
具体上传仍旧是客户端与OSS服务器之间直接进行.
应用的理论核心是OSS提供的”在URL中包含签名”,参考这里

实现思路:

Created with Raphaël 2.1.2 客户端 客户端 业务服务器 业务服务器 OSS服务器 OSS服务器 [A]获取用于上传的临时URL [B]调用OSS-SDK生成临时URL [C]返回临时URL [D]使用临时URL上传文件 [E]返回上传结果

代码实现

  • [A] 客户端向业务服务器发送获取上传地址的请求,一般是POST请求,向服务器发送要上传的文件信息(如文件名)
  • [B] 业务服务器收到对应请求后对用户身份做验证,通过后调用OSS-SDK或者手动生成对应的临时URL.
    NodeJS下可以用以下代码生成: (业务服务器端)
var client = new OSS({
    endpoint: configInfo.OSS_ENDPOINT,
    accessKeyId: configInfo.OSS_KEY,
    accessKeySecret: configInfo.OSS_SECERT,
    bucket: configInfo.OSS_BUCKET
});
function getTempSignedUrl(ossObjectPath,type){
  var url = client.signatureUrl(ossObjectPath, {
    expires: 60, //过期时间,这里设置为短期的60s
    method: 'PUT', //由于是上传,此处填写PUT; 如果是下载的话,为GET
    'content-type': type||'application/octet-stream' //conent类型,默认为octet-stream
  });
  console.log(url);
  return url;
}
  • [C] 业务服务器将生成好的url返回客户端,也就是刚刚的POST请求的响应.
  • [D] 客户端根据临时URL进行上传
    web浏览器里面可以使用下面代码实现上传:(浏览器端)
function putfileToOSS(url, domId, contentType) {
        var f = document.getElementById(domId); //input file控件
        var uploadReq = new Request(url, { //url为服务器接口URL
            method: "PUT",
            headers: new Headers({ 'Content-Type': contentType||'application/octet-stream' }),
            body: f.files[0]  //仅支持单个文件,取第一个
        });
        return fetch(uploadReq).then(x => x.text()).then(x => {
            console.log(x); //此处假定响应信息是text
            return x;
        });
    }
  • [E] OSS服务器返回上传结果,200为成功,其他为失败,常见的有403(过期或权限有误)等,具体信息参考OSS相关文档.

风险

临时URL有被泄露的可能性,请注意在业务层面做好安全保障,避免无意或有意泄露.
同样,临时URL的有效期不宜太长,时间过长该风险会变大.
可以通过制定content-type的方式进一步减少该风险.

待改进

要求更严格的情况下,可以在上述功能的基础上增加文件MD5的传递,也就是根据待上传文件的MD5生成临时URL,这样会对客户端有一定的要求,但安全性更高.(此种方案OSS支持)


你可能感兴趣的:(杂项,JavaScript)