在 AWS JavaScript SDK 中设置签名

Set signature in AWS JavaScript SDK

是否可以在使用 AWS JavaScript SDK 发出 AWS 请求时手动设置签名?我想将文件直接上传到 S3,但我不想让我的密钥以纯文本形式提供给客户端。所有官方示例都要求您对密钥和秘密进行硬编码(同时明确告诉您不要这样做)。我正在计算签名服务器端,但我还没有找到将该签名导入 SDK 的方法。

为此,我最终选择了使用 AWS STS 的另一条路线。但是,如果你确实想做这样的事情,这里是解决方案:

使用 AWS JavaScript SDK,您可以在 AWS.Request object 上订阅 "Request Building Events"。这些事件(validatebuildsign)将允许您在请求被执行之前访问和修改请求状态(headers、body 等)发送。大多数调用将 return 一个 AWS.Request 实例(S3 的 .upload 除外)。

这是一个例子:

var request = s3.putObject({
  Bucket: 'MyBucket',
  Key: file.name,
  ContentType: file.contentType,
  Body: file
});

request.on('sign', function() {
  request.httpHeaders.Authorization = 'AWS Signature';
});

request.send(function(err, data) {
  // Do something here
});

我认为这里的技巧是在创建请求时不指定回调(在我的示例中为 .putObject)并使用 .send 方法发起请求。

文档:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Request.html