由aws-sdk的getSignedUrl为putObject生成的签名不匹配?

时间:2018-10-11 11:35:50

标签: node.js amazon-web-services amazon-s3 request aws-sdk

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

生成了用于将文件上传(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为getObjectputObject生成签名URL:

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表示法(例如所有 = 变为%2D / 变为%2F , + 变为%2B 。但是尝试将它们转换回实际格式是行不通的,更多的操作似乎并不影响GET URL。尝试沿URL传递qs,结果不变。

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

需要任何帮助。

0 个答案:

没有答案