"Signature Does Not Match" when putting to presigned spaces upload url

October 24, 2017 263 views
DigitalOcean JavaScript Node.js

I am using the aws-sdk in Node.js to generate a presigned putObject upload url for use with DigitalOcean Spaces. The url gets generated just fine, however when I try putting to it using a REST client, I get a SignatureDoesNotMatch error. Below is the code I am using to generate the presigned url (from within a Google Cloud Function):

var AWS = require('aws-sdk');
var s3 = new AWS.S3({params: {Bucket: 'bucket-name'}});

exports.requestUploadUrl = function requestUploadUrl(req, res) {
  var key = 'some-predefined-key';
  s3.getSignedUrl('putObject', {Bucket: 'bucket-name', Key: key}, function (err, url) {

I am getting this sort of response when I try posting to the presigned url:

<?xml version="1.0" encoding="UTF-8" ?>
5 Answers
sam0x17 October 28, 2017
Accepted Answer

So the reason this wasn't working is the content type MUST be specified when generating the presigned URL and specified once again by the client when it connects, and they must exactly match. Once I specified application/octet-stream everything worked

I am also facing the same issue. I need a clarification here, what is the secrete key here ? I am taking keys generated in Personal access tokens as secret key and Spaces access keys as access key id.
"accessKeyId": Spaces access keys,
"secretAccessKey": Personal access tokens

Can you please clarify if I am considering accessKeyId and secretAccessKey properly ?

@anoopg your problem is a bit more simple. The accessKeyId is the name you gave your spaces access key, and the secretAccessKey is simply the value of the key. You don't need to use a personal access token at all for this.

Have another answer? Share your knowledge.