如何为前缀创建S3读取策略?

时间:2015-07-21 13:09:11

标签: amazon-s3

我知道如何为唯一的S3密钥签署策略,但是是否可以创建允许从/project/1234/*读取所有文件(我不是在讨论列出对象)的读取策略 - 所以它应该允许阅读前缀为/project/1234的所有文件。

要签署单个密钥,我使用以下代码(在某些lib中找到):

this.readPolicy = function(key, bucket, duration, download, cb) {
        var dateObj = new Date;
        var expiration = new Date(dateObj.getTime() + duration * 1000);
        expiration = Math.round(expiration.getTime() / 1000);

        var policy = 'GET\n\n\n' + expiration + '\n';
        policy += '/' + bucket + '/' + key;
        if (download) {
            policy += '?response-content-disposition=attachment;filename=' + encodeURIComponent(download);
        }

        var signature = crypto.createHmac("sha1", this.secretKey).update(policy);

        var url = 'https://s3.amazonaws.com/';
        url += bucket + '/';
        url += key;
        url += '?AWSAccessKeyId=' + this.accessKey;
        url += '&Expires=' + expiration;
        url += '&Signature=' + encodeURIComponent(signature.digest("base64"));
        if (download) {
            url += '&response-content-disposition=attachment;filename=' + encodeURIComponent(download);
        }
        if (cb) {
            cb(null, url);
        } else {
            return url;
        }
    };

1 个答案:

答案 0 :(得分:1)

该代码的作者实际上滥用了“#34; policy”这个词。"这是使用签名版本2的签名请求

签名的S3下载不支持策略文档。它们仅用于基于浏览器的POST上传。预先签署GET(或HEAD)请求的网址的唯一方法是签署特定对象的请求。