代码之家  ›  专栏  ›  技术社区  ›  Faizuddin Mohammed

无法使用预签名的URL将文件上载到S3。错误:签名不匹配

  •  0
  • Faizuddin Mohammed  · 技术社区  · 7 年前

    如何使用签名的URL将文件上载到S3?

    我尝试了以下方法:

      const AWS = require('aws-sdk');
      const s3 = new AWS.S3({ accessKeyId: "", secretAccessKey: "" });
    
      const url = s3.getSignedUrl("putObject", {
        Bucket: "SomeBucketHere",
        Key: "SomeNameHere",
        ContentType: "binary/octet-stream",
        Expires: 600
      });
    

    SignatureDoesNotMatch 错误。

    1. 上面代码中的URL的PUT方法
    2. 正文: binary (单选按钮),选择文件,选择要上载的文件
    3. 点击发送

    我可以确认IAM权限不是这里的问题。我可以完全接触水桶。

    怎么了?我如何测试我的签名网址?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Faizuddin Mohammed    7 年前

    这个问题曾经给我带来很多痛苦。

    我只需要在邮递员请求中添加一个标题。

    Content-Type = binary/octet-stream

    一旦我改变了这个,文件上传成功。

        2
  •  0
  •   Fábio Albuquerque    7 年前

    不知道是否有任何帮助,但我相信你需要传递签名版本。

    在python中,您可以看到如下内容:

    import boto3 as boto3
    from botocore.client import Config
    
    ...
    
    s3_client = boto3.client('s3', config=Config(signature_version='s3v4'))
    url = s3_client.generate_presigned_url(
                ClientMethod='put_object',
                Params={
                    'Bucket': bucket,
                    'Key': key,
                },
                ExpiresIn=60
            )
    print url
    

    因此,Javascript中的等价物是:

    var AWS = require('aws-sdk');
    var s3 = new AWS.S3({
      signatureVersion: 'v4',
    });
    
    
    exports.handler = (event, context, callback) => {
      const url = s3.getSignedUrl('putObject', {
        Bucket: '**\[YOUR-S3-BUCKET\]**',
        Key: 'mykey',
        Expires: 10,
      });
    
    
      callback(null, url);
    };
    

    Presigned URL for S3 Bucket Expires Before Specified Expiration Time

    Using pre-signed URLs to upload a file to a private S3 bucket