S3, как найти, если объект имеет предварительно подписанный URL? - PullRequest
0 голосов
/ 21 июня 2019

Обучение 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:

1-я попытка:

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

2-я попытка:

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

3-я попытка:

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

и IКороче говоря.Я знаю, что может создать файл или войти в файл при создании заранее заданного URL, но я думаю, что это будет взломать. Есть ли способ в узле, где я могу проверить объект, чтобы увидеть, не создан ли для него заранее заданный URL-адрес? Я не собираюсь делать это на панели инструментов. Я ищу способ сделать это.исключительно в терминале / скрипте.Просматривая теги и опрашивая Google, я не нахожу никакой удачи

Ссылка:

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

Есть ли способ в узле, где я могу проверить объект, чтобы увидеть, есть ли для него созданный предопределенный URL?

Краткий ответ: Нет

Длинный ответ: Нет информации о подписанных URL-адресах, хранящихся на объекте, или о каком-либо списке созданных URL-адресов.Вы даже можете создать подписанный URL-адрес полностью на стороне клиента, не вызывая никакой службы

0 голосов
/ 21 июня 2019

Этот вопрос интересный.Я пытался найти, где хранится заданный URL-адрес, но до сих пор не найден.

Но то, что говорит gusto2, правда, вы можете просто создать заранее заданный URL-адрес без какой-либо службы aws, что и делает 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);
    }
...