创build一个预先签名的url,并使用节点js将file upload到谷歌云存储

我需要使用签名的url上传文件到谷歌云存储。 我需要通过不同的步骤上传。

  1. 使用bucketName,服务密钥和需要的安全证书创buildsignedUrl(使用任何node.js库)

  2. 使用邮递员或restClient上传带有创build的签名url的单个文件。

这是我创buildsignedUrl上传的代码

var crypto = require("crypto"); var fs = require("fs"); var URL_VALID_DURATION = 1000 * 120;//for 120 seconds var expiry = Math.floor(((new Date).getTime() + URL_VALID_DURATION) / 1000); var key = 'filename'; var bucketName = 'bucketName'; var accessId = 'gserviceaccount.com'; var stringPolicy = "POST\n" + "\n" + "\n" + expiry + "\n" + '/' + bucketName + '/' + key; var base64Policy = Buffer(stringPolicy, "utf-8").toString("base64"); var privateKey = fs.readFileSync("google-services-private-key.pem", "utf8"); var signature = encodeURIComponent(crypto.createSign('sha256').update(stringPolicy).sign(privateKey, "base64")); var signedUrl = "https://" + bucketName + ".commondatastorage.googleapis.com/" + key + "?GoogleAccessId=" + accessId + "&Expires=" + expiry + "&Signature=" + signature; console.log(signedUrl); 

但是,当我与邮差或rest客户端使用时,我得到了错误

 <?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 Google secret key and signing method.</Message> <StringToSign>PUT multipart/form-data 1458024549 /bucketName/fileName</StringToSign> </Error> 

刚把stringPolicy方法改成了PUT。 并以二进制forms发送图像。

 var crypto = require("crypto"); var fs = require("fs"); var URL_VALID_DURATION = 1000 * 120;//for 120 seconds var expiry = Math.floor(((new Date).getTime() + URL_VALID_DURATION) / 1000); var key = 'filename'; var bucketName = 'bucketName'; var accessId = 'gserviceaccount.com'; var stringPolicy = "PUT\n" + "\n" + "\n" + expiry + "\n" + '/' + bucketName + '/' + key; var base64Policy = Buffer(stringPolicy, "utf-8").toString("base64"); var privateKey = fs.readFileSync("google-services-private-key.pem", "utf8"); var signature = encodeURIComponent(crypto.createSign('sha256').update(stringPolicy).sign(privateKey, "base64")); var signedUrl = "https://" + bucketName + ".commondatastorage.googleapis.com/" + key + "?GoogleAccessId=" + accessId + "&Expires=" + expiry + "&Signature=" + signature; console.log(signedUrl);