在生成S3预先签名的网址之前,为什么我们不需要通过AWS进行身份验证?

时间:2017-10-22 10:50:10

标签: amazon-web-services amazon-s3 aws-sdk

我刚写了一个小函数,调用它时会返回我的S3存储桶的预签名网址。它看起来像这样:

import AWS from 'aws-sdk';

AWS.config.update({
  accessKeyId: 'process.env.AWS_S3_KEY',
  secretAccessKey: 'process.env.AWS_S3_SECRET'
});

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

export const s3Auth = (req, res) => {
  s3.getSignedUrl(
    'putObject',
    {
      Bucket: 'mybucket',
      Key: 'mykey',
      Expires: 60
    },
    (error, url) => {
      if (!error && url) {
        res.send({
          url
        });
      } else {
        res.status(500);
        res.send({ error: 'AWS error!' });
        throw error;
      }
    }
  );
};

在第三行,我设置了我的AWS凭据。问题是,我尝试将该部分( AWS.config.update)注释掉,它仍然为我生成预签名密钥!知道为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

生成预签名URL的行为实际上并不需要调用AWS。它只是使用请求的详细信息(例如存储桶和对象名称)与密钥一起签署请求。

该URL实际上将包含将用于获取对象访问权限的IAM实体的​​访问密钥,其签名充当URL有效的验证

如果您的预先签名的URL中出现了访问密钥,则它会从某个位置获取访问密钥 - 在凭证文件,环境变量或分配给服务器的IAM角色中。

答案 1 :(得分:2)

这意味着您在其他地方定义了另一组凭据。最有可能的是:

  1. 您的环境中已定义AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY
  2. 您的主文件夹中的.aws/credentials中有凭据存储。
  3. 您正在从Lambda或EC2运行此代码,该代码具有附加了所需权限的角色。
  4. 查看http://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/configuring-the-jssdk.html

    的所有可能性