学习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我找不到运气
参考:
答案 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);
}