首页 > 解决方案 > getSignedUrl 通过 aws-sdk 为 putObject 生成的签名不匹配?

问题描述

将 aws-sdk.js 与 NodeJ 一起使用。

生成用于将文件上传 (putObject) 到 AWS 存储桶的签名 URL,以及文件下载 (getObject) 签名 URL。

文件下载 URL 有效,但上传 URL 抛出错误:

<?xml version="1.0" encoding="UTF-8"?>

<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AWSACCESSKEY</AWSAccessKeyId></Error>

JS 为getObject和生成签名 URL putObject

var AWS = require('aws-sdk');
// AWS is configured in .aws and is correct 
const s3 = new AWS.S3();

var params = {
    Bucket: 'upload-bucket',
    Key: 'Account_Info.pdf',
    Expires: 60*60
};

// Upload signedUrl
let putUrl = s3.getSignedUrl('putObject', params);
console.log("Put: ", putUrl);

let p = JSON.parse(JSON.stringify(params));
p.Key= 'Account.pdf';
// download signed Url
let url = s3.getSignedUrl('getObject', p);

下载的签名 URL 工作正常,需要知道 put API 中可能有什么问题。

上传文件的JS代码:

let request = require('request');
var fs = require("fs");

let file = new Buffer(fs.readFileSync('Account_Info.pdf', 'base64'), 'base64');

let url = putUrl; //'something/Account_Info.pdf';
let method = 'PUT';
let qs = {
  'AWSAccessKeyId': 'AWSACCESSKEY',
  'Expires':'1539258230',
  'Signature':'Qbuu9fP6rrmwWDAPQFf%2BE3JiGZo%3D'
};

let formData = {
  file: { value: file,
    options: { filename: 'Account_Info.pdf', contentType: 'pdf' } }
};

let ops = {
  url, method, qs, formData
};

request (ops, (err, res, body) => {
  console.log(err);
  console.log(body);
});

是由于将所有特殊字符转换为它们的 utf-8 表示法而导致的错误,例如 all =变为%2D/变为%2F+变为%2B。然而,尝试将它们转换回实际形式并没有奏效,而且更多似乎不会影响 GET URL。尝试沿 URL 传递 qs 结果没有变化。

浪费了 3 天的时间来弄清楚这里可能出了什么问题。希望 AWS 错误更清楚,并且 AWS 会为文件上传提供更好的文档。

需要任何帮助。

标签: node.jsamazon-web-servicesamazon-s3requestaws-sdk

解决方案


推荐阅读