node.js - 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.js - Openshift Node.JS 容器,502 bad gateway 错误
- python - Django 错误:apps.get_models() 返回空,无法进行查询或对模型执行任何操作
- ios - 如何通过单击打开带有标准 iOS 画廊的图像?
- amazon-sagemaker - 使用 amazon sagemaker / blazingtext 模型基于词向量反向查找词
- javascript - 如何防止axios请求将对象转换为字符串?
- windows - 在 Windows 中更改 URI 协议处理程序的名称
- asp.net-web-api - OWIN 在 Response 中添加额外的参数
- python - 似乎无法创建与我的菜单功能相关的新标签:/ 有没有更好的方法来构建我的代码或修复?
- c# - 如何设置 CefSharp VS 2017 解决方案以将 cef.redist 和 CefSharp.BrowserSubprocess 复制到 bin 文件夹?
- reactjs - 内联创建道具对象