【问题标题】:s3 pre-signed url Javascript Code not Returning Full urls3 预签名的 url Javascript 代码不返回完整的 url
【发布时间】:2020-08-20 13:54:10
【问题描述】:

我正在尝试为我的 s3 存储桶中的文件生成预签名的 url,这样我网站的用户就不会拥有指向实际文件的链接。我一直在尝试使用以下代码:

const AWS = require('aws-sdk');
const s3 = new AWS.S3()
    AWS.config.update({accessKeyId: 'AKIAVXSBEXAMPLE', secretAccessKey: 'EXAMPLE5ig8MDGZD8p8iTj7t3KEXAMPLE'})

    // Tried with and without this. Since s3 is not region-specific, I don't
    // think it should be necessary.
    AWS.config.update({region: 'eu-west-2'})

    const myBucket = 'bucketexample'
    const myKey = 'example.png'
    const signedUrlExpireSeconds = 60 * 5

    const url = s3.getSignedUrl('getObject', {
        Bucket: myBucket,
        Key: myKey,
        Expires: signedUrlExpireSeconds
    })
    setTimeout(function(){ console.log("url", url); }, 3000);
    console.log("url:", url)

但它返回的只是:“https://s3.amazonaws.com/”

我也尝试过使用此代码:

const AWS = require('aws-sdk');
var s3 = new AWS.S3();
    var params = {Bucket: 'bucketexample', Key: 'example.png'};
    s3.getSignedUrl('putObject', params, function (err, url) {
       console.log('The URL is', url);
    });

不返回任何内容。有谁知道他们为什么不返回有效的网址?

【问题讨论】:

  • 我正在尝试解决同样的问题...如果我发现任何问题,我会通知您。
  • 谢谢,如果有什么发现我会告诉你的。

标签: javascript amazon-s3 pre-signed-url


【解决方案1】:

我也遇到过类似的问题。当 AWS 开发工具包返回 https://s3.amazonaws.com/ 时,这是因为机器没有适当的权限。这可能令人沮丧,我认为 AWS 应该返回描述性错误消息,而不是仅仅返回错误的 url。

我建议您为您的机器配置 AWS 凭证或为其赋予 AWS 角色。尽管您应该能够像在代码 sn-p 中那样通过代码输入您的凭据,但无论出于何种原因,这对我都不起作用。

对我有用的是更新我机器的默认 AWS 凭证或为已部署的服务器添加适当的角色。

【讨论】:

  • 我在浏览器中的 HTML 元素中而不是在机器中执行此操作。这与您的解决方案有什么不同吗?
  • 是的,预签名 URL 需要来自 AWS 的权限。在前端使用凭据会将它们暴露给查看网站代码的任何人,因此这绝对不安全并且您不应该这样做。此外,如果您使用的是 AWS 角色或类似的东西,那么它仍然无法工作,因为 html 和 javascript 代码将在用户的浏览器中运行,而不是具有该角色的实际 AWS 资源。简而言之,您需要在具有正确 AWS 凭证的后端服务器上生成预签名 URL,以便开发工具包正确运行,或者您在 AWS 上设置的正确角色。祝你好运
【解决方案2】:

我遇到了类似的问题,我在使用时得到了不完整的签名 URL:

    let url = await s3.getSignedUrl("getObject", {
  Bucket: bucket,
  Key: s3FileLocation,
  Expires: ttlInSeconds,
});

然后我使用了 Promise 函数:

// 我在里面使用了它和异步函数

让 url = 等待 s3.getSignedUrlPromise("getObject", { 桶:桶, 键:s3FileLocation, 过期:ttlInSeconds, });

它返回了完整的签名 URL。

/** 注意:

如果您在尝试使用签名 URL 访问对象时收到此消息。

    <Error>
<Code>InvalidArgument</Code>
<Message>Requests specifying Server Side Encryption with AWS KMS managed keys require AWS Signature Version 4.</Message>

然后在初始化 s3 时使用它:

const s3 = new AWS.S3({"signatureVersion":"v4"});

【讨论】:

    猜你喜欢
    • 2019-11-19
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多