S3如何查找对象是否具有预签名URL?

时间:2019-06-21 14:24:18

标签: node.js amazon-web-services url amazon-s3

学习S3,我知道如何生成一个预先签名的URL:

const aws = require('aws-sdk')
const s3 = new aws.S3()
aws.config.update({
  accessKeyId: 'id-omitted', 
  secretAccessKey: 'key-omitted'
})

const myBucket = 'foo'
const myKey = 'bar.png'
const signedUrlExpireSeconds = 60 * 5

const url = s3.getSignedUrl('getObject', {
    Bucket: myBucket,
    Key: myKey,
    Expires: signedUrlExpireSeconds
})

console.log(`Presigned URL: ${url}`)

通过阅读文档,我可以使用headObject来获取存储桶中的内容,但是我已经测试过尝试查找对象是否已经具有预签名的URL:

第一次尝试:

let signedUrl = await s3.validSignedURL('getObject', params).promise()
console.log(`Signed URL: ${signedUrl}`)

第二次尝试:

await s3.getObject(params, (err, data) => {
  if (err) console.log(err)
  return data.Body.toString('utf-8')
})

第三次尝试:

let test = await s3.headObject(params).promise()
console.log(`${test}`)

我要简短了。我知道可以在创建预签名URL时创建文件或登录到文件,但是我认为这可能是一个hack。 Node中是否有一种方法可以检查对象以查看是否为其创建了预签名URL?我不希望在仪表板中执行此操作,而是在寻找一种方法仅在终端/脚本中。浏览标签并查询Google我找不到运气

参考:

2 个答案:

答案 0 :(得分:3)

  

Node中是否可以检查对象以查看是否为它创建了预签名URL?

简短答案:否

长答案:没有有关存储在对象上的已签名URL或任何已创建URL列表的信息。您甚至可以完全在客户端上创建签名的URL,而无需调用任何服务

答案 1 :(得分:0)

这个问题很有趣。我试图找到某个地方是否存储了预签名的URL,但仍然找不到。

但是gusto2所说的是正确的,您可以创建一个没有任何aws服务的预签名URL,这正是aws-sdk所做的。

检查此文件:https://github.com/aws/aws-sdk-js/blob/cc29728c1c4178969ebabe3bbe6b6f3159436394/ts/cloudfront.ts

然后您将获得如何生成预签名URL:

var getRtmpUrl = function (rtmpUrl) {
    var parsed = url.parse(rtmpUrl);
    return parsed.path.replace(/^\//, '') + (parsed.hash || '');
};

var getResource = function (url) {
    switch (determineScheme(url)) {
        case 'http':
        case 'https':
            return url;
        case 'rtmp':
            return getRtmpUrl(url);
        default:
            throw new Error('Invalid URI scheme. Scheme must be one of'
                + ' http, https, or rtmp');
    }
};


getSignedUrl: function (options, cb) {
        try {
            var resource = getResource(options.url);
        } catch (err) {
            return handleError(err, cb);
        }

        var parsedUrl = url.parse(options.url, true),
            signatureHash = Object.prototype.hasOwnProperty.call(options, 'policy')
                ? signWithCustomPolicy(options.policy, this.keyPairId, this.privateKey)
                : signWithCannedPolicy(resource, options.expires, this.keyPairId, this.privateKey);

        parsedUrl.search = null;
        for (var key in signatureHash) {
            if (Object.prototype.hasOwnProperty.call(signatureHash, key)) {
                parsedUrl.query[key] = signatureHash[key];
            }
        }

        try {
            var signedUrl = determineScheme(options.url) === 'rtmp'
                    ? getRtmpUrl(url.format(parsedUrl))
                    : url.format(parsedUrl);
        } catch (err) {
            return handleError(err, cb);
        }

        return handleSuccess(signedUrl, cb);
    }