2016-03-15 47 views
4

我需要使用簽名url將文件上傳到谷歌雲存儲。我需要通過不同的步驟上傳。使用節點js創建預先簽名的url並上傳文件到谷歌雲存儲

  1. 創建使用bucketName,服務密鑰和所需的安全證書的signedUrl。(使用任何的Node.js庫)

  2. 上傳與創建標識的URL使用郵差或RESTClient實現一個單一的文件。

這是我上傳

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); 

創建signedUrl代碼,但我跟郵遞員或其他客戶端

<?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> 

回答

3

只是改變stringPolicy方法把使用時遇到錯誤。並以二進制形式發送圖像。

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); 
相關問題